我正在使用具有系统权限的安装程序应用程序,我需要在其中解析尚未安装的APK的程序包名称。
为了清楚起见,我正在谈论在Android应用程序中执行此操作 - 我已经知道如何在桌面上执行此操作。
我已经尝试将APK视为ZipFile并将其从AndroidManifest.xml中删除,但这不起作用,因为文本已加密。
在Android框架中还有其他方法吗?
感谢您的帮助。
答案 0 :(得分:1)
我找到了解决方案。我进入了AOSP源代码,在AssetManager中发现了一些隐藏的方法,这些方法在通过反射调用时可以实现。不需要系统权限。
public static String extractPackageName(Context ctx, String apkPath) {
try {
AssetManager assmgr = ctx.getAssets();
Method addAssetPathMethod = assmgr.getClass().getMethod("addAssetPath", String.class);
Method setConfigurationMethod = assmgr.getClass().getMethod("setConfiguration",
int.class, int.class, String.class, int.class, int.class,
int.class,int.class, int.class, int.class, int.class, int.class,
int.class, int.class, int.class, int.class, int.class, int.class);
int cookie = ((Integer) addAssetPathMethod.invoke(assmgr, apkPath)).intValue();
if (cookie != 0) {
final DisplayMetrics metrics = new DisplayMetrics();
metrics.setToDefaults();
setConfigurationMethod.invoke(assmgr, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, Build.VERSION.SDK_INT);
XmlResourceParser parser = assmgr.openXmlResourceParser(cookie, "AndroidManifest.xml");
int type;
while ((type = parser.next()) != XmlPullParser.START_TAG && type != XmlPullParser.END_DOCUMENT) {}
String packageName = parser.getAttributeValue(null, "package");
return packageName;
}
} catch (Exception e) {
}
return null;
}