Android:从Android代码获取APK minSdkVersion

Mas*_*r_T 6 android apk android-package-managers

我正在开发一个Android应用程序,如果用户需要,它可以安装其他应用程序(作为我的应用程序的插件).

但是,这些附加应用中的每一个都可能需要运行特定的Android版本.我想在运行时执行检查,看看我正在尝试安装的APK是否实际上与设备兼容.

现在,使用以下方法:

public PackageManager getPackageArchiveInfo(String archiveFilePath, int flags)
Run Code Online (Sandbox Code Playgroud)

我可以获得一个APK文件的信息.然而,问题是返回的信息似乎只包括APK targetSdkVersion但不包括minSdkVersion,我理解的是实际确定Android的最低版本可以安装/运行的应用程序.的targetSdkVersion,如果我理解正确的仅仅是"最佳"的版本.

所以,长话短说,如何确定Android cna是否可以在Android设备上运行?(我知道我可以在桌面上使用AAPT,但这不适用于Android本身)

and*_*per 5

你能行的。

对于 Android N 及以上版本,请使用官方 API

对于较早的版本,您可以使用此代码,非常高效且快速。这是它的一个更好的版本(即使 getAttributeName 返回空字符串也能工作):

public static int getMinSdkVersion(File apkFile) throws ClassNotFoundException, IllegalAccessException, InstantiationException,
        NoSuchMethodException, InvocationTargetException, IOException, XmlPullParserException {
    final Class assetManagerClass = Class.forName("android.content.res.AssetManager");
    final AssetManager assetManager = (AssetManager) assetManagerClass.newInstance();
    final Method addAssetPath = assetManager.getClass().getMethod("addAssetPath", String.class);
    final int cookie = (Integer) addAssetPath.invoke(assetManager, apkFile.getAbsolutePath());
    final XmlResourceParser parser = assetManager.openXmlResourceParser(cookie, "AndroidManifest.xml");
    while (parser.next() != XmlPullParser.END_DOCUMENT)
        if (parser.getEventType() == XmlPullParser.START_TAG && parser.getName().equals("uses-sdk"))
            for (int i = 0; i < parser.getAttributeCount(); ++i)
                if (parser.getAttributeNameResource(i) == android.R.attr.minSdkVersion)//alternative, which works most of the times: "minSdkVersion".equals(parser.getAttributeName(i)))
                    return parser.getAttributeIntValue(i, -1);
    return -1;
}
Run Code Online (Sandbox Code Playgroud)

而且,如果您想要一个全面的解决方案(遗憾的是这可能会占用大量堆内存和时间),您可以使用 APK 解析库,例如APKParser。如果您只想要它的基础知识,请考虑我在这里建议的 APKParser 改进。