早期的我搞了一个插件测试工程,但是仅仅只是加载一个apk而已!加载了apk,然后load一个class,完事了new一个接口对象,完事了就可以调用这个接口对象的约定好的各种方法。离插件化还远着了。。
插件化,一个是动态加载资源,动态启动页面(非安装apk的情况下),进一步还可以做热修复。。。插件化的方案也是随着技术的变化逐渐从第一代进化到当前。。腾讯最近不也发布了一个href="https://www.baidu.com/link?url=s_Uq7jtN9_eEztRIqz10QY2Zo2HmqGNoxp2iT9aWA3Dkrw1RIH5giFwV4MuQ2S_lVcFr4Rqk_TqDbDTw3-BMSk8dgVJQ5i9Vs4wEODn3t9C&wd=&eqid=a384f28f00140376000000065da0551a">腾讯新开源的插件化框架 Shadow ...零反射全动态Android插件框架正式开源 。不过应该还没有怎么经过大众检测,所以喜欢的小伙伴或者可以等等。
相关介绍文章也很多。。可以去看看。对于我们刚入门的话,目前只能多接触下这些理论,源码看着可能很费劲。。不急。。。
我的方式就是先照着实践下,熟悉下基础知识。比如反射,代理,apk加载,资源加载这些。。。往后还有Hook技术(目前好像推荐Hook)。 只有了解这些,然后才能去跟的动源码,如果想要自己写,擦,我估计得对Activity、Service这些的启动流程必须熟悉,不然你根本不知道去哪个环节Hook,Hook哪些东西。。。
我一开始反正Hook都不知道的。。。哎。老火。。。完事了我照着实践过程,也是折腾了快两天,主要是就是AppCompatActivity布局增加id就崩溃的问题。。。最后我只能先暂时将代理的Activity继承改成Activity,才能保证运行没问题。。至于如何搞成AppCompatActivity,还得研究下。东西有点多呀。。。
这里我就直接放工程了 NetNut/DocPro 我尽量以简化的方式来实现。很多其他的接口方法需求可能要自己处理或者完善。还是大体简单说下结构啥的。其他的就根据相关知识补补了...
工程结构:
效果:
一定要先了解一些基础知识哈。。。
启动没有注册的Activity的两个主要问题
Activity等组件是需要在Manifest中注册后才能以标准Intent的方式启动的(如果有兴趣强烈推荐你了解下Activity生命周期实现的机制及源码),通过ClassLoader加载并实例化的Activity实例只是一个普通的Java对象,能调用对象的方法,但是它没有生命周期,而且Activity等系统组件是需要Android的上下文环境的(Context等资源),没有这些东西Activity根本无法工作。
使用插件APK里的Activity需要解决两个问题:
1\. 如何使插件APK里的Activity具有生命周期;
2\. 如何使插件APK里的Activity具有上下文环境(使用R资源);
代理Activity模式为解决这两个问题提供了一种思路。
附上几个地址:基本上你参考地址就可以搞了。 从上到下排个序,最后你可以参考最后那个链接来搞!
https://blog.csdn.net/chen03050903/article/details/51604694 - 了解概念就得从这开始
Android动态加载之ClassLoader详解 - ClassLoader分析的妥妥的,有必要了解
--Jvm、Dalvik和Art的区别 - ClassLoader继续深入下
--https://blog.csdn.net/dlwh_123/article/details/39151851
Android插件化之动态加载APK实现 - 这个给人感觉思路比较清晰,虽然没涉及原理,但是大体流程棒棒哒!
问题:我遇到的问题就是如果都采用继承AppCompatActivity的话,布局如果增加了id之类的,则运行就会报错:
Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'void android.support.v7.widget.DecorContentParent.setWindowCallback(android.view.Window$Callback)' on a null object reference
at android.support.v7.app.AppCompatDelegateImpl.createSubDecor(AppCompatDelegateImpl.java:611)
at android.support.v7.app.AppCompatDelegateImpl.ensureSubDecor(AppCompatDelegateImpl.java:518)
at android.support.v7.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:466)
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140)
at com.skl.plugin.PluginBaseActivity.setContentView(PluginBaseActivity.java:37)
at com.skl.pluginapk.PluginMainActivity.onCreate(PluginMainActivity.java:19)
at com.skl.plugin.ProxyActivity.onCreate(ProxyActivity.java:66)
at android.app.Activity.performCreate(Activity.java:6664)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
我跟了一下到这个地方去看了,没看懂!!!
TODO 解决????不知道怎么搞。。。目前也就试了下而已.....好多知识不懂妮。。。抛出先....
dexElements 热修复
最全解读地址: 【转】Android插件化从入门到放弃-最强合集 - 还应该加上腾讯的Shadow系列...
先这样吧。。跟这些个源码,启动源码,然后了解一些dex知识,class知识,还是脑壳云云的感觉。。。是要思考,换个方式了。。接下来就需要补一些知识。然后去了解下Hook。。完事了再跟启动流程源码。。。估计方可一试。。试之前我可能会用一下三方的看看效果。 之后的可能才是去看人家的原理,机制,有时间甚至需要看人家的源码妮。。。。
总之,插件化,热修复是一个必要的知识储备。。。。我一路从基础到现在。算是接触了一些东西。 但是还有挺多的。Android的比较深的方向很多,像做逆向的,做安全的,做音视频,图像等等。。。Native啥的。。。还有底层定制,系统定制。。。哎!路漫漫其修远兮,吾将上下而求索,但是有点懒懒的。。。。