打算从以上四个模块对replugin进行拆解阅读
RePlugin的思想是Hook ClassLoader, 因此接下来就围绕ClassLoader进行分析
一、流程总结
1.1 插件的安装
RePlugin插件的安装并不会真正的处理插件APK中的dex、so库、资源等, 只是将插件移动到需要的位置, 这个位置默认是宿主的context.getFilesDir(), 然后将插件信息包装成Plugin对象并绑定宿主的Context、宿主ClassLoader、负责和宿主通信的PluginContextImpl类, 最后将Plugin对象存入插件管理进程统一管理.
1.2 内置插件
内置插件的安装是在初始化时就自动安装和加载了
1.3 外置插件
外置插件的安装需要调用Replugin.install()方法来安装插件, 这个过程和内置插件类似, 区别就是内置插件是通过assets目录下的json文件来生成插件对象, 外置插件则是通过获取插件apk的PackageInfo来生成插件对象, 但是并不会处理apk中的dex、so库、资源等, 只有当真正使用这个插件中的类时才会去真正的解析加载这个插件
1.4 replugin-host-gradle
1.5 replugin-host-library
这个库是由主程序依赖的, 也是RePlugin的核心, 它的主要职责是初始化Replugin的整体框架, 整体框架使用了Binder机制来实现多进程直接的沟通和数据共享, 或者说是插件之间和宿主之间沟通和数据共享, hook住ClassLoader, 加载插件、启动插件、多插件的管理全部都由这个库辅助
1.6 replugin-plugin-gradle
这个是插件工程使用的gradle插件, 这个库使用了Transform API和Javassist实现了编译期间动态修改字节码文件, 主要是替换插件工程中的Activity的继承全部替换成Replugin库中定义的XXXActivity, 动态的将插件APK中调用LocalBroadcastManager的地方修改为Replugin中的PluginLocalBroadcastManager调用, 动态修改ContentResolver和ContentProvider的调用修改成Replugin调用, 动态的修改插件工程中所有调用Resource.getIdentifier方法的地方, 将第三个参数修改为插件工程的包名
1.7 replugin-plugin-library
这个库是由插件工程依赖的, 这个库的主要目的是通过反射的方式来使主程序中接口和功能, 这个库在主程序加载插件apk后悔进行初始化.
二、RePluginClassLoader初始化
2.1 ClassLoader
Android系统默认三个ClassLoader
Replugin提供了两个ClassLoader
宿主APP中的ClassLoader, 加载应用内部的Activity
加载插件的Loader.
2.2 RePluginApplication初始化
2.3 PatchClassLoaderUtils.patch
2.4 创建RePluginClassLoader
三、下载插件
方法调用链
3.1 Replugin.intall
3.2 MP.pluginDownloaded
3.3 PmHostSvc
3.4 PluginManagerServer.intallLocked
四、加载插件
方法调用链
3.1 Replugin.startActivity
3.2 PluginLibraryInternalProxy.startActivity
3.3 PluginCommImpl.loadPluginActivity
3.4 PluginProcessPer.allocActivityContainer
到此这篇越狱源搭建源码(越狱源在线 工具箱)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/bcyy/62323.html