非android平台获取Apk的信息

最近在看如何获取Android应用apk的一些信息,如版本号,使用的最低平台版本,使用的权限等等。无奈在网上看到的一些文章,讲到的基本上都是需要用到Context对象,需要在Android平台上运行。

于是转而看看有没有人写过这样的包并共享,在搜索中意外地在pudn发现一个貌似是我想要的东西。下载下来之后,发现src中的源码打开之后竟然是乱码,用反编译工具一看,果然真够恶心的,不想共享代码就算了,把bin文件夹中的.class文件更名为.java文件就放到src中。不管,继续看反编译后的代码,我只是学习而已。

虽然代码很让我纠结,比如类名首字母小写,某些方法名与类名一样,还有很纠结的trycatch的使用就不说了。值得开心和要感谢作者的是,从那里我看到了最初我所想的办法的实现。于是决定自己也动手试试。

思路及过程:

1、百度得知apk也是使用了zip压缩。用ZipFile等相关类,读取apk文件,得到AndroidManifest.xml文件的InputStream。

2、然后使用AXMLPrinter2.jar进行将优化之后的AndroidManifest.xml恢复成原来xml结构的文件。本来是先把AndroidManifest.xml解压并生成解压后的文件,然后再采用命令行调用AXMLPrinter2的方法,后来一想,我只想得到apk信息,为什么还要生成这样的临时文件?看AXMLPrinter2的Manifest文件,知道它是运行里面的test.AXMLPrinter.class。

3、果然对这个工具进行反编译,拿到该文件的源码,看到它输出是调用里面的log()方法,在该方法中调用System.out.printf()及System.out.println()输出。

4、创建一个AXMLPrinter的类,代码与原来的基本相同,编写startXMLPrint(InputStreamstream)及log()两个成员方法,代码与原来的main方法及log方法基本一样,调用原来的AXMLPrinter2中的类进行解析。但是直接将输入指定为InputStream,增加一个StringBuffer对象,输出到StringBuffer中。去掉了原来的main()及log()方法。当然,StringBuffer对象是私有的,还需要一个publicStringBuffergetBuffer()方法返回输出的结果。

5、将StringBuffer对象转为InputStream对象,并用JDom进行解析。

6、解析得到apk的信息。

以上的代码已经完成。由于后天就要离校,这几天在准备着一些事情,时间匆促心又不定,代码写得很慢很乱,回头整理后再在这里和我的另一个博客msdxblog.sinaapp.com补上。

一开始是想采用这样的暴力方法。但是说实话,这样的方法太笨了。而且目前还没有办法在代码中实现得到apk的程序名及图标,所以一开始是打算用传说中的googleandroid隐藏api来实现的。尝试下载android源码,在windows下不成功,笔记本当时没带到实验室,后来得到了我所需要的由源码编译得到的传说中的classes.jar。但是搞了半天才发现,我没有能力将它移植到不用activity。

对于我上述所实现或还没实现的功能,如果来访的高手有更灵巧的方法,请不吝赐教。

收获:

对java中的ZipFile等相关类有所了解,能够使用其解压文件。

学习了如何利用反射机制得到类里面的私有方法并调用。

知道了AndroidManifest.xml文件中的targetSdkVersion表示什么意思。

反省:

JUnit4要好好看看了。上次的视频只看了一集,这次有所需要而写测试,结果果然很糟糕。

Java的反射机制应该要更深入去了解。

apk

相关推荐