android studio 2.3与instant run

来源:互联网 发布:淘宝网领券猫腻 编辑:程序博客网 时间:2024/04/30 03:55
  • 前言
    目前最新的as 2.3上,instant run的cold swap部署方案与之前的版本相比已经发生巨大变化。之前是通过分dex来实现动态部署,而最新的2.3上则是通过split apks技术。看as 2.2的源码,只有部署到6.0以上的机子才会使用split apks方案。as 2.3则是5.0都会用该方案。需要说明的是,在安装时会通过adb install-multiple指令一次性安装。

  • split apks
    关于split apks技术,暂时没找到官方详细的介绍,只是在android studio的更新介绍上说这个技术在7.0上比原技术更稳定。但是我们可以通过查看编译输出的产物以及安装之后apk文件的结构来简单了解。打开我们apk的安装目录可以看到里面有多个apk,之前了解过instant run的对其中的命名应该很熟悉了,不难得出“把原来分dex变成现在分apk”这样的猜测。
    这里写图片描述
    看上图,切割的规则应该还是跟之前保持一致,有一个外壳base.apk,一个依赖split_lib_dependencies_apk.apk,然后将我们的业务代码分成了10份。其中base.apk中的dex只包含了instant-run-server的代码以及我们的AndroidManifest、资源文件等。查看这个manifest文件发现instant run现在已经不替换application了,只加了一个service标签。因为现在已经不用我们通过代码来更新和加载dex,直接覆盖安装即可。
    反编译dex也可以发现确实找不到之前的BootstrapApplication,而Server类也没有handleColdSwap的相关代码了。这里只保留了对hotswap和warmswap的处理逻辑。看其他的几个apk,里面只有一个dex、AndroidManifest和mf文件夹。打开AndroidManifest文件,仅有一个manifest标签,然后有个split属性。而base.apk的manifest是没有这个属性的。从安装的源码可以看出,安装时必须要有一个apk是没有这个属性的,并且认为这个就是base.apk。

  • 验证
    到这里,原理其实已经比较明了了,无非就是生成多个apk,把资源文件、manifest等放到base.apk,然后把业务dex分散到其他apk去,并且加入一个空的manifest文件,并且指定split属性。
    整个编译流程应该都是和之前的instant run是一致的,从aapt、aidl、javac到dx都没有什么变化。变化的是打包和安装过程,业务dex不再打入主apk,而是和各自的manifest文件打包成新的apk。
    安装时只要使用install-multiple指令即可。
    本人验证确实是可以的,但要提醒一点,未验证manifest的split属性值是否需要和apk名称保持一致,主dex是否一定要叫base。这个有兴趣的可自行验证。

  • 其他变化

    1. 默认采用cold swap
      运行按钮现在分成了两个,原来的运行按钮只会安装变化的apk来部署新的代码。另外再增加了一个按钮来实现hot swap和cold swap。
    2. hots wap和warm swap重启进程将不再生效
      前面提到,已经去掉了BootstrapApplication,那么就表示通过hot swap和warm swap部署的代码没法通过app启动的时候自行应用。只能由android studio通知app动态部署。重启之后,这些部署就不生效了。
  • 结语
    由于文章写得比较匆忙,有些内容可能解释得不够清楚。这次更新据说是从稳定性以及首次编译的效率上面都有提升,值得尝试一下。另外split apks技术能不能给热修复解决在7.0上的问题提供借鉴,也值得去研究。想了解instant run具体原理的,可以参考本人对之前版本的分析:
    Instant Run浅析
    Instant Run与热修复
0 0
原创粉丝点击