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 DefaultApplicationLikeb. 也可以将项目原来的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.
- Android Tinker的两种接入方式
- Tinker 的接入
- Tinker的简单接入
- Android 热修复 Tinker接入
- Android 热修复 Tinker 接入
- Unity3d Android SDK接入解析(二)Unity3d Android SDK的设计与两种接入方式
- Android 热修复 关于接入Tinker所遇到的错误
- 热修复,Tinker的接入
- Tinker接入踩的坑
- Tinker接入
- tinker接入
- Android 热更新 Bugly(Tinker)接入
- Android 热修复Tinker接入实战
- Android热修复框架 Tinker 接入
- Android热修复之Tinker接入流程
- Android 热修复 Tinker接入方法
- Android Tinker热更新Sample_demo接入
- 最省事的Tinker接入演示
- 几种HTTP url应用
- java 字符串理解
- 分数规划学习、
- POJ 2823 Sliding Window/单调队列
- oracle中关于count(1)、count(*)、count(rowid)、count(某个字段)使用上的区别和性能问题
- Android Tinker的两种接入方式
- 磁盘I/O性能优化--磁盘阵列
- ThinkPHP5 行为和钩子
- MySQL基础学习
- JDBC模板
- hdu 1435 Stable Match (稳定匹配)
- 解决SSH登陆一段时间就断开
- 3.9—字符串—Valid Number
- Web前端面试必会内容