Android Dynamic-Load-Apk 源码解析

0x00

趁着今天是周末,无所事事,来讲讲 Dynamic-Load-Apk 框架。Dynamic-Load-Apk 是任主席主导开发的一款插件化框架,其中心思想主要就是两个字——代理。和我之前分析的 android-pluginmgr 插件化框架不同的是,Dynamic-Load-Apk 框架完全基于在应用层上实现,并不依靠 ActivityThread 、Instrumentation 等。另外,Dynamic-Load-Apk 框架在插件化发展历程中诞生较早,对后来不断涌现的插件化框架具有深刻的指导意义。

阅读更多

Android 插件化框架 android-pluginmgr 解析

0x00 前言:插件化的介绍

所谓的插件化就是下载 apk 到指定目录,不需要安装该 apk ,就能利用某个已安装的 apk (即“宿主”)调用起该未安装 apk 中的 Activity 、Service 等组件(即“插件”)。

Android 插件化的发展到目前为止也有一段时间了,从一开始任主席的 dynamic-load-apk 到今天要分析的 android-pluginmgr 再到360的 DroidPlugin ,也代表着插件化的思想从顶部的应用层向下到 Framework 层渗入。最早插件化的思想是 dynamic-load-apk 实现的, dynamic-load-apk 在“宿主” ProxyActivity 的生命周期中利用接口回调了“插件” PluginActivity 的“生命周期”,以此来间接实现 PluginActivity 的“生命周期”。也就是说,其实插件中的 “PluginActivity” 并不具有真正 Activity 的性质,实质就是一个普通类,只是利用接口回调了类中的生命周期方法而已。比接口回调更好的方案就是利用 ActivityThread 、Instrumentation 等去动态地 Hook 即将创建的 ProxyActivity ,也就是说表面上创建的是 ProxyActivity ,其实实际上是创建了 PluginActivity 。这种思想相比于 dynamic-load-apk 而言,插件中 Activity 已经是实质上的 Activity ,具备了生命周期方法。今天我们要解析的 android-pluginmgr 插件化框架就是基于这种思想的。最后就是像 DroidPlugin 这种插件化框架,改动了 ActivityManagerService 、 PackageManagerService 等 Android 源码,以此来实现插件化。总之,并没有哪种插件化框架是最好的,一切都是要根据自身实际情况而决定的。

阅读更多

Android 日夜间模式实现的探讨

0x0001

关于 Android 的日间/夜间模式切换相信大家在平时使用 APP 的过程中都遇到过,比如知乎、简书中就有相关的模式切换。实现日间/夜间模式切换的方案也有许多种,趁着今天有空来讲一下日间/夜间模式切换的几种实现方案,也可以做一个横向的对比来看看哪种方案最好。

在本篇文章中给出了三种实现日间/夜间模式切换的方案:

  1. 使用 setTheme 的方法让 Activity 重新设置主题;
  2. 设置 Android Support Library 中的 UiMode 来支持日间/夜间模式的切换;
阅读更多

Android 《Android开发艺术探索》笔记二

第八章:理解Window和WindowManager

8.1 Window和WindowManager

Window是抽象类,具体实现是PhoneWindow,通过WindowManager就可以创建Window。WindowManager是外界访问Window的入口,但是Window的具体实现是在WindowManagerService中,WindowManager和WindowManagerService的交互是一个IPC过程。所有的视图例如Activity、Dialog、Toast都是附加在Window上的。因此,Window是实际上View的直接管理者。

阅读更多

Android AIDL 分析

前言

在 Android 系统中,进程间通信 (IPC) 是一种很重要的机制。IPC 产生的原因是某些情况下需要在两个进程之间进行一些数据的交换。而在深入学习 Android 的过程中难免会遇到 IPC 的相关问题,比如常见的有在自己的应用程序中读取手机联系人的信息,这就涉及到 IPC 了。因为自己的应用程序是一个进程,通讯录也是一个进程,只不过获取通讯录的数据信息是通过 Content Provider 的方式来实现的。

对于初学者来说,在一开始接触 IPC 时可能会摸不着头脑,因为网上很多博客在讲 Android IPC 时通常都是长篇大论,没有从例子着手。基于以上种种原因以及希望对 AIDL 有一个更深入的理解,本篇博文就诞生了。在 Android 系统中,IPC 的方式有很多种,比如有 Messenger 、AIDL 和 ContentProvider 等。我们今天就来讲讲其中的 AIDL ,AIDL 也是比较常见和经常使用的一种 IPC 方式。

阅读更多

Android 实现滑动返回效果

前言

在如今 app 泛滥的年代里,越来越多的开发者注重用户体验这个方面了。其中,有很多的 app 都有一种功能,那就是滑动返回。比如知乎、百度贴吧等,用户在使用这一类的 app 都可以滑动返回上一个页面。不得不说这个设计很赞,是不是心动了呢?那就继续往下看吧!

在GitHub上有实现该效果的开源库 SwipeBackLayout ,可以看到该库发展得已经非常成熟了。仔细看源码你会惊奇地发现其中的奥秘,没错,正是借助了 ViewDragHelper 来实现滑动返回的效果。ViewDragHelper 我想不必多说了,在我的博客中有很多的效果都是通过它来实现的。那么,下面我们就使用 ViewDragHelper 来实现这个效果吧。

阅读更多

Android CursorAdapter 中的 filter 机制

CursorAdapter 类

首先我们来看一下 CursorAdapter 的继承以及实现关系:

1
2
3
public abstract class CursorAdapter extends BaseAdapter implements Filterable, CursorFilter.CursorFilterClient {

}
阅读更多

Android M 的运行时权限处理

之前有人在 Android 6.0 的机型上运行了 DragGridView 结果出异常奔溃了。想必问题的原因大家都知道,是 Android 6.0 新引入了在运行时权限申请(Runtime Permissions)的功能。那么这所谓的运行时申请权限究竟是怎么一回事呢,一起来看看吧!

在 Android 6.0 中,app 如果想要获得某些权限,会在应用中弹出一个对话框,让用户确认是否授予该权限。具体的截图如下:

Runtime Permissions screenshot

阅读更多

Android 九宫格解锁

前言

在平常使用手机的过程中,九宫格解锁是我们经常接触到的。常见的比如有锁屏中的九宫格,还有支付宝中的九宫格等。因为九宫格可以保护用户的隐私,所以它的应用面很广泛。那么今天我们就来自定义一个属于自己的九宫格吧!

首先我们来分析一下实现九宫格解锁的思路:当用户的手指触摸到某一个点时,先判断该点是否在九宫格的某一格范围之内,若在范围内,则该格变成选中的状态;之后用户手指滑动的时候,以该格的圆心为中心,用户手指为终点,两点连线。最后当用户手指抬起时,判断划过的九宫格密码是否和原先的密码匹配。

大致的思路流程就是上面这样的了,下面我们可以来实践一下。

阅读更多