每次我们发布新的Android应用程序,我都需要在我们的网站上更新应用程序信息。因此,我尝试通过在上传到服务器时读取apk中的AndroidManifest.xml
来自动更新应用程序信息。
我使用AXMLResource
和jdom2
来获取AndroidManifest.xml
并解析它。
final Namespace NS = Namespace.getNamespace("http://schemas.android.com/apk/res/android");
zipFile = new ZipFile(apkPath);
ZipEntry zipEntry = new ZipEntry("AndroidManifest.xml");
inputStream = zipFile.getInputStream(zipEntry);
AXMLResource axmlResource = new AXMLResource();
axmlResource.read(inputStream);
SAXBuilder saxBuilder = new SAXBuilder();
Document document = saxBuilder.build(new ByteArrayInputStream(axmlResource.toXML().toString().getBytes("UTF-8")));
Element root = document.getRootElement();
System.out.println(root.getAttributeValue("versionCode",NS));
System.out.println(root.getAttributeValue("versionName",NS));
但我总是遇到以下问题:
与“manifest”元素相关联的属性“data:versionCode”的前缀“data”未绑定
我打印了AndroidManifest.xml
,发现data
命名空间未声明。
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
data:versionCode="344"
data:versionName="3.2.8"
我查看了Android Studio文档,发现其中使用了已声明的命名空间。
我认为这可能是我们应用程序开发者不规范所导致的。
但是当我进一步思考时,我想知道未声明命名空间的AndroidManifest.xml
应用程序为什么能被发布,于是我下载了一些APK文件,如Facebook、YouTube、CentOS、百度云盘和支付宝,发现只有CentOS没有使用未声明命名空间。
对于com.google.android.youtube.apk
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
http:versionCode="1425572340"
http:versionName="14.25.57"
与“清单”元素相关联的属性“http:versionCode”的前缀“http”未绑定。
对于
com.facebook.katana-225.0.0.47.118.apk
。<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
manifest:versionCode="158425934"
manifest:versionName="225.0.0.47.118"
与“manifest”元素类型相关联的属性“manifest:versionCode”的前缀未绑定
因此,以下是在 AndroidManifest.xml
中使用未声明命名空间的常见方式,但我该如何解析它?
./aapt d badging release.apk | grep -Po "(?<=\sversion(Code|Name)=')([0-9.]+)"
- LF002.6M
的磁盘空间,而上述编译代码仅占用52k
的空间。 - LF00