一、对于已安装应用,只需要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);