深入理解Instant Run——原理篇

前言

Instant-run是Android Studio 2.0开始引入的新特性,它的作用是使开发者在开发时的改动可以很快地被应用,节省开发者的时间。当改动了代码之后,不需要进行完整的构建过程生成新的apk并且重新安装,只是把涉及到改动的部分push到设备上,某些情况下甚至都不需要重启当前Activity,马上就可以看到改动。牛逼啊,简直黑科技。

hotfix(热更新)的使用场景类似instant-run,所以有些hotfix框架的实现也借鉴了instant-run的思想。

使用

使用instant-run要求Android Studio版本不低于2.0、用于构建的Android gradle插件版本不低于2.0.0(就是build.gradle里的classpath ‘com.android.tools.build:gradle:x.x.x’)、minSdkVersion不低于21。

对AS和gradle构建插件有版本要求是因为instant-run的实现需要介入并修改原来的构建过程,对sdk有要求是因为加载patch的要求。

满足环境要求后,在第一次点AS的run按钮完整安装app后,旁边会有一个闪电状的按钮,后面接着在工程里开发,随时可以按这个按钮应用instant-run。

run

instant-run加载更新有三种方式:hotswapcoldswapwarmswap

hotswap

如果只是改动现有方法的实现逻辑,instant-run会自动应用hotswap,不需要重启就可以看到实际改动。

比如现在有如下一个Activity:

public class MainActivity extends Activity implements View.OnClickListener  {
    private TextView mTv;
    private int count = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mTv = new TextView(this);
        mTv.setText("click me!");
        mTv.setOnClickListener(this);
        setContentView(mTv);
    }

    private void toBeFix() {
        Toast.makeText(this, "origin count: " + count, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onClick(View v) {
        toBeFix();
        count++;
    }
}

整个界面就是一个简单的Textview,点击了会弹出一个toast。现在把按钮点击两次,会依次弹出toast:

origin count: 0
origin count: 1

然后简单地把toBeFix中的文案改掉:

private void toBeFix() {
  Toast.makeText(this, "change count: " + count, Toast.LENGTH_SHORT).show();
}

应用instant-run,Activity没有任何变化,但是再点击按钮,弹出来的toast变成了:

change count: 2

文案确实发生变成了改变后的文案,而且count在之前的基础上递增,说明Activity确实还是之前的实例,没有重启数据也没有丢。这个行为就类似线上hotfix,在用户无感知的情况下替换掉实际的实现逻辑。

如果发现每次都重启了,参考这个回答关掉每次自动重启的设置

warmswap

当改变的不止是代码,还涉及到资源文件的变动,就做不到像hotswap一样在不影响当前Activity的情况下应用变动了。AS会生成一个新的resources._ap(类似正常构建过程中资源的打包)推到设备上,然后重启当前Activity来使新的资源能生效。

coldswap

如果不符合上面hotswap和warmswap的条件,比如说增加或者删减了方法、修改了类的集成关系、修改了AndroidManifest等,就会应用coldswap。

coldswap也是会把改动部分推送到设备上,然后会重启整个app,才能看到变动。

原理

以下分析基于Android Studio 3.2、Android gradle插件3.2.1

概述

insatnu-run的目的是使在代码或者资源改动之后,不用进行完整的编译和重新安装也能在设备上看到改动,为了实现这个目标,它主要做了下面几件事:

  • 介入构建过程,把i
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值