Tinker热更新快速集成

Tinker

前言:

由于公司需要,入坑Tinker,结果发现dex以及资源文件,可以替换。而So文件,Log日志提示替换成功,而使用时不好使。所以有了该文章。

目标:

更新Dex,资源文件,以及So库文件

原理:

简单说下Tinker的原理。通过算法,将新的更新的APK和原版的BaseApk之间的差异生成一个Patch补丁包。将补丁包发送到手机本地,在用户打开手机时将补丁包加载进手机。更加具体的原理,此处不做叙述。

集成:

1. 在全局的build.gradle中新增classpath。如图:
classpath ('com.tencent.tinker:tinker-patch-gradle-plugin:1.9.1')
image.png
2.将Demo中的app中的build.gradle复制进项目中。这里有几个需要注意的地方。
image.png
image.png
image.png
3.将Demo中的文件复制进项目中.并注册service。
image.png
4.新建ApplicationLike。继承自DefaultApplication。这里是为了自动生成Application。
//application为生成的Application的名称。flags为可以替换的类型,这里TINKER_ENABLE_ALL为全都可以替换(dex,资源文件,so库)
@DefaultLifeCycle(application = ".TestTinkerApplication",flags = ShareConstants.TINKER_ENABLE_ALL
)
public class TestTinkerLike extends DefaultApplicationLike {
    private static TestTinkerLike mTestTinkerLike;
    public TestTinkerLike(Application application, int tinkerFlags, boolean tinkerLoadVerifyFlag, long applicationStartElapsedTime, long applicationStartMillisTime, Intent tinkerResultIntent) {
        super(application, tinkerFlags, tinkerLoadVerifyFlag, applicationStartElapsedTime, applicationStartMillisTime, tinkerResultIntent);
        mTestTinkerLike=this;
    }

    /**
     * install multiDex before install tinker
     * so we don't need to put the tinker lib classes in the main dex
     *
     * @param base
     */
    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    @Override
    public void onBaseContextAttached(Context base) {
        super.onBaseContextAttached(base);
        //you must install multiDex whatever tinker is installed!
        MultiDex.install(base);

        TinkerManager.fastInstallAll(this);
    }

    public static TestTinkerLike getmTestTinkerLike(){
        return mTestTinkerLike;
    }
}
5.注册Application。会报错,因为TestTinkerApplication没有生成,build一下即可。
image.png

热更新

1. 配置签名
image.png
2. 生成基础APK包,生成位置如图。生成位置可以自行配置(在build.gradle中修改bakPath)
image.png
3. 生成补丁代码。注意:这里生成的补丁必须是基于用户安装的基础APK。假如用户安装的是A版本。而你是基于B版本生成的补丁包。这样是无法在A版本上更新的。即图中的基础APK必须是用户正在用的版本。
image.png
4. 将补丁包放到手机中,具体位置为图中所示(可以自行更改)。这里有一点需要注意就是权限问题,我看别人的Demo貌似不需要申请权限,可我做时却必须申请。这点大家可以自己试试。
image.png
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                        != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0);
                } else {
                    TinkerInstaller.onReceiveUpgradePatch(getApplicationContext(), Environment.getExternalStorageDirectory().getAbsolutePath() + "/patch_signed_7zip.apk");
                }
5.加载so库的几种方式:
  • Hack方式(成功率最大的方式)
String CPU_ABI = android.os.Build.CPU_ABI;
// 将tinker library中的 CPU_ABI架构的so 注册到系统的library path中。
TinkerLoadLibrary.installNavitveLibraryABI(MainActivity.this, CPU_ABI);
  • 非Hack方式:
String CPU_ABI = android.os.Build.CPU_ABI;
boolean a=TinkerLoadLibrary.loadLibraryFromTinker(getApplicationContext(), "lib/" + CPU_ABI, "native-lib");

  • Arm方式:
TinkerLoadLibrary.loadArmLibrary(getApplicationContext(), "native-lib");
  • Arm-V7a方式:
TinkerApplicationHelper.loadArmV7aLibrary(TestTinkerLike.getmTestTinkerLike(), "native-lib");
注意

这里有两个类可以加载So文件,TinkerLoadLibraryTinkerApplicationHelper 不过他们的原理时一样的,不知道作者为什么封了两个。

特别注意

so文件是打补丁的时候自动加载的,但是却需要手动的链一下,相当于,基础apk本身的so文件A。在打补丁的时候加载了so文件B。此时有两个so文件。你每次都要手动的用上面的方法加载so库B。否则默认调用的还是基础APK的so文件A中的方法。一旦你在加载so库前,调用了A中的方法,默认加载的是so库A。此时你要调用so库B中 新增的方法(so库B中有,但是so库A中没有的方法)。就会报错。

文件 :

基础文件,以及补丁包。如图所示!
切记,第一次的时候由于没有权限,需要手动打补丁。


image.png
项目地址:https://github.com/13046434521/TestTinker
问题:

如果文章有什么错误,请及时指正。比如权限的问题,我这里是必须申请的。比如so文件同时存在,而不是替换,也是个人猜测,有时间我会去证实。希望大家一同进步。

总结:

特别注意中这个简单的逻辑,却难了我3天的时间,由于大部分集成tinker的,只要替换资源文件和dex即可。所以几乎很难找到so无法生效的原因。也算是为后来人,铺了个路。后续会上代码和图片。希望大家点个喜欢,关注。还是老话,风力雨里,都在这里等你,你们的关注是我最大的动力。感谢各位了,一个入坑JNI开发的小Android程序员的诉求。感谢各位大佬啦。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352

推荐阅读更多精彩内容