Android Tinker的两种接入方式

本文详细介绍了将AndFix替换为Tinker的两种接入方式,包括gradle接入和命令行接入。在gradle接入中,涉及项目配置、打包和补丁文件的生成。命令行接入则避开了复杂gradle配置,同样包含补丁制作流程。对于遇到65535问题的项目,文中也提到了可能遇到的loader类存在于旧的次要dex的警告。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

老大让我把项目里的AndFix改为Tinker,遇到各种问题,网上的文章大同小异不清不楚,折腾了好几天好不容易搞出来了,来为跟我一样的菜鸟们指点迷津。

Tinker的接入主要有两种方式,一种是Tinker推荐使用的gradle接入,一种是命令行的接入。

一. gradle接入

1.project目录下gradle添加

buildscript {
    dependencies {
        classpath ('com.tencent.tinker:tinker-patch-gradle-plugin:1.7.11')
    }
}
 module目录下gradle添加

dependencies {
    provided('com.tencent.tinker:tinker-android-anno:1.7.11')
    compile('com.tencent.tinker:tinker-android-lib:1.7.11') 
}
apply plugin: 'com.tencent.tinker.patch'
2. 改造Application,有两种方式

a. 把项目原来的Application的父类改为继承DefaultApplicationLike,再加上注解

public class MyApplication extends DefaultApplicationLike {
@DefaultLifeCycle(
application = "tinker.sample.android.app.SampleApplication",             //application name to generate
flags = ShareConstants.TINKER_ENABLE_ALL)                                //tinkerFlags above
public class MyApplication extends DefaultApplicationLike 
b. 也可以将项目原来的Application的父类改为继承TinkerApplication,然后将原来Application的所有代码移动到新建的ApplicationLike类中,再在继承了TinkerApplication的原来的Application类中加上注解

public class MyApplication extends TinkerApplication {
    public SampleApplication() {
      super(
           ShareConstants.TINKER_ENABLE_ALL,
          "tinker.sample.android.app.SampleApplicationLike");
    }  
}
划重点,无论哪种方式,都可以在ApplicationLike的子类中通过getApplication()方法获取项目的Application!!!

3.写个点击去启动加载补丁事件

  button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TinkerInstaller.onReceiveUpgradePatch(getApplicationContext(),
                        Environment.getExternalStorageDirectory().getAbsolutePath() + "/patch_signed_7zip.apk");
            }
        });
4. 将Tinker官方Demo的 build.gradle的配置根据你的需要一一加到你的项目里面,这里有两个需要注意的地方,第一,AndroidManifest里面的Application名和你自己build.gradle

里面loader属性里面的Application都要改为目前的Application名,第二,如果没有使用git,会报找不到tinkerId错误,可以考虑改为项目的版本号。

5.通过gradle assemble debug/release打包。


在build/bakApk目录下生成apk,mapping和R三个文件,将三个文件的文件名一一对应填入gradle中的对应位置。

    

再执行tinkerPathDebug/tinkerPathRelease,在build/outputs/tinkerPath目录下生成的_7zip.apk即为补丁文件,放到手机对应的位置,重新打开app。

     

感觉搞完真的不容易,罗里吧嗦的步骤,最麻烦的是配置gradle的部分,如果项目中原先的gradle是比较复杂的打包方式,改动起来更加繁琐,对于这种情况,可以采用命令行的接入的形式。

二、命令行接入
1.module目录下gradle添加

dependencies {
    provided('com.tencent.tinker:tinker-android-anno:1.7.11')
    compile('com.tencent.tinker:tinker-android-lib:1.7.11') 
}

2.3步与上述gradle接入步骤相同

4.在AndroidManifest中加入以下配置,value可以使用项目的版本号

   <meta-data
            android:name="TINKER_ID"
            android:value="your version code" />
5.将 tinker-patch-cli通过gradle的buildTinkerSdk打成jar。


将tinker-patch-cli目录下的tool_output文件夹中copy到自己的项目目录下,并将jar包也复制到该文件夹下,这里的release.keystore可以替换成自己项目的key。


6.修改tinker_config.xml里面的以下两项为自己项目的Application和key。

<loader value="tinker.sample.android.app.SampleApplication"/>
 <path value="release.keystore"/>
        <!--storepass-->
        <storepass value="testres"/>
        <!--keypass-->
        <keypass value="testres"/>
        <!--alias-->
        <alias value="testres"/>
7.将tinker_proguard.pro的混淆规则全部copy到自己的项目的混淆规则中,将其中的Application改为自己项目的Application。

8.通过Build/Genernate Signed APK打包出有BUG的apk命名为old.apk,将生成的mapping文件复制到你项目中与proguard-rules.pro同一目录下,在proguard-rules.pro中加上

-applymapping mapping.txt
确保后续打包和线上的包使用同一个mapping文件。

将old.apk移动到tool_output目录下。

9.修复BUG,通过Build/Genernate Signed APK打包apk命名为new.apk,将new.apk移动到tool_output目录下。

10.在tool_output目录下打开命令行,执行

java -jar tinker-patch-cli-1.7.11.jar -old old.apk -new new.apk -config tinker_config.xml -out output
如果成功生成补丁,目录如下图所示



注意,如果你的项目为了解决65535问题而使用了multidex,那么很有可能在生成补丁过程中遇到以下问题

Warning:ignoreWarning is false, but we found loader classes are found in old secondary dex.

接着一大堆tinker的类名。
意思就是说有些类需要放在主dex中,详细可以看 常见问题。解决方法就是在gradle中加上 multiDexKeepProguard file('tinker_multidexkeep.pro'),这个tinker_multidexkeep.pro文件就在copy过来的tool_output目录下。
11.接下来就是将old.apk安装到手机里,再将patch_signed.apk发到手机内置SD卡里,重新打开APP,闪退一下,再打开,就修复成功了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值