目前主流的技術(shù):插件化,熱更新,增量更新
動(dòng)態(tài)加載
1.解決一個(gè)dex不能加載65535個(gè)方法的問題
2.解耦合
3.AB類產(chǎn)品
主流的開源框架
1.DynamicAPK
2.DroidPlugin(360的)
3.VirtualAPK
4.small
5.Android-plugin-framework
6.TWSPluginFramework
加載XML資源解析
1.加載插件apk
public static void loadPlugin(Context context){
InputStream is = null;
OutputStream os = null;
int len;
byte buffer = new byte[1024];
while((len = is.read(buffer))!=-1){
//把文件加載出來
}
}
2.DexClassLoader
apk在系統(tǒng)里面運(yùn)行時(shí)進(jìn)行了安裝的,二plugin時(shí)沒有安裝的
所以要使用plugin,要清楚系統(tǒng)系統(tǒng)安裝apk的流程
DexClassLoader可以解析apk dex;要傳入一個(gè)實(shí)例,
DesClassLoader desClassLoader = new DexClassLoader(apkFile.getAbsolutePath,this.getDir(Constant.PLUGIN_NAME,Cotext.MODE_PRIVATE).getAbsolutePath,null,getClassLoader());
Class<?> loadClass = classLoader.loadClass(Constants.PackageName,+"R$drawable");
FieId[] declareFields = loadClass.getgetFieIds();
for(FieId fieId:declareFieIds){
int animId = fieId.getInt(R.drawable.class);
//Drawable sour = this.getResource().getDrawable(animId);//這個(gè)是不行的- -
//跟讀系統(tǒng)源碼,找到Resource的初始化方法,初始化插件的資源文件
AssetManager assetManager = PluginManager.getPlugnAssetManager(apkFile);
Resource resource = new Resource(assetManager,this.getResurce().getDisplayMetries,this.getResource().getConfiguration());
Drawable source = resource.getDrawable(animId);
Log.d(TAG,"animid"+animid);
}
反射到系統(tǒng)的AssetManager
public static AssetManager getPluginAssetManager(File apkFile){
Class<?> forName = Class.forName("android.content.res.AssetManager");
Method[] declareMethod = forName.getDeclareMethod();
for(Method method:declareMethod){
if(method.getName().equals("addAssetPath")){
AssetManager assetManager = AssetManager.newInstance();
method.invoke(assetManager,)//系統(tǒng)的方法
}
}
}
HOOK原理
通過反射拿到一個(gè)func1實(shí)例,在Application onCreate initHOOK的時(shí)候埋進(jìn)去,作為動(dòng)態(tài)代理,然后走系統(tǒng)的func2
例如startActivity的時(shí)候會(huì)走ActivityManagerService, 然后把里面的Intent換掉,換成PluginActivity的Intent,然后再回到ActivityManagerService掃描清單然后這時(shí)候再換回來
非侵入式鉤子,通過系統(tǒng)的方式替換(系統(tǒng)的ActivityManager管理)
侵入式,好實(shí)現(xiàn),但是會(huì)殺毒軟件被殺掉(使用代理ActivityManager管理)
------待學(xué)習(xí)