一、对于已安装应用,只需要getPackageManager().getInstalledPacked(int flags)即可得到PackageInfo.
packageInfo.applicationInto中可以得到所有信息。
注:区别系统应用和用户应用:applicationInfo.flags & ApplicationInfo.FLAG_SYSTEMSTEM
二、对于未安装应用(apk文件)
使用packageManager.getPackageArchiveInfo(String filePath,int flags),只能得到部分信息。
所有int形式的资源(label,icon等)都是无法得到的,需要使用反射机制用到隐藏接口
方法如下:
```Resources res=getResources();
AssetManager asm=new AssetManager();//隐藏api
asm.addAssetPath(String apkfilePath);//隐藏api
res=new Resources(asm,res.getDisplayMetrics(),res.getConfiguration());//隐藏api```
然后使用res.getString(int resId) res.getDrawable(int resId)即可得到apk文件内部的资源。(此处资源id可通过上面的公开方法得到)
关键点就在于assetManager.addAssetPath(String apkfilePath)此方法。
现在要做的就是使用反射机制实现上面的隐藏api。
具体反射实现代码如下:
```Class asm_cls = Class.forName("android.content.res.AssetManager");
Object asm_obj = asm_cls.getDeclaredConstructor((Class[]) null).newInstance((Class[]) null);
asm_obj.getClass() .getDeclaredMethod("addAssetPath", new Class[] { String.class })
.invoke(asm_obj, new Object[] { filePath });
Resources res=getResources();
res = Resources.class.getDeclaredConstructor(
new Class[] { asm_obj.getClass(),
res.getDisplayMetrics().getClass(),
res.getConfiguration().getClass() })
.newInstance(new Object[] { asm_obj,
res.getDisplayMetrics(),
res.getConfiguration() });
return res;```
res.getDisplayMetrics(),
res.getConfiguration() });
return res;```
res.getString(applicaiontInfo.labelRes);
res.getDrawable(applicationInfo.icon);