在Android应用中获取未安装的apk的包

时间:2015-02-20 18:03:21

标签: android

我正在使用具有系统权限的安装程序应用程序,我需要在其中解析尚未安装的APK的程序包名称。

为了清楚起见,我正在谈论在Android应用程序中执行此操作 - 我已经知道如何在桌面上执行此操作。

我已经尝试将APK视为ZipFile并将其从AndroidManifest.xml中删除,但这不起作用,因为文本已加密。

在Android框架中还有其他方法吗?

感谢您的帮助。

1 个答案:

答案 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;
}