如果用户需要,我正在开发一款能够安装其他应用(可充当我的应用的插件)的Android应用。
但是,这些附加应用中的每一个都可能需要运行特定的Android版本。我想在运行时执行检查,看看我尝试安装的APK是否与设备实际兼容。
现在,使用以下方法:
public PackageManager getPackageArchiveInfo(String archiveFilePath, int flags)
我可以获取有关APK文件的信息。但是,问题是返回的信息似乎只包含APK的targetSdkVersion
而不包括minSdkVersion
,据我所知,实际上是确定Android应用的最低版本的targetSdkVersion
可以安装/运行。如果我理解正确,$request = new FacebookRequest($session, 'GET', '/{post-id}/comments');
只是"最佳"版本
所以,长话短说,如何确定Android cna是否可以在Android设备上运行? (我知道我可以在桌面上使用AAPT,但这不适用于Android本身)
答案 0 :(得分:4)
你可以做到。
对于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。如果您只想了解它的基础知识,请考虑我建议的here的APKParser改进。