Decode Android AndroidManifest.xml file via C#

本文介绍如何在C#环境下利用IKVM.NET将AXMLPrinter2.jar转换为DLL,进而解码并获取AndroidManifest.xml文件中的Package和Version信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

转载于:https://www.cnblogs.com/chy710/archive/2013/05/17/AndroidManifestDecoder.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值