Android Tinker的两种接入方式

来源:互联网 发布:mac nice to meet you 编辑:程序博客网 时间:2024/06/05 09:59

老大让我把项目里的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 generateflags = ShareConstants.TINKER_ENABLE_ALL)                                //tinkerFlags abovepublic 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,闪退一下,再打开,就修复成功了。



原创粉丝点击