使用Andfix
AS創建kotlin項目
AndroidManifest增加權限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
activity_main.xml放一個TextView
<TextView
android:id="@+id/tv_result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
MainActivity.kt
class MainActivity : AppCompatActivity() {
//懶加載初始化view
val mTvResult by lazy {
//findviewbyid
tv_result
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
tv_result.text = "有bug的版本"
}
}
引入Andfix
app下的build.gradle
implementation 'com.alipay.euler:andfix:0.5.0@aar'
初始化要放到Application中,新建MyApplication.kt
class MyApplication:Application(){
override fun onCreate() {
super.onCreate()
val patchManager = PatchManager(this);
patchManager.init("1.0");//current version
patchManager.loadPatch();
//設置文件路徑
val filePath = File(Environment.getExternalStorageDirectory(),"fixbug.apatch")
//合併補丁文件
if(filePath.exists()){
patchManager.addPatch(filePath.absolutePath);
}
}
}
AndroidManifest中註冊
<application
android:name=".MyApplication">
......
</application>
運行程序把生成的apk改名爲bug
修改MainActivity.kt
tv_result.text = "修復bug的版本"
tv_result.setTextColor(Color.RED)
tv_result.textSize = 50F
再次運行程序,把生成的apk改爲fix-bug
獲取差分包
在Andfix的github地址提供了一個獲取差分包的工具,apkpatch
如果下載慢可以去我的網盤下載
提取碼:te2k
把剛纔兩個apk和默認的簽名文件debug.keystore放到解壓好的文件夾中,在當前路徑打開cmd
輸入apkpatch.bat
可以查看使用說明
apkpatch -f fix-bug.apk -t bug.apk -o out -k debug.keystore -p android -a androiddebugkey -e android
-f 新apk
-t 舊apk
-o 輸出路徑
-k keystore
-p keystore密碼
-a keystore別名
-e keystore密碼
運行之後,生成的out中有.patch文件,我們改成代碼中的名字fixbug.aptch
安裝有bug版本apk
adb install -r -t bug.apk
把fixbug.apatch保存到sd卡
adb push fixbug.apatch sdcard/
殺死進程,打開權限。再次打開即可得到修復bug的apk
(經測試。在mumu模擬機上成功了。錘子手機也成功了。但是小米6並沒有成功,大牛請評論告訴我原因…)
不足
熱修復不能保證完全修復
下面爲不同熱修復性能對比圖
資源下載
https://download.csdn.net/download/u010356768/12103313