Each time our new android app released, I need to update app info on our website. So I try to update the app info automatically, by read the AndroidManifest.xml
in the apk when uploaded to server.
I use AXMLResource
and jdom2
to get the AndroidManifest.xml
and parse it.
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));
But I always get,
The prefix “data” for attribute “data:versionCode” associated with an element type “manifest” is not bound
And I print the AndroidManifest.xml
,and found the data
namespace is unclared.
<?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"
When I check android studio doc and found there use declared namespace.
Then I think this may be caused by our app developers's Irregularities.
But when I think further, why app with AndroidManifest.xml
with undeclared namespace can released, then I download some apks like facebook,youtube,centos,baidu disk and alipay, and found only centos doesn't use undeclared namespace.
For 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"
The prefix “http” for attribute “http:versionCode” associated with an element type “manifest” is not bound
For 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"
The prefix “manifest” for attribute "manifest:versionCode” associated with an element type “manifest” is not bound
So here is comman use undeclased namespace in AndroidManifest.xml
,but how can I pase it?
from Java how to parse xml with undeclared namespace?
No comments:
Post a Comment