Decode Android AndroidManifest.xml file via C#

來源:互聯網
上載者:User

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

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.