Android:从 Android 代码中获取 APKs minSdkVersion [重复]
Posted
技术标签:
【中文标题】Android:从 Android 代码中获取 APKs minSdkVersion [重复]【英文标题】:Android: getting an APKs minSdkVersion from Android code [duplicate] 【发布时间】:2015-08-07 23:14:44 【问题描述】:我正在开发一款 android 应用,如果用户需要,它能够安装其他应用(充当我的应用的插件)。
但是,这些附加应用中的每一个都可能需要特定的 Android 版本才能运行。我想在运行时执行检查,看看我尝试安装的 APK 是否真的与设备兼容。
现在,使用以下方法:
public PackageManager getPackageArchiveInfo(String archiveFilePath, int flags)
我可以获取有关 APK 文件的信息。但是,问题在于返回的信息似乎只包括 APK 的targetSdkVersion
,而不包括minSdkVersion
,据我了解,这是实际确定应用程序可以安装/运行的最低 Android 版本的信息。如果我理解正确,targetSdkVersion
只是“最佳”版本。
那么,长话短说,我如何确定 APK 是否在 Android 本身的设备上运行? (我知道我可以在桌面上使用 AAPT,但在 Android 本身上不可用)
【问题讨论】:
嘿,你找到答案了吗?谢谢 【参考方案1】:你可以做到的。
对于 Android N 及更高版本,请使用official API。
对于较早的版本,可以使用this code,非常高效快捷。这是一个更好的版本(即使 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;
而且,如果您想要一个全方位的解决方案(遗憾的是,这可能会占用大量堆内存和时间),您可以使用 APK 解析库,例如 APKParser。如果您只想要它的基础知识,请考虑我建议的 APKParser 改进 here。
【讨论】:
我认为这个问题是重复的,应该这样关闭,但你的回答增加了一些价值。不过,您介意评论/编辑您链接到的答案,以便我们将这个问题作为 dup 关闭吗? @MarcinOrlowski 我写的有什么问题? 您的回答没有问题,我什至 +1,但问题是重复的,您已经链接到包含广泛答案的问题。我通常会将其作为重复项关闭,但您的答案与另一个答案结合增加了额外的价值。另一个 Q 的浏览量也增加了 10 倍,因此将您的答案作为对已接受答案的评论更好,并且比保持这个问题保持开放更有价值。 随心所欲。我不介意那些规则。对我来说,这是一个问题的答案,就像许多其他问题一样,这就是这个网站的意义所在。我不喜欢这里有时执行的严格规则。以上是关于Android:从 Android 代码中获取 APKs minSdkVersion [重复]的主要内容,如果未能解决你的问题,请参考以下文章
android 安卓APP获取手机设备信息和手机号码的代码示例
如何从 Android 中的 apk 文件中获取源代码? [复制]