终端下完成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 git@github.com: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,祝贺你热修复成功了




Enjoy Reading This Article?

Here are some more articles you might like to read next:

  • Claude Code CLI 新手使用指南
  • AndroidX,migrate,jetifier
  • KDE Connect Indicator
  • BusyBox
  • Source for Android 28