Android在線熱更新hot fix - AndFix試用

Android在線熱更新hot fix - AndFix試用

原理

  • 方法替換
  • principle.png
  • bug fix process

run demo

  • 具體步驟參考開源庫地址
  • 注意,執行apkpatch.bat -f 3.apk -t 1.apk -o output -k xx.keystore -p xxx-a yy -e xxx生成的是一個目錄,我們用到的是目錄裏面的xxx.apatch,將這個apatch推到手機即可
  • 測試工程,主要用於代碼學習,在native和java層加了log,地址https://github.com/cheyiliu/test4XXX/tree/master/test4AndFix-master

測試

  • 測試1,新增方法和修改方法均可hot fix
  • 測試2,新增類並調用,不可行,app異常退出
  • 測試3,在測試1的基礎上,刪除掉patch後重啓app或者重啓手機再起app,fix依然有效,框架留有緩存(/data/data/com.euler.andfix/files)

實現

  • 類圖
    class_diagram

  • 序列圖
    SequenceDiagram

附件

測試log
--------- beginning of /dev/log/main
{
啓動app v1,無hot fix,log如下
}
09-16 17:24:15.264 D/euler   ( 8745): AndFixManager, construct
09-16 17:24:15.264 D/euler   ( 8745): Compat, isSupport
09-16 17:24:15.264 D/euler   ( 8745): Compat, isYunOS
09-16 17:24:15.264 D/euler   ( 8745): AndFix, loadLibrary
09-16 17:24:15.264 D/AndFix  ( 8745): JNI_OnLoad
09-16 17:24:15.264 D/AndFix  ( 8745): registerNatives
09-16 17:24:15.264 D/AndFix  ( 8745): registerNativeMethods
09-16 17:24:15.264 D/euler   ( 8745): AndFix, setup
09-16 17:24:15.264 D/AndFix  ( 8745): vm is: dalvik , apilevel is: 18
09-16 17:24:15.264 D/AndFix  ( 8745): dalvik_setup
09-16 17:24:15.264 D/AndFix  ( 8745): dvm_dlsym
09-16 17:24:15.264 D/AndFix  ( 8745): _Z24dvmComputeMethodArgsSizePK6Method = 0x408bc565
09-16 17:24:15.264 D/AndFix  ( 8745): dvm_dlsym
09-16 17:24:15.264 D/AndFix  ( 8745): _Z13dvmCallMethodP6ThreadPK6MethodP6ObjectP6JValuez = 0x408d3e07
09-16 17:24:15.264 D/AndFix  ( 8745): dvm_dlsym
09-16 17:24:15.264 D/AndFix  ( 8745): _Z25dexProtoGetParameterCountPK8DexProto = 0x40905581
09-16 17:24:15.264 D/AndFix  ( 8745): dvm_dlsym
09-16 17:24:15.264 D/AndFix  ( 8745): dvmAllocArrayByClass = 0x408dc747
09-16 17:24:15.264 D/AndFix  ( 8745): dvm_dlsym
09-16 17:24:15.264 D/AndFix  ( 8745): _Z15dvmBoxPrimitive6JValueP11ClassObject = 0x408e2aad
09-16 17:24:15.264 D/AndFix  ( 8745): dvm_dlsym
09-16 17:24:15.264 D/AndFix  ( 8745): _Z21dvmFindPrimitiveClassc = 0x408dcf45
09-16 17:24:15.264 D/AndFix  ( 8745): dvm_dlsym
09-16 17:24:15.264 D/AndFix  ( 8745): dvmReleaseTrackedAlloc = 0x408c923d
09-16 17:24:15.264 D/AndFix  ( 8745): dvm_dlsym
09-16 17:24:15.264 D/AndFix  ( 8745): _Z17dvmCheckExceptionP6Thread = 0x408bc3cd
09-16 17:24:15.264 D/AndFix  ( 8745): dvm_dlsym
09-16 17:24:15.264 D/AndFix  ( 8745): _Z15dvmGetExceptionP6Thread = 0x408bc5f3
09-16 17:24:15.264 D/AndFix  ( 8745): dvm_dlsym
09-16 17:24:15.264 D/AndFix  ( 8745): _Z17dvmFindArrayClassPKcP6Object = 0x408dc11d
09-16 17:24:15.264 D/AndFix  ( 8745): dvm_dlsym
09-16 17:24:15.264 D/AndFix  ( 8745): _Z28dvmCreateReflectMethodObjectPK6Method = 0x408e25fd
09-16 17:24:15.264 D/AndFix  ( 8745): dvm_dlsym
09-16 17:24:15.264 D/AndFix  ( 8745): _Z21dvmGetBoxedReturnTypePK6Method = 0x408e2b7d
09-16 17:24:15.264 D/AndFix  ( 8745): dvm_dlsym
09-16 17:24:15.264 D/AndFix  ( 8745): _Z17dvmUnboxPrimitiveP6ObjectP11ClassObjectP6JValue = 0x408e2b15
09-16 17:24:15.264 D/AndFix  ( 8745): dvm_dlsym
09-16 17:24:15.264 D/AndFix  ( 8745): _Z20dvmDecodeIndirectRefP6ThreadP8_jobject = 0x408be13d
09-16 17:24:15.264 D/AndFix  ( 8745): dvm_dlsym
09-16 17:24:15.264 D/AndFix  ( 8745): _Z13dvmThreadSelfv = 0x408c724d
09-16 17:24:15.264 D/euler   ( 8745): Compat, isSupportSDKVersion
09-16 17:24:15.264 D/euler   ( 8745): Compat, inBlackList
09-16 17:24:15.264 D/euler   ( 8745): SecurityChecker, init
09-16 17:24:15.284 D/euler   ( 8745): PatchManager, init
09-16 17:24:15.284 D/euler   ( 8745): PatchManager, cleanPatch
09-16 17:24:15.294 D/euler   ( 8745): inited.
09-16 17:24:15.294 D/euler   ( 8745): PatchManager, loadPatch2
09-16 17:24:15.294 D/euler   ( 8745): apatch loaded.
09-16 17:24:15.294 D/euler   ( 8745): PatchManager, addPatch2
09-16 17:24:15.294 D/euler   ( 8745): FileUtil, copyFile
09-16 17:24:15.294 E/euler   ( 8745):
09-16 17:24:15.294 E/euler   ( 8745): java.io.FileNotFoundException: /mnt/sdcard/out.apatch: open failed: ENOENT (No such file or directory)
09-16 17:24:15.294 E/euler   ( 8745):   at libcore.io.IoBridge.open(IoBridge.java:409)
09-16 17:24:15.294 E/euler   ( 8745):   at java.io.FileInputStream.<init>(FileInputStream.java:78)
09-16 17:24:15.294 E/euler   ( 8745):   at com.alipay.euler.andfix.util.FileUtil.copyFile(FileUtil.java:54)
09-16 17:24:15.294 E/euler   ( 8745):   at com.alipay.euler.andfix.patch.PatchManager.addPatch(PatchManager.java:162)
09-16 17:24:15.294 E/euler   ( 8745):   at com.euler.andfix.MainApplication.onCreate(MainApplication.java:63)
09-16 17:24:15.294 E/euler   ( 8745):   at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1010)
09-16 17:24:15.294 E/euler   ( 8745):   at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4519)
09-16 17:24:15.294 E/euler   ( 8745):   at de.robv.android.xposed.XposedBridge.invokeOriginalMethodNative(Native Method)
09-16 17:24:15.294 E/euler   ( 8745):   at de.robv.android.xposed.XposedBridge.handleHookedMethod(XposedBridge.java:631)
09-16 17:24:15.294 E/euler   ( 8745):   at android.app.ActivityThread.handleBindApplication(Native Method)
09-16 17:24:15.294 E/euler   ( 8745):   at android.app.ActivityThread.access$1300(ActivityThread.java:144)
09-16 17:24:15.294 E/euler   ( 8745):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1319)
09-16 17:24:15.294 E/euler   ( 8745):   at android.os.Handler.dispatchMessage(Handler.java:99)
09-16 17:24:15.294 E/euler   ( 8745):   at android.os.Looper.loop(Looper.java:137)
09-16 17:24:15.294 E/euler   ( 8745):   at android.app.ActivityThread.main(ActivityThread.java:5178)
09-16 17:24:15.294 E/euler   ( 8745):   at java.lang.reflect.Method.invokeNative(Native Method)
09-16 17:24:15.294 E/euler   ( 8745):   at java.lang.reflect.Method.invoke(Method.java:525)
09-16 17:24:15.294 E/euler   ( 8745):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:745)
09-16 17:24:15.294 E/euler   ( 8745):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:561)
09-16 17:24:15.294 E/euler   ( 8745):   at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
09-16 17:24:15.294 E/euler   ( 8745):   at dalvik.system.NativeStart.main(Native Method)
09-16 17:24:15.294 E/euler   ( 8745): Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory)
09-16 17:24:15.294 E/euler   ( 8745):   at libcore.io.Posix.open(Native Method)
09-16 17:24:15.294 E/euler   ( 8745):   at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
09-16 17:24:15.294 E/euler   ( 8745):   at libcore.io.IoBridge.open(IoBridge.java:393)
09-16 17:24:15.294 E/euler   ( 8745):   ... 20 more
09-16 17:24:15.294 I/euler   ( 8745): onCreate, there is a bug in v1 !!!

