Android插件化開發(fā)筆記

目前主流的技術(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í)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容