1.如何反编译apk文件得到源码和XML文件
2.å¦ä½è¿è¡APKåç¼è¯
3.apk反编译,编译回编出错了?
如何反编译apk文件得到源码和XML文件
最近因为一些事所以需要得到师兄的某个apk的源代码,但师兄说那个项目包已经删了,文件哎,反编没办法,编译只能自己想办法了。源码译订购 .net源码后来找到了反编译apk的文件方法,现在拿出来分享下。反编其实这个方法网上都有,编译我只是源码译记载一下自己这段时间的学习情况。
1.下载工具
首先,文件要反编译需要下面这
4个工具:
dex2jar:将apk中的反编classes.dex转化成Jar文件。
JD-GUI:反编译工具,编译可以直接查看Jar包的源码译源代码。
apktool:反编译工具,文件通过反编译APK中XML文件,直接可以查看。ARTNET转码器源码
apktool-install-windows-r-ibot:辅助windows批处理工具。
2.解压apk
直接右键解压apk就行了,这没什么好说的。解压后会有个dex后缀的文件,下面会用到
3.反编译dex文件
1)解压下载的dex2jar,把解压后的文件夹放到系统盘跟目录中并把这个目录加到系统path变量中,就可以直接用:dex2jar.bat或dex2jar.sh转换dex文件了。
2)DOS行命令如下:dex2jar.bat
xx\classes.dex(xx是java中修改源码classes.dex文件所在的路径)。
将在同目录得到普通jar包:classes_dex2jar.jar,就可以用处理普通jar包的方法来反编译这个jar包得到原文件。
4.反编译jar文件
1)解压压缩文件JD-GUI
2)运行该文件夹里的jd-gui.exe,打开上面生成的jar包,
即可看到源代码了。
5.反编译xml文件
为什么要发编译xml文件呢?因为直接解压apk得到的xml文件是乱码来的,我们需要用工具把它调会正常来
具体操作方法:
1)将下载的apktool和apktool-install-windows-r-ibot两个包解压到同一个文件夹下,这个文件夹有三个文件:aapt.exe,纯c绘制源码apktool.bat,apktool.jar。
2)把这个文件夹也放到系统盘的根目录中并把这个目录加到path变量中。以HelloWord.apk为例:
3)在DOS命令行中输入:apktool
d
xx\HelloWord.apk
HelloWord得到HelloWord文件夹,此文件夹中的xml文件就是编译好的可以正常查看的文件。
6.后话
不过,说到底反编译还是反编译,还是linux软件源码网站不能完全地还原出真正的源代码的,比如一般会出现下面这样的问题:
setContentView();
在真正的源代码中其实是这样的:
setContentView(R.layout.welcome)
å¦ä½è¿è¡APKåç¼è¯
å¦ä½è¿è¡APKåç¼è¯
æ们ä¸è½½å°æäºapkçæ¶åï¼å¯è½æ»æ³å¦ä¹ ä¸å«äººæ¯æä¹è¿è¡ç¨åºè®¾è®¡çï¼æè ææ ·ä½¿ç¨xmlæ件å¸å±çï¼è¿æ¶å°±æ³å°å°apkæ件çåç¼æ¹ä¸ºrar并解åï¼æç»å¾å°ä¸äºå¾çèµæºåå¾å¤æå¼ä¸ºä¹±ç çæ件ï¼å¯è§è¿ç§æ¹å¼ä¸å¯è¡ï¼è¿å°±éè¦ä½¿ç¨ä¸é¢çå·¥å ·å¯¹apkè¿è¡åç¼è¯äºã
ä¸ãå·¥å ·åå¤ï¼apktoolãdex2jarãjd-gui
å·¥å ·å ä¹å¯ä»¥å¨è¿éä¸è½½ã
1ãdex2jarå¯ä»¥å¨è¿éä¸è½½ï¼jd-guiå¯ä»¥å¨è¿éä¸è½½ã
2ãapktoolï¼å¯ä»¥å°Googleå®æ¹ä¸è½½ï¼apktool-1.0.0.tar.bz2ï¼éé¢æapktool.jarï¼åapktool-install-windows-2.1_r-1.zip两个å é½è¦ä¸ã解åapktool.jarå° C:\Windowsï¼è§£åapktool-install-windows.zipå°ä»»ææ件夹ï¼ä¾å¦Eçæ ¹ç®å½ï¼ã
äºã使ç¨dex2jar + jd-gui å¾å°apkçjavaæºç ï¼æ¥éª¤å¦ä¸ï¼
1ãç¨.raræå¼apkææ¡£ï¼å°classes.dexæ件解ååºæ¥ï¼ç¶å使ç¨å·¥å ·åç¼è¯æ.jaræ件ã
å¨cmdä¸è¿å ¥dex2jar.batæå¨è·¯å¾ï¼ç¶åè¾å ¥âdex2jar.bat XXXâï¼XXXæçæ¯ä½ è¦åç¼è¯çapkä¸çclasses.dexæ件æå¨è·¯å¾åå称ï¼æ¯å¦ï¼æçdex2jar.batå¨D:\Android\apk_decode\dex2jar-0.0.7-SNAPSHOTè·¯å¾ä¸ï¼classes.dexå¨D:\Androidä¸ï¼æä»¥ä½ è¿å ¥å°dex2jar.batè·¯å¾åï¼è¾å ¥dex2jar.bat D:\Android\classes.dexï¼è¿æ ·ä¼çæä¸ä¸ªjaræ件ã
2ãç¨jd-guiåç¼è¯å·¥å ·å°å¾å°.jaræ件åç¼è¯æ.javaæ件ã
ä¸ã使ç¨apktoolå¾å°apkçxmlæ件
1ãWin+R è¿è¡CMDï¼ç¨cdå½ä»¤è½¬å°apktool-install-windowsæå¨æ件夹ï¼è¾å ¥å½ä»¤ï¼
apktool d XXX.apk ABC åç¼è¯XXX.apkå°æ件夹ABC
2ã å¨è§£ååçæ件夹ä¸å¯ä»¥å¾å°apkçxmlé ç½®æ件ã
åã第äºæ¥å¾å°çç¨åºæºä»£ç å第ä¸æ¥å¾å°çxmlæ件ç»åä¸ï¼å°±æä¸ä¸ªandroidå·¥ç¨ï¼å³å¯å¾å°å®æ´çapkæºç ã
apk反编译,回编出错了?
不影响正常运行,只是编译环境,
compileSdkVersion 告诉 Gradle 用哪个 Android SDK 版本编译你的应用。使用任何新添加的 API 就需要使用对应 Level 的 Android SDK。
需要强调的是修改 compileSdkVersion 不会改变运行时的行为。当你修改了 compileSdkVersion 的时候,可能会出现新的编译警告、编译错误,但新的 compileSdkVersion 不会被包含到 APK 中:它纯粹只是在编译的时候使用。(你真的应该修复这些警告,他们的出现一定是有原因的)
因此我们强烈推荐总是使用最新的 SDK 进行编译。在现有代码上使用新的编译检查可以获得很多好处,避免新弃用的 API ,并且为使用新的 API 做好准备。
注意,如果使用 Support Library ,那么使用最新发布的 Support Library 就需要使用最新的 SDK 编译。例如,要使用 .1.1 版本的 Support Library ,compileSdkVersion 就必需至少是 (大版本号要一致!)。通常,新版的 Support Library 随着新的系统版本而发布,它为系统新增加的 API 和新特性提供兼容性支持。
解决办法有两种(我测试的前提是反编译的母包是没有包含这两个属性的):
(1)使用apktool 2.3.2版本,因为2.3.3之后版本针对appt和appt2做了修改,最后AndroidManifest.xml里面不在包含compileSdkVersion和compileSdkVersionCodename
(2)清除原本的1.apk,重新指定framework-dir:java -jar apktool_2.4.0.jar empty-framework-dir --force,最后发现可以回编译成功,但是AndroidManifest.xml还是会包含compileSdkVersion和compileSdkVersionCodename。