终端下完成Tinker Sample的调试

0.
首先确保你电脑配置了gradle环境变量,并且grade的版本大于等于2.14.1

例如2.14.1 3.1 3.2 3.2.1

可以使用这个命令查看gradle版本号

gradle --version

Gradle可以从这个网站下载

https://services.gradle.org/distributions

确保你配置了adb环境变量。如果没有配置,可以参考这篇文章Linux,Unix下环境变量的配置

可以使用adb --version查看是否配置了adb环境变量。

本文所有命令均在Ubuntu上调试的,Mac OS上应该都有,Windows上开发的同学可以自行转换为相应的命令

本文参考Tinker的官方wiki来写的。

https://github.com/Tencent/tinker/wiki

1.从github上下载tinker的源码

git clone [email protected]:Tencent/tinker.git

2.切换到tinker-sample-android目录下

cd tinker/tinker-sample-android

3.下载依赖,第一次运行可能需要很长时间,因为需要下载一些依赖库.

gradle clean

4.编译生成Debug版本的Apk

gradle assembleDebug

5.将编译生成的apk安装到手机或者模拟器中(Genymotion,Bluestacks)

adb uninstall tinker.sample.android && adb install app/build/bakApk/*.apk

6.启动安装的apk

adb shell am start tinker.sample.android/.app.MainActivity

7.修改代码,这里演示修改MainActivity中的TAG,来验证热修复

7.1: 得到MainActivity中TAG变量的行数

grep -n "TAG" app/src/main/java/tinker/sample/android/app/MainActivity.java | head -n 1 | cut -d ":" -f 1

7.2: 将TAG替换为新的值例如:IWantToTestHotFix

注意:下一行中的42为上一条命令中获取的MainActivity中TAG变量的行数IWantToTestHotFix为我们要替换后的TAG值。

sed -i '42s/.*/private static final String TAG = "IWantToTestHotFix";/' app/src/main/java/tinker/sample/android/app/MainActivity.java

7.3: 确认一下替换是否成功,可以通过查询替换后TAG的值和所在的行数

grep -n "IWantToTestHotFix" app/src/main/java/tinker/sample/android/app/MainActivity.java

8.获取编译生成的Debug版本APK的名字

find app/build/bakApk/ -type f -name *.apk -print | xargs ls -ltr | head -n 1 | awk '{print $9}' | cut -d "/" -f 4

9.获取”tinkerOldApkPath”字符串在tinker-sample-android/app/build.gradle文件中的行数

grep -n "tinkerOldApkPath" app/build.gradle | head -n 1 | cut -d ":" -f 1

10.用第8步获得的APK的名字,替换到app/build.gradle中tinkerOldApkPath的值

例如.

第8步得到的值为: app-debug-1130-12-54-43.apk

第9步得到的值为: 147

那么使用如下的命令直接在app/build.gradle文件中,将第147行将tinkerOldApkPath替换为app-debug-1130-12-54-43.apk.

e.g.

sed -i '147s/.*/tinkerOldApkPath="${bakPath}\/app-debug-1130-12-54-43.apk"/' app/build.gradle

实际使用时,你要做的就是将下面命令中number8替换为第8步得到的值,将number9替换为第9步得到的值。

然后执行这条命令即可完成替换工作。

sed -i 'number8s/.*/tinkerOldApkPath="${bakPath}\/number9"/' app/build.gradle

11.确认是否替换成功

例如.

grep -n "app-debug-1130-12-54-43.apk" app/build.gradle

实际使用时,你要做的就是将下面命令中number8替换为第8步得到的值。

然后执行这条命令即,如果替换成功你将看到替换的字符串的名字和所在的行数。

grep -n "number8" app/build.gradle

12.编译生成补丁包

gradle tinkerPatchDebug

13.将补丁包APK文件推送到手机的sdcard根目录中

adb push app/build/outputs/tinkerPatch/debug/patch_signed_7zip.apk /sdcard/

14.点击LOADPATH Button,加载补丁,需要等上3到4秒,

如果加载成功,你将可以看到一个Toast patch success,please restart process.

15.然后,就可以锁屏或者杀死该应用进程,你可以点击KILL SELF。

可以使用如下的命令完成

adb shell am force-stop tinker.sample.android && adb shell am start tinker.sample.android/.app.MainActivity

16.点击应用上的SHOW INFO按钮确认补丁是否加载成功,如果成功,可以看到.

弹出的Dialog的第一行显示[path is loaded]

同时,你可以查看自己修改的TAG是否生效。使用如下的命令过滤Log的TAG即可。

这里的TAG就是第7步修改的TAG。

adb logcat | grep IWantToTestHotFix

如果执行上个命令看到了TAG为IWantToTestHotFix的Log,祝贺你热修复成功了