于是搜了一下instant-run,和这篇文章,算是找到了问题: 原来在Android studio编译安装的时候,判断了手机的版本,如果是4.4.4,则没有使用instant-run,动态加载没有问题 instant-run 只在编译debug版本时起作用,原理也是利用动态加载机制,更新代码不用重新安装apk,只需要更新instant-run.zip,即可快速生效。 找到问题,直接禁用掉instant-run即可: ? BTW: Google经常把新功能默认开启,让我们不知不觉就成了小白鼠。
/instant-run/slice_9-classes.dex inflating: ./instant-run/slice_8-classes.dex inflating: . /instant-run/slice_7-classes.dex inflating: ./instant-run/slice_6-classes.dex inflating: . /instant-run/slice_5-classes.dex inflating: ./instant-run/slice_4-classes.dex inflating: . /instant-run/slice_3-classes.dex inflating: ./instant-run/slice_2-classes.dex inflating: . /instant-run/slice_1-classes.dex inflating: .
classes (declaration of 'retrofit2.Response' appears in /data/data/com.hengda.smart.retrofitdemo/files/instant-run
classes (declaration of ‘android.support.v4.view.ViewPager’ appears in /data/data/com.weijie.ckapp/files/instant-run
其中AndroidManifest.xml文件也被修改,如下: /app/build/intermediates/bundles/production/instant-run/AndroidManifest.xml setupClassLoaders(Context context, String codeCacheDir, long apkModified) { // /data/data/package_name/files/instant-run 这样IncrementalClassLoader就变成了整个App的所有类的加载的ClassLoader,并且dexPath是/data/data/package_name/files/instant-run 看到了吗,这个dexElements就是从dexPath来的,也就说是IncrementalClassLoader用来加载dexPath(/data/data/package_name/files/instant-run 正常情况下寻找资源都是在/data/app/package_name/base-1.apk目录下,而Instant run将资源也抽出来放在/data/data/package_name/files/instant-run
相比目前instant-run,buck,layoutcast等方案快数倍速度。 有何优势? 另外在资源变化后,LayoutCast选用的方案与Android Studio2.0 instant-run思路一致 ,把整个应用的资源打成资源包,推送至手机,若资源包大小较大,该过程耗费的时间相当可观 instant-run 最后是谷歌官方的增量解决方案Android Studio2.0 instant-run ,首先其基本流程与LayoutCast有点相似,但因其代码增量是通过运行期hack method ,instant-run还会有一定挂掉的机会,最后,因为instant-run采用hack的方式,导致debug包调试时候无法看到对应的method堆栈,不得不说,这是个巨大的弊端,最后,与LayoutCast 一样,instant-run不支持5.0以下的机器。
目前 jarMerge、proguard、multi-dex、Instant-Run 都已经换成 Transform 实现。 如下图: ? 具体怎么操作呢?
相比目前 instant-run,buck,layoutcast 等方案快数倍速度。
相比目前instant-run,buck,layoutcast等方案快数倍速度。
\mycode\stormplane1\app\build\intermediates\instant_run_merged_manifests\debug\processDebugManifest\instant-run \mycode\stormplane1\app\build\intermediates\instant_run_merged_manifests\debug\processDebugManifest\instant-run
从instant-run文件中我们猜想是BootstrapApplication替换了我们的application,Instant-Run代码作为一个宿主程序,将app作为资源dex加载起来。 Instant Run如何启动app 按照我们上面对instant-run运行机制的猜想,我们首先看一下appliaction的分析attachBaseContext和onCreate方法。
而在Android上虽然同样有类似instant-run的方案可以做Runtime的AOP,但在dex的格式上注定不能真正的做到Runtime,只是预先安放了大量的空方法段,以备不时只需,但这样的方案有比较严重的性能浪费
我们看下 Tinker 和其他热门框架的对比图: 可以看到,Tinker 的特点是: 支持类替换、So 替换,资源替换是采用类似 instant-run 的方案 补丁包较小,自研 diff 方案,下发的是差量包 市面上大多数的热补丁框架都采用 instant-run 的这套资源更新方案 加载 so Tinker 加载 SO 补丁提供了两个入口, TinkerLoadLibraryloadArmLibrary
可以看到,Tinker 的特点是: 支持类替换、So 替换,资源替换是采用类似 instant-run 的方案 补丁包较小,自研 diff 方案,下发的是差量包,包括的是变更的内容 支持 gradle 市面上大多数的热补丁框架都采用 instant-run 的这套资源更新方案 加载 so Tinker 加载 SO 补丁提供了两个入口, TinkerLoadLibraryloadArmLibrary