美文网首页
android tinker热修复学习及使用

android tinker热修复学习及使用

作者: 你在心上_b28f | 来源:发表于2019-02-13 14:14 被阅读30次

本文为原创,如需转载,请注明出处:https://www.jianshu.com/p/40d53bbbfb9e

一.为什么需要使用热修复
1.在一次发布新版本的时候,由于是上线前没有测试下检查更新的模块,更新下载apk的地址写死了(一个本地的apk下载地址),导致有新版本的时候,用户不能更新,好在发现得及时,及时撤回,更新了安装包。影响到50多个用户,还是有不小影响到。
2.在一次ios升级的过程中,客服反映,用户点击升级,跳转到appStore里面是其他公司的app的下载界面。后来发现,是在提交appstore的时候,跳转的链接写死了,写的是开发人员之前公司app的链接。如果这两个app存在竞争关系,或者其他的东西,会给用户,公司带来不小的影响。好在这个ios的app处于刚上线的状态,用户量不是很多,影响不是特别大。后面也是通过更新版本,用户重新下载,或官网扫码等渠道更新解决这个问题的。

如果使用了热修复,就能很好的解决这个问题了,不需要重新上传更新包,还可以修复已经存在bug用户的问题。

bug可以分为两种,一种影响大的,需要及时修复,一种是影响较小,可以下个版本更新的时候提交。这只是更新模块出现的问题,这个模块还是比较重要的。每次上线前,最好是测试下这个模块,因为即使这个版本使用没有问题,但是由于bug,会导致不能更新到下个版本。当然其他地方可能也存在一些案列,这里我只列举了我在开发中遇到的。

二、使用tinker,gradle方式实现热修复

tinker,它是微信官方的 Android 热补丁解决方案,它支持动态下发代码、So 库以及资源,让应用能够在不需要重新安装的情况下实现更新。Tinker 已运行在微信的数亿 Android 设备上,那么为什么你不使用 Tinker 呢?
github 地址:https://github.com/Tencent/tinker

关于tinker原理可以看这篇文章 https://www.jianshu.com/p/5f390be47ce8
这篇文章就是根据tinker的思路实现自己的一套热修复方案,文章中还有视频,感觉是挺有帮助的,推荐给你们看看。

接下来进入正题使用tinker, 建议先下载gitbub的demo,然后先运行起来看下效果。运行domo可参考:
https://www.jianshu.com/p/57264c770c12

之后可以跟着demo,或者看别人的文章,自己搭建个demo,然后就可以在项目进行测试啦。 tinker wiki 地址 https://github.com/Tencent/tinker/wiki

1.加入依赖


image.png

2.复制tinker demo中的app ,build.gradle到自己的demo中,修改部分内容即可
tinkerId = getTinkerIdValue()并将其替换成tinkerId = "1.0"
buildConfigField "String", "TINKER_ID", ""1.0""

3.将应用签名,包括debug,release版本,然后在gradle进行配置

    signingConfigs {
        release {
            try {
                keyAlias 'china'
                keyPassword '123456'
                storeFile file('E://test/tinkerdemo2/tinkerdemo2.jks')
                storePassword '123456'
            } catch (ex) {
                throw new InvalidUserDataException(ex.toString())
            }

        }
        debug {
            storeFile file('E://test/tinkerdemo2/tinkerdemo2debug.jks')
            keyAlias 'china'
            keyPassword '123456'
            storePassword '123456'
        }
    }

  buildTypes {
        release {
            minifyEnabled true
            signingConfig signingConfigs.release
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            debuggable true
            minifyEnabled false
            signingConfig signingConfigs.debug
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

4.添加SampleApplicationLike 类,初始化tinker等操作(可以复制tinker demo下的SampleApplicationLike)

@DefaultLifeCycle(application = ".SimpleTinkerInApplication",
        flags = ShareConstants.TINKER_ENABLE_ALL,
        loadVerifyFlag = true)
public class SimpleTinkerInApplicationLike extends ApplicationLike {
    public SimpleTinkerInApplicationLike(Application application, int tinkerFlags, boolean tinkerLoadVerifyFlag, long applicationStartElapsedTime,
                                         long applicationStartMillisTime, Intent tinkerResultIntent) {
        super(application, tinkerFlags, tinkerLoadVerifyFlag, applicationStartElapsedTime, applicationStartMillisTime, tinkerResultIntent);
    }

    @Override
    public void onBaseContextAttached(Context base) {
        super.onBaseContextAttached(base);
        MultiDex.install(base);
        TinkerInstaller.install(this);

    }

    @Override
    public void onCreate() {
        super.onCreate();
    }
}

5.activity修复操作

    //加载补丁
    public void loadPath(View view) {
        String path = Environment.getExternalStorageDirectory().getAbsolutePath()+"/patch_signed_7zip.apk";
        File file = new File(path);
        if (file.exists()){
            Toast.makeText(this, "补丁已经存在", Toast.LENGTH_SHORT).show();
            TinkerInstaller.onReceiveUpgradePatch(getApplicationContext(), path);
        }else {
            Toast.makeText(this, "补丁不存在", Toast.LENGTH_SHORT).show();
        }
    }

6.修改androidmanifast.xml文件。添加权限,和引入application


1564897656.png

7.gradle运行 生成old包的apk(这里可以生成debug,或者release版本,但是old包要和补丁包是相同版本,release包会生成mapping.txt文件,debug包没有(这个文件要备份起来,这个混淆过后对照文件,方便以后生成补丁))


1550036434(1).jpg

生成old包的位置和补丁包的位置


1550036671(1).jpg

运行效果


Screenshot_2019-02-13-13-35-23-191_tinker.sample..png

8.修改xml,将textview 值修改为222,然后复制old包的文件名,修改app下的build.gradle 配置,gradle运行,生成补丁包


5823355-72f764a10bd02e57.png

9.测试效果。将补丁包拷贝到sd卡目录下,运行old包,点击更新,重启应用生效。


Screenshot_2019-02-13-13-54-08-446_tinker.sample..png

网上还有通过tinkerpatch第三方实现 tinker的,后台下发补丁的一个平台,需要收费,有兴趣可以了解下

遇到的问题:
1Could not get unknown property 'apkVariantData' for object of type com.androd......
将gradle build 的版本将至2.3.3, 高版本的会出现这个bug

文章demo传送门:https://github.com/xiaotianzhen/tinkerdemo

参考文章:https://blog.csdn.net/qq_15527709/article/details/61921447

相关文章

网友评论

      本文标题:android tinker热修复学习及使用

      本文链接:https://www.haomeiwen.com/subject/tiereqtx.html