Decode Android AndroidManifest.xml file via C#

简介:

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

 

本文转自chy710博客园博客,原文链接:http://www.cnblogs.com/chy710/archive/2013/05/17/AndroidManifestDecoder.html ,如需转载请自行联系原作者
相关文章
|
8月前
|
XML API PHP
Android使用XML-RPC实现blog客户端
Android使用XML-RPC实现blog客户端
70 2
|
5月前
|
开发工具 Android开发
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
209 4
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
|
5月前
|
存储 Java 数据库
基于全志H713 Android 11:给TvSettings添加default.xml默认值
本文介绍了在全志H713 Android 11平台上为TvSettings应用添加HDMI CEC功能的默认设置值的方法,通过修改SettingsProvider的源码和配置文件来实现默认值的设置,并提供了详细的步骤和测试结果。
133 0
基于全志H713 Android 11:给TvSettings添加default.xml默认值
|
5月前
|
XML Android开发 UED
"掌握安卓开发新境界:深度解析AndroidManifest.xml中的Intent-filter配置,让你的App轻松响应scheme_url,开启无限交互可能!"
【8月更文挑战第2天】在安卓开发中,scheme_url 通过在`AndroidManifest.xml`中配置`Intent-filter`,使应用能响应特定URL启动或执行操作。基本配置下,应用可通过定义特定URL模式的`Intent-filter`响应相应链接。
131 12
|
5月前
|
Shell Android开发
安卓scheme_url调端:在AndroidManifest.xml 中如何配置 Intent-filter?
为了使Android应用响应vivo和oppo浏览器的Deep Link或自定义scheme调用,需在`AndroidManifest.xml`中配置`intent-filter`。定义启动的Activity及其支持的scheme和host,并确保Activity可由外部应用启动。示例展示了如何配置HTTP/HTTPS及自定义scheme,以及如何通过浏览器和adb命令进行测试,确保配置正确无误。
|
7月前
|
Android开发 开发者
Android UI设计中,Theme定义了Activity的视觉风格,包括颜色、字体、窗口样式等,定义在`styles.xml`。
【6月更文挑战第26天】Android UI设计中,Theme定义了Activity的视觉风格,包括颜色、字体、窗口样式等,定义在`styles.xml`。要更改主题,首先在该文件中创建新主题,如`MyAppTheme`,覆盖所需属性。然后,在`AndroidManifest.xml`中应用主题至应用或特定Activity。运行时切换主题可通过重新设置并重启Activity实现,或使用`setTheme`和`recreate()`方法。这允许开发者定制界面并与品牌指南匹配,或提供多主题选项。
112 6
|
7月前
|
XML 存储 JavaScript
50. 【Android教程】xml 数据解析
50. 【Android教程】xml 数据解析
80 1
|
7月前
|
Shell Go 开发工具
How to decompile Google Android .apk file as readable dump【原创】
How to decompile Google Android .apk file as readable dump【原创】
38 0
|
8月前
|
Android开发
android string.xml文件中的整型和string型代替
android string.xml文件中的整型和string型代替
69 0
|
8月前
|
XML Android开发 数据格式
Caused by: android.view.InflateException: Binary XML file line #11: Error inflating class
Caused by: android.view.InflateException: Binary XML file line #11: Error inflating class
80 0