|
繼續上次的話題,經過一段時間的研究,首先解決了從APK文件中加載資源的問題,然後解決了從APK文件中加載Activity和Service的問題,雖然不能說可以運用未安裝APK文件中所有的東西,不過絕大部分的代碼和資源應該都是可以拿出來用了。 關於加載未安裝APK文件中的資源好像有不少人都說過,我依舊是用的前輩們的方法,反射調用android.content.res.AssetManager類,新建個實例,調用隱藏的方法addAssetPath(String path)將為安裝APK文件的添加進去,然後用這個AssetManager來構建出一個Resource實例就好了。大致代碼如下:
try {
Class<?> class_AssetManager = Class.forName("android.content.res.AssetManager");
Object assetMag = class_AssetManager.newInstance();
Method method_addAssetPath = class_AssetManager
.getDeclaredMethod("addAssetPath", String.class);
String path = 路徑;
String fileName = 文件名;
method_addAssetPath.invoke(assetMag, path + fileName);
Resources res = context.getResources();
Constructor<?> constructor_Resources = Resources.class
.getConstructor(class_AssetManager, res.getDisplayMetrics()
.getClass(), res.getConfiguration().getClass());
res = (Resources) constructor_Resources.newInstance(assetMag,
res.getDisplayMetrics(), res.getConfiguration());
} catch (Exception e) {
e.printStackTrace();
}
至於獲取了Resource之後怎麼再獲取相應的資源,這個應該就不用多說了,用反射去獲取R文件中的值好了,不贅述。
然後就是關於啟動未安裝APK文件中的Activity和Service,之前看到網上的說法一致是:這是不可能的。首先要說的是,這當然是可以辦到的,Activity和Service也是類,為啥就不能動態加載呢?大家啟動未安裝APK文件中的Activity或者是Service會出現ClassNotFoundException那是因為啟動它們時,用的是android應用默認的類加載器去加載的,而不是大家寫的DexClassLoader,所以會找不到Activity和Service的類。解決方法就是用反射把Android應用默認的類加載器替換掉就好了。思路提供給大家,代碼因為是公司在用的,就不貼出來了- -
http://blog.sina.com.cn/s/blog_7bed7b2b010169se.html
|
|