文章目录
Android 插件化系列文章目录
一、插件包 Activity 启动原理
二、需要反射的相关类
1、Instrumentation
2、IActivityManager
3、ActivityManager
4、Singleton
三、动态代理类
四、使用动态代理替换 IActivityManagerSingleton 的 mInstance 成员
1、通过反射获取 IActivityManagerInterface 接口
2、动态代理
3、替换 mInstance 成员
4、代码示例
五、完整代码
六、博客资源
一、插件包 Activity 启动原理
使用动态代理 , 替换 android.app.ActivityManager 中的 private static final Singleton IActivityManagerSingleton 成员的 mInstance 成员 ;
注意 : 该操作一定要在 AMS 启动之前将原来的 Intent 替换掉 , 使用占坑的 Activity 替换插件包中的 Activity , 之后 AMS 执行完毕 , 执行到主线程 实例化 Activity 对象之前 , 还要替换回去 ;
插件包组件启动方式 : 使用 Intent 启动插件包时 , 一般都使用隐式启动 ; 调用 Intent 的 setComponent , 通过包名和类名创建 Component , 这样操作 , 即使没有获得 Activity 引用 , 也不会报错
该插件包中的 Activity 没有在 “宿主” 应用中注册 , 因此启动报错 ;
AMS 会干掉没有注册过的 Activity , 这里先 在启动 AMS 之前 , 设置一个已经 注册过的 占坑 Activity ( StubActivity ) 执行启动流程 , 在主线程生成 Activity 实例对象时 , 还需要恢复插件包中的 Activity
二、需要反射的相关类
1、Instrumentation
在 Instrumentation 中的 execStartActivity 方法 , 最终调用 ActivityManager.getService() 的 startActivity 方法 , 其中传入的参数就有 Intent , 这里我们需要将该 Intent 替换掉 ;
public class Instrumentation { public ActivityResult execStartActivity( Context who, IBinder contextThread, IBinder token, Activity target, Intent intent, int requestCode, Bundle options) { try { int result = ActivityManager.getService() .startActivity(whoThread, who.getBasePackageName(), intent, intent.resolveTypeIfNeeded(who.getContentResolver()), token, target != null ? target.mEmbeddedID : null, requestCode, 0, null, options); } catch (RemoteException e) { } return null; } }
2、IActivityManager
IActivityManager 是接口 , 由 IActivityManager.aidl 生成 ;
源码路径 : /frameworks/base/core/java/android/app/IActivityManager.aidl
3、ActivityManager
要替换的是 ActivityManager 中的 Singleton<IActivityManager> IActivityManagerSingleton 成员的 mInstance 成员 ;
public class ActivityManager { /** * @hide */ public static IActivityManager getService() { return IActivityManagerSingleton.get(); } private static final Singleton<IActivityManager> IActivityManagerSingleton = new Singleton<IActivityManager>() { @Override protected IActivityManager create() { final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE); final IActivityManager am = IActivityManager.Stub.asInterface(b); return am; } }; }
源码路径 : /frameworks/base/core/java/android/app/ActivityManager.java
4、Singleton
Singleton 类是单例的实现 , 注意该类只能由系统使用 , 应用开发者不能调用 ;
package android.util; /** * Singleton helper class for lazily initialization. * * Modeled after frameworks/base/include/utils/Singleton.h * * @hide */ public abstract class Singleton<T> { private T mInstance; protected abstract T create(); public final T get() { synchronized (this) { if (mInstance == null) { mInstance = create(); } return mInstance; } } }
源码路径 : /frameworks/base/core/java/android/util/Singleton.java