美文网首页
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