还记得我们在代理 Activity 模式里谈到启动插件 APK 里的 Activity 的两个难题吗,由于插件里的 Activity 没在主项目的 Manifest 里面注册,所以无法经历系统 Framework 层级的一系列初始化过程,最终导致获得的 Activity 实例并没有生命周期和无法使用 res 资源。
使用代理 Activity 能够解决这两个问题,但是有一些限制:
- 实际运行的 Activity 实例其实都是 ProxyActivity,并不是真正想要启动的 Activity;
- ProxyActivity 只能指定一种 LaunchMode,所以插件里的 Activity 无法自定义 LaunchMode;
- 不支持静态注册的 BroadcastReceiver;
- 往往不是所有的 APK 都可作为插件被加载,插件项目需要依赖特定的框架,还有需要遵循一定的 “开发规范”;
特别是最后一个,无法直接把一个普通的 APK 作为插件使用。这个其实也不算是限制,如果我们需要进行插件化开发,我们总希望能够通过一些框架限制和规范插件的行为,在加载插件前就知道插件大概有哪些功能,这样不仅能方便对插件行为的控制,还能在一定程度上确保插件的安全(运行一个完全未知的可执行文件鬼知道它会做些什么)。不过这样做就要求插件必须依赖特定的框架,这对插件是一种侵入式开发,也就是说,开发插件时不能像开发普通 APP 那样自由。
那么有办法避开这些限制,做到完全非侵入式开发吗?比如,通过动态加载框架,不用安装就直接运行《Flappy Bird》的 APK 安装包。这听起来好像是只有获得 ROOT 权限才能做到的事情,要不然随便写个空壳的 APK 加载别人的游戏安装包就直接能运行了。不过,确实有人做到了,通过动态生成 Activity 类的方式。
阅读全文