Copyright © android 2011 . Powered by
青藤园
Courtesy of Open Web Design
& Hotels - Dubai
如何在非Android平台上获取Apk的信息
于是转而看看有没有人写过这样的包并共享,在搜索中意外地在pudn发现一个貌似是我想要的东西。下载下来之后,发现src中的源码打开之后竟然是乱码, 用反编译工具一看,果然真够恶心的,不想共享代码就算了,把bin文件夹中的.class文件更名为.java文件就放到src中。不管,继续看反编译后 的代码,我只是学习而已。
虽然代码很让我纠结,比如类名首字母小写,某些方法名与类名一样,还有很纠结的try catch的使用就不说了。值得开心和要感谢作者的是,从那里我看到了最初我所想的办法的实现。于是决定自己也动手试试。
思路及过程:
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(InputStream stream)及log()两个成员方法,代码与原来的main方法及log方法基本一样,调用原来的AXMLPrinter2中的类进行解析。但是直接 将输入指定为InputStream,增加一个StringBuffer对象,输出到StringBuffer中。去掉了原来的main()及log() 方法。当然,StringBuffer对象是私有的,还需要一个public StringBuffer getBuffer()方法返回输出的结果。
5、将StringBuffer对象转为InputStream对象,并用JDom进行解析。
6、解析得到apk的信息。
以上的代码已经完成。由于后天就要离校,这几天在准备着一些事情,时间匆促心又不定,代码写得很慢很乱,回头整理后再在这里和我的另一个博客msdxblog.sinaapp.com补上。
一开始是想采用这样的暴力方法。但是说实话,这样的方法太笨了。而且目前还没有办法在代码中实现得到apk的程序名及图标,所以一开始是打算用传说中的 google android隐藏api来实现的。尝试下载android源码,在windows下不成功,笔记本当时没带到实验室,后来得到了我所需要的由源码编译得 到的传说中的classes.jar。但是搞了半天才发现,我没有能力将它移植到不用activity。
对于我上述所实现或还没实现的功能,如果来访的高手有更灵巧的方法,请不吝赐教。
收获:
对java中的ZipFile等相关类有所了解,能够使用其解压文件。
学习了如何利用反射机制得到类里面的私有方法并调用。
知道了AndroidManifest.xml文件中的targetSdkVersion表示什么意思。
反省:
JUnit4要好好看看了。上次的视频只看了一集,这次有所需要而写测试,结果果然很糟糕。
Java的反射机制应该要更深入去了解。
原文:http://blog.csdn.net/hstar00004/article/details/7200179
标签:
Android Apk
Posted by
android_boy @
2012-1-14 10:19:16
阅读(305)
评论(1)
上一篇:Android Service之本地服务详解
下一篇:Android反编译出源文件和资源文件
上一篇:Android Service之本地服务详解
下一篇:Android反编译出源文件和资源文件
Feedback
你还可以输入600/600个字符
发表评论
回复 2012-1-24 18:10:33 by Geek_Soledad