一、Dex
java → class
javac Hello.java
class → dex
dx --dex --output Hello.dex Hello.class
adb
adb push Hello.dex /storage/emulated/0
adb shell
dalvikvm -cp /sdcard/Hello.dex Hello??? (執(zhí)行dex中的哪個類)
二涂圆、ClassLoader
1.Java
2.Android
BootClassLoader:加載Android Framework層的class字節(jié)碼文件
PathClassLoader:與Java中的AppClassLoader類似十饥,用來加載已經(jīng)安裝的系統(tǒng)中的apk文件中的class文件
DexClassLoader:與Java中的CustomClassLoader類似,用來加載指定目錄中的class字節(jié)碼文件
BaseDexClassLoader:PathClassLoader和DexClassLoader的父類
運行一個APP至少需要BootClassLoader和PathClassLoader
雙親代理模型的特點:
當(dāng)前ClassLoader是否已加載過此類脱惰,如果已經(jīng)加載過則直接返回,否則會去查詢Parent是否已經(jīng)加載此類,如果已經(jīng)加載過則直接返回Parent加載過的這個類跺嗽,如果整個繼承線路上的ClassLoader都沒有加載過這個類,當(dāng)前的ClassLoader才會去加載這個類页藻。
類加載的共享功能:
一個類被頂層的ClassLoader加載過就會緩存在內(nèi)存里桨嫁,以后不管在哪里用到都不會重新加載。
類加載的隔離功能:
不同繼承路線下的ClassLoader加載的類份帐,肯定不是同一個類璃吧,避免非法篡改代碼訪問核心類庫中的成員變量。
見ClassLoader類中的loadClass方法
*動態(tài)加載難點
1.有許多組件類需要注冊才能使用
2.資源的動態(tài)加載很復(fù)雜
總結(jié):Android程序運行需要一個上下文環(huán)境废境。
熱修復(fù)
AndFix
https://github.com/alibaba/AndFix
BUILD (需要配置簽名)
AS Terminal → ./gradlew assembleRelease
apkpatch
生成apatch文件
usage: apkpatch -f -t -o -k -p <***> -a -e <***>
-a,--alias ? ? keystore entry alias.
-e,--epassword <***>? keystore entry password.
-f,--from ? ? ? ? new Apk file path.
-k,--keystore ? ? keystore path.
-n,--name ? ? ? patch name.
-o,--out?????? output dir.
-p,--kpassword <***>? keystore password.
-t,--to ? ? ? ? ? old Apk file path.
合并apatch文件
usage: apkpatch -m -o -k -p <***> -a -e <***>
-a,--alias ? ? keystore entry alias.
-e,--epassword <***>? keystore entry password.
-k,--keystore ? ? keystore path.
-m,--merge ? ? path of .apatch files.
-n,--name ? ? ? patch name.
-o,--out??????? output dir.
-p,--kpassword <***>? keystore password.
接下來需要實現(xiàn)的就是通過代碼將apatch文件下載到用戶手機(jī)中 然后通過AndFix API中的方法去修復(fù)就可以了畜挨。
Tinker
主要包括一下幾個部分:
1.gradle編譯插件:tinker-patch-gradle-plugin
幫助我們在AS中直接完成patch文件生成
2.核心sdk庫:tinker-android-lib
tinker提供的API
3.非gradle編譯用戶的命令行版本:tinker-patch-cli.jar
為eclipse而生 2333
原理
1.基于android原生的Class Loader筒繁,開發(fā)了自己的Class Loader,加載patch文件中的字節(jié)碼
2.基于android原生的aapt巴元,開發(fā)了自己的aapt
3.基于Dex文件格式毡咏,研發(fā)了DexDiff算法進(jìn)行比對生成patch文件
使用方式
//optional, help to generate the final application
//生成application時使用
provided('com.tencent.tinker:tinker-android-anno:1.9.1')
//tinker's main Android lib
//tinker的核心sdk庫
compile('com.tencent.tinker:tinker-android-lib:1.9.1')
(provided僅編譯時生效,不會被打包進(jìn)apk)