{
啓動app v1,有hot fix,log如下
}
09-16 17:24:41.984 D/euler   ( 8894): AndFixManager, construct
09-16 17:24:41.984 D/euler   ( 8894): Compat, isSupport
09-16 17:24:41.984 D/euler   ( 8894): Compat, isYunOS
09-16 17:24:41.984 D/euler   ( 8894): AndFix, loadLibrary
09-16 17:24:41.984 D/AndFix  ( 8894): JNI_OnLoad
09-16 17:24:41.984 D/AndFix  ( 8894): registerNatives
09-16 17:24:41.984 D/AndFix  ( 8894): registerNativeMethods
09-16 17:24:41.984 D/euler   ( 8894): AndFix, setup
09-16 17:24:41.984 D/AndFix  ( 8894): vm is: dalvik , apilevel is: 18
09-16 17:24:41.984 D/AndFix  ( 8894): dalvik_setup
09-16 17:24:41.984 D/AndFix  ( 8894): dvm_dlsym
09-16 17:24:41.984 D/AndFix  ( 8894): _Z24dvmComputeMethodArgsSizePK6Method = 0x408bc565
09-16 17:24:41.984 D/AndFix  ( 8894): dvm_dlsym
09-16 17:24:41.984 D/AndFix  ( 8894): _Z13dvmCallMethodP6ThreadPK6MethodP6ObjectP6JValuez = 0x408d3e07
09-16 17:24:41.984 D/AndFix  ( 8894): dvm_dlsym
09-16 17:24:41.984 D/AndFix  ( 8894): _Z25dexProtoGetParameterCountPK8DexProto = 0x40905581
09-16 17:24:41.984 D/AndFix  ( 8894): dvm_dlsym
09-16 17:24:41.984 D/AndFix  ( 8894): dvmAllocArrayByClass = 0x408dc747
09-16 17:24:41.984 D/AndFix  ( 8894): dvm_dlsym
09-16 17:24:41.984 D/AndFix  ( 8894): _Z15dvmBoxPrimitive6JValueP11ClassObject = 0x408e2aad
09-16 17:24:41.984 D/AndFix  ( 8894): dvm_dlsym
09-16 17:24:41.984 D/AndFix  ( 8894): _Z21dvmFindPrimitiveClassc = 0x408dcf45
09-16 17:24:41.984 D/AndFix  ( 8894): dvm_dlsym
09-16 17:24:41.984 D/AndFix  ( 8894): dvmReleaseTrackedAlloc = 0x408c923d
09-16 17:24:41.984 D/AndFix  ( 8894): dvm_dlsym
09-16 17:24:41.984 D/AndFix  ( 8894): _Z17dvmCheckExceptionP6Thread = 0x408bc3cd
09-16 17:24:41.984 D/AndFix  ( 8894): dvm_dlsym
09-16 17:24:41.984 D/AndFix  ( 8894): _Z15dvmGetExceptionP6Thread = 0x408bc5f3
09-16 17:24:41.984 D/AndFix  ( 8894): dvm_dlsym
09-16 17:24:41.984 D/AndFix  ( 8894): _Z17dvmFindArrayClassPKcP6Object = 0x408dc11d
09-16 17:24:41.984 D/AndFix  ( 8894): dvm_dlsym
09-16 17:24:41.984 D/AndFix  ( 8894): _Z28dvmCreateReflectMethodObjectPK6Method = 0x408e25fd
09-16 17:24:41.984 D/AndFix  ( 8894): dvm_dlsym
09-16 17:24:41.984 D/AndFix  ( 8894): _Z21dvmGetBoxedReturnTypePK6Method = 0x408e2b7d
09-16 17:24:41.984 D/AndFix  ( 8894): dvm_dlsym
09-16 17:24:41.984 D/AndFix  ( 8894): _Z17dvmUnboxPrimitiveP6ObjectP11ClassObjectP6JValue = 0x408e2b15
09-16 17:24:41.984 D/AndFix  ( 8894): dvm_dlsym
09-16 17:24:41.984 D/AndFix  ( 8894): _Z20dvmDecodeIndirectRefP6ThreadP8_jobject = 0x408be13d
09-16 17:24:41.984 D/AndFix  ( 8894): dvm_dlsym
09-16 17:24:41.984 D/AndFix  ( 8894): _Z13dvmThreadSelfv = 0x408c724d
09-16 17:24:41.984 D/euler   ( 8894): Compat, isSupportSDKVersion
09-16 17:24:41.984 D/euler   ( 8894): Compat, inBlackList
09-16 17:24:41.984 D/euler   ( 8894): SecurityChecker, init
09-16 17:24:42.014 D/euler   ( 8894): PatchManager, init
09-16 17:24:42.014 D/euler   ( 8894): PatchManager, initPatchs
09-16 17:24:42.014 D/euler   ( 8894): PatchManager, addPatch
09-16 17:24:42.014 D/euler   ( 8894): Patch, init
09-16 17:24:42.014 D/euler   ( 8894): inited.
09-16 17:24:42.014 D/euler   ( 8894): PatchManager, loadPatch2
09-16 17:24:42.014 D/euler   ( 8894): apatch loaded.
09-16 17:24:42.014 D/euler   ( 8894): PatchManager, addPatch2
09-16 17:24:42.014 D/euler   ( 8894): AndFixManager, removeOptFile
09-16 17:24:42.014 D/euler   ( 8894): FileUtil, copyFile
09-16 17:24:42.024 D/euler   ( 8894): PatchManager, addPatch
09-16 17:24:42.024 D/euler   ( 8894): Patch, init
09-16 17:24:42.024 D/euler   ( 8894): PatchManager, loadPatch3
09-16 17:24:42.024 D/euler   ( 8894): AndFixManager, fix2, file=/data/data/com.euler.andfix/files/apatch/out.apatch
09-16 17:24:42.024 D/euler   ( 8894): SecurityChecker, verifyApk
09-16 17:24:42.034 D/euler   ( 8894): SecurityChecker, loadDigestes
09-16 17:24:42.034 D/euler   ( 8894): SecurityChecker, check
09-16 17:24:42.094 D/euler   ( 8894): SecurityChecker, saveOptSig
09-16 17:24:42.094 D/euler   ( 8894): SecurityChecker, getFileMD5
09-16 17:24:42.094 D/euler   ( 8894): SecurityChecker, saveFingerprint
09-16 17:24:42.094 D/euler   ( 8894): AndFixManager, fixClass, class com.euler.andfix.MainActivity_CF
09-16 17:24:42.094 D/euler   ( 8894): AndFixManager, isEmpty
09-16 17:24:42.094 D/euler   ( 8894): AndFixManager, isEmpty
09-16 17:24:42.094 D/euler   ( 8894): AndFixManager, replaceMethod, dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.euler.andfix-1.
apk"],nativeLibraryDirectories=[/data/app-lib/com.euler.andfix-1, /vendor/lib, /system/lib]]]
09-16 17:24:42.094 D/euler   ( 8894): AndFixManager, replaceMethod, com.euler.andfix.MainActivity
09-16 17:24:42.094 D/euler   ( 8894): AndFixManager, replaceMethod, onCreate
09-16 17:24:42.094 D/euler   ( 8894): AndFixManager, replaceMethod, public void com.euler.andfix.MainActivity_CF.onCreate(android.os.Bundle)
09-16 17:24:42.094 D/euler   ( 8894): AndFix, initTargetClass
09-16 17:24:42.094 D/euler   ( 8894): AndFix, initFields
09-16 17:24:42.094 D/AndFix  ( 8894): modify com.euler.andfix.MainActivity.TAG flag:
09-16 17:24:42.094 D/AndFix  ( 8894): setFieldFlag
09-16 17:24:42.094 D/AndFix  ( 8894): dalvik_setFieldFlag
09-16 17:24:42.104 D/AndFix  ( 8894): dalvik_setFieldFlag: 25
09-16 17:24:42.104 D/euler   ( 8894): AndFix, addReplaceMethod, src=public void com.euler.andfix.MainActivity.onCreate(android.os.Bundle)
09-16 17:24:42.104 D/euler   ( 8894): AndFix, addReplaceMethod, dest=public void com.euler.andfix.MainActivity_CF.onCreate(android.os.Bundle)
09-16 17:24:42.104 D/AndFix  ( 8894): replaceMethod
09-16 17:24:42.104 D/AndFix  ( 8894): dalvik_replaceMethod
09-16 17:24:42.104 D/AndFix  ( 8894): dalvikMethod: onCreate
09-16 17:24:42.104 D/AndFix  ( 8894): dvmIsStaticMethod
09-16 17:24:42.104 D/euler   ( 8894): AndFix, initFields
09-16 17:24:42.104 D/AndFix  ( 8894): modify com.euler.andfix.MainActivity_CF.TAG flag:
09-16 17:24:42.104 D/AndFix  ( 8894): setFieldFlag
09-16 17:24:42.104 D/AndFix  ( 8894): dalvik_setFieldFlag
09-16 17:24:42.104 D/AndFix  ( 8894): dalvik_setFieldFlag: 25
09-16 17:24:42.104 D/euler   ( 8894): apatch:/mnt/sdcard//out.apatch added.
09-16 17:24:42.104 D/AndFix  ( 8894): dalvik_dispatcher
09-16 17:24:42.104 D/AndFix  ( 8894): dalvik_dispatcher source method: onCreate VL
09-16 17:24:42.104 D/AndFix  ( 8894): dalvik_dispatcher target method: onCreate VL
09-16 17:24:42.104 D/AndFix  ( 8894): dalvik_dispatcher start call->
09-16 17:24:42.104 D/AndFix  ( 8894): dvmIsStaticMethod
09-16 17:24:42.104 D/AndFix  ( 8894): boxMethodArgs
09-16 17:24:42.104 D/AndFix  ( 8894): boxMethodArgs object: index = 0
09-16 17:24:42.104 I/euler   ( 8894): onCreate, there is NO bug in v2, fixed !!!
09-16 17:24:42.104 D/AndFix  ( 8894): +++ ignoring return to void
發佈了113 篇原創文章 · 獲贊 6 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章