记录一下我集成使用的过程,集成过程中有遇到一些问题,希望大家能绕过这些坑,首先我是按github上面的官方demo和文档进行集成,然后自己又重新创建了项目进行练习,后面我会给出自己的github项目地址
导入官方Demotinker-sample-android
集成
我这里直接使用的是他1.7.11版本,导入项目里面自带的tinker-sample-android到studio中。
初始化配置
首先我们需要在app/bulid.gradle中,设置tinkerId的值,很多人开始编译就报错,提示“tinkerId is not set!!!”,就是因为这个值没有设置。获取tinkerId走的
def gitSha() {
return 'git rev-parse --short HEAD'.execute().text.trim()
}
这个方法,也就是获取git最近一次commit的版本号,所以要是你的当前Project没有配置git,或者当前的Project还没有commit过,或者git没有加入到环境变量中,会获取不到该值。知道了原理,那解决方式就自己想了,我这里就直接写死,上面这个方法直接返回固定字符串。
之后,我们会看到Manifest.xml中,SampleApplication.Java这个类报红找不到。这个并不影响,因为到时候我们在编译的时候,tinker会为我们生成SampleApplication.java这个类,直接rebuild就好。
按官方的文档操做了一遍,使用步骤详解
Demo请参考tinker-sample-android, 它的使用方法如下:
1.调用assembleDebug
编译,我们会将编译过的包保存在build/bakApk中。然后我们将它安装到手机,点击SHOW INFO
按钮,可以看到补丁并没有加载。
2.修改代码,例如将MainActivity中I am on patch onCreate
的Log打开。然后我们需要修改build.gradle中的参数,将步骤一编译保存的安装包路径拷贝到tinkerPatch
中的oldApk
参数中。
3.调用tinkerPatchDebug
, 补丁包与相关日志会保存在/build/outputs/tinkerPatch/
。然后我们将patch_signed_7zip.apk
推送到手机的sdcard中。
adb push ./app/build/outputs/tinkerPatch/debug/patch_signed_7zip.apk /storage/sdcard0/
4.点击LOAD PATCH
按钮, 如果看到patch success, please restart process
的toast,即可锁屏或者点击KILL SELF
按钮
5.我们可以看到的确出现了I am on patch onCreate
日志,同时点击SHOW INFO
按钮,显示补丁包的确已经加载成功了。
自己练习Demo,编译Release版本tinker-my-test
debug版本的编译,和release版本的基本类似,在编译debug版本的时候我没有加signingConfigs里面keystore,buildTypes里面debug这些的配置,就可以编译apk和R文件了,但是编译release版本的时候,不能生成apk文件,所以有了第3步的那些配置,新建了一个keystore包,把debug.keystore和release.keystore放在下面
1.在项目的 build.gradle
中,添加 tinker-patch-gradle-plugin
的依赖
buildscript {
dependencies {
classpath ('com.tencent.tinker:tinker-patch-gradle-plugin:1.7.11')
}
}
2.在app的 build.gradle
中,添加如下配置
dependencies {
//可选,用于生成application类
provided('com.tencent.tinker:tinker-android-anno:1.7.11')
//tinker的核心库
compile('com.tencent.tinker:tinker-android-lib:1.7.11')
}
...
...
//apply tinker插件
apply plugin: 'com.tencent.tinker.patch'
3.在app的 build.gradle
中,添加编译release版本的配置
android {
signingConfigs {
release {
try {
storeFile file("./keystore/release.keystore")
storePassword "testres"
keyAlias "testres"
keyPassword "testres"
} catch (ex) {
throw new InvalidUserDataException(ex.toString())
}
}
debug {
storeFile file("./keystore/debug.keystore")
}
}
buildTypes {
release {
minifyEnabled true //控制是否混淆的,生不生成mapping文件
signingConfig signingConfigs.release //这句话影响能不能生成apk文件,之前没写这句,在bakApk下不能生成apk文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
debuggable true
minifyEnabled false
signingConfig signingConfigs.debug
}
}
}
4.先创建一个 SampleApplicationLike
继承至 DefaultApplicationLike
.
5.先执行 assembleRelease
生成一个基准文件包bakApk,包括apk文件,R文件,mapping文件(mapping文件 minifyEnabled true
开启了混淆的有, minifyEnabled false
没有开启的没该文件)
6.修改代码,在 MainActivity
的 onCreate()
方法里面加了一个 Toast
, activity_main
里面把TextView
的文字改了一下
7.修改app下 build.gradle
中的参数,将步骤3编译保存的安装包路径拷贝到tinkerPatch
中的tinkerOldApkPath
参数中。
8.调用tinkerPatchRelease
, 补丁包与相关日志会保存在/build/outputs/tinkerPatch/
。然后我们将patch_signed_7zip.apk
推送到手机的sdcard中。
adb push ./app/build/outputs/tinkerPatch/debug/patch_signed_7zip.apk /storage/sdcard0/
9.点击Load Patch
按钮, 加载补丁文件,加载完成App会自动关闭,再重新App就可以效果了。