Android在线热更新hot fix - AndFix试用

  • 开源库地址https://github.com/alibaba/AndFix

原理

  • 方法替换

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)

实现

  • 类图

  • 序列图

附件

测试log--------- beginning of /dev/log/main{启动app v1,无hot fix,log如下}09-16 17:24:15.264 D/euler   ( 8745): AndFixManager, construct09-16 17:24:15.264 D/euler   ( 8745): Compat, isSupport09-16 17:24:15.264 D/euler   ( 8745): Compat, isYunOS09-16 17:24:15.264 D/euler   ( 8745): AndFix, loadLibrary09-16 17:24:15.264 D/AndFix  ( 8745): JNI_OnLoad09-16 17:24:15.264 D/AndFix  ( 8745): registerNatives09-16 17:24:15.264 D/AndFix  ( 8745): registerNativeMethods09-16 17:24:15.264 D/euler   ( 8745): AndFix, setup09-16 17:24:15.264 D/AndFix  ( 8745): vm is: dalvik , apilevel is: 1809-16 17:24:15.264 D/AndFix  ( 8745): dalvik_setup09-16 17:24:15.264 D/AndFix  ( 8745): dvm_dlsym09-16 17:24:15.264 D/AndFix  ( 8745): _Z24dvmComputeMethodArgsSizePK6Method = 0x408bc56509-16 17:24:15.264 D/AndFix  ( 8745): dvm_dlsym09-16 17:24:15.264 D/AndFix  ( 8745): _Z13dvmCallMethodP6ThreadPK6MethodP6ObjectP6JValuez = 0x408d3e0709-16 17:24:15.264 D/AndFix  ( 8745): dvm_dlsym09-16 17:24:15.264 D/AndFix  ( 8745): _Z25dexProtoGetParameterCountPK8DexProto = 0x4090558109-16 17:24:15.264 D/AndFix  ( 8745): dvm_dlsym09-16 17:24:15.264 D/AndFix  ( 8745): dvmAllocArrayByClass = 0x408dc74709-16 17:24:15.264 D/AndFix  ( 8745): dvm_dlsym09-16 17:24:15.264 D/AndFix  ( 8745): _Z15dvmBoxPrimitive6JValueP11ClassObject = 0x408e2aad09-16 17:24:15.264 D/AndFix  ( 8745): dvm_dlsym09-16 17:24:15.264 D/AndFix  ( 8745): _Z21dvmFindPrimitiveClassc = 0x408dcf4509-16 17:24:15.264 D/AndFix  ( 8745): dvm_dlsym09-16 17:24:15.264 D/AndFix  ( 8745): dvmReleaseTrackedAlloc = 0x408c923d09-16 17:24:15.264 D/AndFix  ( 8745): dvm_dlsym09-16 17:24:15.264 D/AndFix  ( 8745): _Z17dvmCheckExceptionP6Thread = 0x408bc3cd09-16 17:24:15.264 D/AndFix  ( 8745): dvm_dlsym09-16 17:24:15.264 D/AndFix  ( 8745): _Z15dvmGetExceptionP6Thread = 0x408bc5f309-16 17:24:15.264 D/AndFix  ( 8745): dvm_dlsym09-16 17:24:15.264 D/AndFix  ( 8745): _Z17dvmFindArrayClassPKcP6Object = 0x408dc11d09-16 17:24:15.264 D/AndFix  ( 8745): dvm_dlsym09-16 17:24:15.264 D/AndFix  ( 8745): _Z28dvmCreateReflectMethodObjectPK6Method = 0x408e25fd09-16 17:24:15.264 D/AndFix  ( 8745): dvm_dlsym09-16 17:24:15.264 D/AndFix  ( 8745): _Z21dvmGetBoxedReturnTypePK6Method = 0x408e2b7d09-16 17:24:15.264 D/AndFix  ( 8745): dvm_dlsym09-16 17:24:15.264 D/AndFix  ( 8745): _Z17dvmUnboxPrimitiveP6ObjectP11ClassObjectP6JValue = 0x408e2b1509-16 17:24:15.264 D/AndFix  ( 8745): dvm_dlsym09-16 17:24:15.264 D/AndFix  ( 8745): _Z20dvmDecodeIndirectRefP6ThreadP8_jobject = 0x408be13d09-16 17:24:15.264 D/AndFix  ( 8745): dvm_dlsym09-16 17:24:15.264 D/AndFix  ( 8745): _Z13dvmThreadSelfv = 0x408c724d09-16 17:24:15.264 D/euler   ( 8745): Compat, isSupportSDKVersion09-16 17:24:15.264 D/euler   ( 8745): Compat, inBlackList09-16 17:24:15.264 D/euler   ( 8745): SecurityChecker, init09-16 17:24:15.284 D/euler   ( 8745): PatchManager, init09-16 17:24:15.284 D/euler   ( 8745): PatchManager, cleanPatch09-16 17:24:15.294 D/euler   ( 8745): inited.09-16 17:24:15.294 D/euler   ( 8745): PatchManager, loadPatch209-16 17:24:15.294 D/euler   ( 8745): apatch loaded.09-16 17:24:15.294 D/euler   ( 8745): PatchManager, addPatch209-16 17:24:15.294 D/euler   ( 8745): FileUtil, copyFile09-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 more09-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, construct09-16 17:24:41.984 D/euler   ( 8894): Compat, isSupport09-16 17:24:41.984 D/euler   ( 8894): Compat, isYunOS09-16 17:24:41.984 D/euler   ( 8894): AndFix, loadLibrary09-16 17:24:41.984 D/AndFix  ( 8894): JNI_OnLoad09-16 17:24:41.984 D/AndFix  ( 8894): registerNatives09-16 17:24:41.984 D/AndFix  ( 8894): registerNativeMethods09-16 17:24:41.984 D/euler   ( 8894): AndFix, setup09-16 17:24:41.984 D/AndFix  ( 8894): vm is: dalvik , apilevel is: 1809-16 17:24:41.984 D/AndFix  ( 8894): dalvik_setup09-16 17:24:41.984 D/AndFix  ( 8894): dvm_dlsym09-16 17:24:41.984 D/AndFix  ( 8894): _Z24dvmComputeMethodArgsSizePK6Method = 0x408bc56509-16 17:24:41.984 D/AndFix  ( 8894): dvm_dlsym09-16 17:24:41.984 D/AndFix  ( 8894): _Z13dvmCallMethodP6ThreadPK6MethodP6ObjectP6JValuez = 0x408d3e0709-16 17:24:41.984 D/AndFix  ( 8894): dvm_dlsym09-16 17:24:41.984 D/AndFix  ( 8894): _Z25dexProtoGetParameterCountPK8DexProto = 0x4090558109-16 17:24:41.984 D/AndFix  ( 8894): dvm_dlsym09-16 17:24:41.984 D/AndFix  ( 8894): dvmAllocArrayByClass = 0x408dc74709-16 17:24:41.984 D/AndFix  ( 8894): dvm_dlsym09-16 17:24:41.984 D/AndFix  ( 8894): _Z15dvmBoxPrimitive6JValueP11ClassObject = 0x408e2aad09-16 17:24:41.984 D/AndFix  ( 8894): dvm_dlsym09-16 17:24:41.984 D/AndFix  ( 8894): _Z21dvmFindPrimitiveClassc = 0x408dcf4509-16 17:24:41.984 D/AndFix  ( 8894): dvm_dlsym09-16 17:24:41.984 D/AndFix  ( 8894): dvmReleaseTrackedAlloc = 0x408c923d09-16 17:24:41.984 D/AndFix  ( 8894): dvm_dlsym09-16 17:24:41.984 D/AndFix  ( 8894): _Z17dvmCheckExceptionP6Thread = 0x408bc3cd09-16 17:24:41.984 D/AndFix  ( 8894): dvm_dlsym09-16 17:24:41.984 D/AndFix  ( 8894): _Z15dvmGetExceptionP6Thread = 0x408bc5f309-16 17:24:41.984 D/AndFix  ( 8894): dvm_dlsym09-16 17:24:41.984 D/AndFix  ( 8894): _Z17dvmFindArrayClassPKcP6Object = 0x408dc11d09-16 17:24:41.984 D/AndFix  ( 8894): dvm_dlsym09-16 17:24:41.984 D/AndFix  ( 8894): _Z28dvmCreateReflectMethodObjectPK6Method = 0x408e25fd09-16 17:24:41.984 D/AndFix  ( 8894): dvm_dlsym09-16 17:24:41.984 D/AndFix  ( 8894): _Z21dvmGetBoxedReturnTypePK6Method = 0x408e2b7d09-16 17:24:41.984 D/AndFix  ( 8894): dvm_dlsym09-16 17:24:41.984 D/AndFix  ( 8894): _Z17dvmUnboxPrimitiveP6ObjectP11ClassObjectP6JValue = 0x408e2b1509-16 17:24:41.984 D/AndFix  ( 8894): dvm_dlsym09-16 17:24:41.984 D/AndFix  ( 8894): _Z20dvmDecodeIndirectRefP6ThreadP8_jobject = 0x408be13d09-16 17:24:41.984 D/AndFix  ( 8894): dvm_dlsym09-16 17:24:41.984 D/AndFix  ( 8894): _Z13dvmThreadSelfv = 0x408c724d09-16 17:24:41.984 D/euler   ( 8894): Compat, isSupportSDKVersion09-16 17:24:41.984 D/euler   ( 8894): Compat, inBlackList09-16 17:24:41.984 D/euler   ( 8894): SecurityChecker, init09-16 17:24:42.014 D/euler   ( 8894): PatchManager, init09-16 17:24:42.014 D/euler   ( 8894): PatchManager, initPatchs09-16 17:24:42.014 D/euler   ( 8894): PatchManager, addPatch09-16 17:24:42.014 D/euler   ( 8894): Patch, init09-16 17:24:42.014 D/euler   ( 8894): inited.09-16 17:24:42.014 D/euler   ( 8894): PatchManager, loadPatch209-16 17:24:42.014 D/euler   ( 8894): apatch loaded.09-16 17:24:42.014 D/euler   ( 8894): PatchManager, addPatch209-16 17:24:42.014 D/euler   ( 8894): AndFixManager, removeOptFile09-16 17:24:42.014 D/euler   ( 8894): FileUtil, copyFile09-16 17:24:42.024 D/euler   ( 8894): PatchManager, addPatch09-16 17:24:42.024 D/euler   ( 8894): Patch, init09-16 17:24:42.024 D/euler   ( 8894): PatchManager, loadPatch309-16 17:24:42.024 D/euler   ( 8894): AndFixManager, fix2, file=/data/data/com.euler.andfix/files/apatch/out.apatch09-16 17:24:42.024 D/euler   ( 8894): SecurityChecker, verifyApk09-16 17:24:42.034 D/euler   ( 8894): SecurityChecker, loadDigestes09-16 17:24:42.034 D/euler   ( 8894): SecurityChecker, check09-16 17:24:42.094 D/euler   ( 8894): SecurityChecker, saveOptSig09-16 17:24:42.094 D/euler   ( 8894): SecurityChecker, getFileMD509-16 17:24:42.094 D/euler   ( 8894): SecurityChecker, saveFingerprint09-16 17:24:42.094 D/euler   ( 8894): AndFixManager, fixClass, class com.euler.andfix.MainActivity_CF09-16 17:24:42.094 D/euler   ( 8894): AndFixManager, isEmpty09-16 17:24:42.094 D/euler   ( 8894): AndFixManager, isEmpty09-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.MainActivity09-16 17:24:42.094 D/euler   ( 8894): AndFixManager, replaceMethod, onCreate09-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, initTargetClass09-16 17:24:42.094 D/euler   ( 8894): AndFix, initFields09-16 17:24:42.094 D/AndFix  ( 8894): modify com.euler.andfix.MainActivity.TAG flag:09-16 17:24:42.094 D/AndFix  ( 8894): setFieldFlag09-16 17:24:42.094 D/AndFix  ( 8894): dalvik_setFieldFlag09-16 17:24:42.104 D/AndFix  ( 8894): dalvik_setFieldFlag: 2509-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): replaceMethod09-16 17:24:42.104 D/AndFix  ( 8894): dalvik_replaceMethod09-16 17:24:42.104 D/AndFix  ( 8894): dalvikMethod: onCreate09-16 17:24:42.104 D/AndFix  ( 8894): dvmIsStaticMethod09-16 17:24:42.104 D/euler   ( 8894): AndFix, initFields09-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): setFieldFlag09-16 17:24:42.104 D/AndFix  ( 8894): dalvik_setFieldFlag09-16 17:24:42.104 D/AndFix  ( 8894): dalvik_setFieldFlag: 2509-16 17:24:42.104 D/euler   ( 8894): apatch:/mnt/sdcard//out.apatch added.09-16 17:24:42.104 D/AndFix  ( 8894): dalvik_dispatcher09-16 17:24:42.104 D/AndFix  ( 8894): dalvik_dispatcher source method: onCreate VL09-16 17:24:42.104 D/AndFix  ( 8894): dalvik_dispatcher target method: onCreate VL09-16 17:24:42.104 D/AndFix  ( 8894): dalvik_dispatcher start call->09-16 17:24:42.104 D/AndFix  ( 8894): dvmIsStaticMethod09-16 17:24:42.104 D/AndFix  ( 8894): boxMethodArgs09-16 17:24:42.104 D/AndFix  ( 8894): boxMethodArgs object: index = 009-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

更多相关文章

  1. Android(安卓)SDK下载地址
  2. Notification用法,注意API版本,API大于11的setLatestEventInfo()方
  3. Android面试准备(中高级)
  4. 获取系统语言的方法
  5. Android(安卓)图文数据JSON解析,金山词霸每日一句API的调用
  6. Android(安卓)Retrofit 2.0 注解的理解
  7. 4412开发板Android和LinuxQT烧写方法
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. Windows下修改android 模拟机 hosts文件
  2. Android实现简单水波纹效果
  3. aapt日常日常使用记录
  4. iOS 下一维码与二维码识别相关资料
  5. android 设计模式之单例模式详解
  6. 转: Android开机时桌面Widget的载入流程
  7. Android(安卓)网络应用重点———使用Htt
  8. SQLite3 在应用启动时初始化数据
  9. 【Android(安卓)开发】:UI控件之时间和日
  10. Eclipse 下配置Android开发环境