autojs使用未安裝的app資源

牙叔教程 簡單易懂javascript

標準名字

Android插件化java

DexClassLoader加載未安裝的apk,提供資源供宿主app使用android

網上有不少插件化的教程, 我看了不少教程, 都是android的, 沒找到autojs的, 因此就翻譯了一下, 而且畫了一個簡單明瞭的流程圖markdown

流程圖

效果.png

autojs版本

9.0.4網絡

教程中可以使用到的未安裝app資源

  • 圖片
  • 顏色
  • 字符串
  • activity_main.xml

代碼講解

1. 獲得未安裝的apk信息
// resourcePath就是sd卡上的app文件路徑
function queryPackageInfo(resourcePath) {
  return context.getPackageManager().getPackageArchiveInfo(resourcePath, context.getPackageManager().GET_ACTIVITIES);
}
複製代碼
2. 建立AssetManager實例
assetManager = Class.forName("android.content.res.AssetManager").newInstance();
複製代碼
3. 添加apk路徑
let method = assetManager.getClass().getMethod("addAssetPath", Class.forName("java.lang.String"));
// 反射設置資源加載路徑
method.invoke(assetManager, resourcePath);
複製代碼
4. 構造出正確的Resource
resources = new Resources(
  assetManager,
  context.getResources().getDisplayMetrics(),
  context.getResources().getConfiguration()
);
複製代碼
5. 實例化DexClassLoader
// 構造函數
// public DexClassLoader(String dexPath, String optimizedDirectory, String libraryPath, ClassLoader parent)
// dexPath - 就是apk文件的路徑
// optimizedDirectory - apk解壓縮後的存放dex的目錄,在4.1之後該目錄不容許在sd卡上
// libraryPath - 本地的library
// parent - 父加載器
new DexClassLoader(resourcePath, mDexDir, null, context.getClassLoader())
複製代碼
6. 加載類
cls = mResourceLoadBean.getClassLoader().loadClass(rClassName);
複製代碼
7. 獲取資源id
cls = mResourceLoadBean.getClassLoader().loadClass(rClassName);
resID = cls.getField(fieldName).get(null);
複製代碼
8. 獲取資源實體
drawable = mResourceLoadBean.getResources().getDrawable(resourceID);
複製代碼

注意事項

  • DexClassLoader第二個參數, 必須爲私有目錄, 而且不可爲空
  • activity_main.xml的文字居中, 在androi studio中是正常的, 動態加載使用activity.setContentView並無居中
  • java的類, 轉爲autojs的類, 內部成員最好掛到this上面
  • assetManager的實例是宿主app創造出來的, 可是必定要反射設置資源加載路徑, 爲未安裝的app, 由於插件化就是用未安裝的app資源

聲明

部份內容來自網絡 本教程僅用於學習, 禁止用於其餘用途app

相關文章
相關標籤/搜索