Android安裝包APK檔案中的AndroidManifest.xml記錄了應用的詳細資料,發布時該檔案已被編譯成二進位碼,所以無法正常查看其內容。比如我想查看這個包的Package和Version資訊(這指的是在服務端)。
AXMLPrinter2.jar可以很好的幫我做到這點,如果你有Java環境,可以通過以下命令列解碼xml中的內容
java -jar AXMLPrinter2.jar AndroidManifest.xml > AndroidManifest.txt
當然你可以在dotnet程式裡通過調用外部進程來運行此
ProcessStartInfo ph = new ProcessStartInfo("AXMLPrinter2.jar","AndroidManifest.xml > AndroidManifest.txt");Process.Start(ph);
不過這在asp.net的web程式因許可權問題會有諸多不便,因我的生產環境沒有Java,所以想在C#下實現這個功能。AXMLPrinter2.jar是有原始碼的(Eclipse project),你完全可以用C#重寫一遍
藉助偉大的IKVM.NET (dotnet上java的實現),我可以把AXMLPrinter2.jar轉換成一個dotnet的Assembly
ikvmc -out:AXMLPrinter2.dll AXMLPrinter2.jar
引用轉換後的dll和IKVM的lib(IKVM.Runtime.dll,IKVM.OpenJDK.Core.dll),這樣就可以很方便的在C#中調用AXMLPrinter2.jar裡的方法了,下面是C#中的一段調用
public static string DecodeManifestXML(string filePath)
{
if (!File.Exists(filePath))
return null;
try
{
AXmlResourceParser parser = new AXmlResourceParser();
parser.open(new java.io.FileInputStream(filePath));
const string indent = " ";
StringBuilder xmlContent = new StringBuilder();
while (true)
{
int type = parser.next();
if (type == 1)
{
break;
}
switch (type)
{
case 0:
{
xmlContent.Append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n");
break;
}
case 2:
{
xmlContent.AppendFormat("{0}<{1}{2}", indent, getNamespacePrefix(parser.getPrefix()), parser.getName());
int namespaceCountBefore = parser.getNamespaceCount(parser.getDepth() - 1);
int namespaceCount = parser.getNamespaceCount(parser.getDepth());
for (int i = namespaceCountBefore; i != namespaceCount; ++i)
{
xmlContent.AppendFormat("{0}xmlns:{1}=\"{2}\"",
indent,
parser.getNamespacePrefix(i),
parser.getNamespaceUri(i));
}
for (int i = 0; i != parser.getAttributeCount(); ++i)
{
xmlContent.AppendFormat("{0}{1}{2}=\"{3}\"", indent,
getNamespacePrefix(parser.getAttributePrefix(i)),
parser.getAttributeName(i),
getAttributeValue(parser, i));
}
xmlContent.AppendFormat("{0}>", "");
break;
}
case 3:
{
xmlContent.AppendFormat("{0}</{1}{2}>", "",
getNamespacePrefix(parser.getPrefix()),
parser.getName());
break;
}
case 4:
{
xmlContent.AppendFormat("{0}{1}", indent, parser.getText());
break;
}
}
}
return xmlContent.ToString();
}
catch (Exception e)
{
throw e;
}
}
下載完整代碼
關鍵詞:AndroidManifest, Decode, package, Apk, C#, IKVM.NET