Я работаю с кодом Рибо, опубликованным выше, более года, и он нам хорошо послужил.Однако с последними обновлениями (Gradle 3.x) я больше не мог анализировать AndroidManifest.xml, я получал индекс из-за ошибок границ, и в целом он больше не мог анализировать файл.
Обновление: Теперь я считаю, что наши проблемы были связаны с обновлением до Gradle 3.x.В этой статье описывается, как в AirWatch возникали проблемы, и как их можно исправить с помощью параметра Gradle, чтобы использовать aapt вместо aapt2 AirWatch кажется несовместимым с плагином Android для Gradle 3.0.0-beta1
В поисках вокруг я наткнулся на этот проект с открытым исходным кодом, и он поддерживается, и я смог добраться до точки и прочитать как мои старые APK, которые я мог предварительно проанализировать, так и новые APK, которые по логике из Ribo выдавали исключения
https://github.com/xgouchet/AXML
Из его примера это то, что я делаю
zf = new ZipFile(apkFile);
//Getting the manifest
ZipEntry entry = zf.getEntry("AndroidManifest.xml");
InputStream is = zf.getInputStream(entry);
// Read our manifest Document
Document manifestDoc = new CompressedXmlParser().parseDOM(is);
// Make sure we got a doc, and that it has children
if (null != manifestDoc && manifestDoc.getChildNodes().getLength() > 0) {
//
Node firstNode = manifestDoc.getFirstChild();
// Now get the attributes out of the node
NamedNodeMap nodeMap = firstNode.getAttributes();
// Finally to a point where we can read out our values
versionName = nodeMap.getNamedItem("android:versionName").getNodeValue();
versionCode = nodeMap.getNamedItem("android:versionCode").getNodeValue();
}