Apk文件的格式
Android application package文件。每个要安装到android平台的应用都要被编译打包为一个单独的文件,后缀名为.apk,其中包含了应用的二进制代码、资源、配置文件等。
apk文件实际是一个zip压缩包,可以通过解压缩工具解开。可以用zip解开*.apk文件,下面是一个helloword的apk示例文件。
|– AndroidManifest.xml
|– META-INF
| |– CERT.RSA
| |– CERT.SF
| `– MANIFEST.MF
|– classes.dex
|– res
| |– drawable
| | `– icon.png
| `– layout
| `– main.xml
`– resources.arsc
Manifest文件:AndroidManifest.xml是每个应用都必须定义和包含的,它描述了应用的名字、版本、权限、引用的库文件等等信息[ , ],如要把apk上传到Google Market上,也要对这个xml做一些配置。注意:在apk中的xml文件是经过压缩的,不可以直接打开。
Res文件:res文件夹下为所有的资源文件。
resources.arsc文件:为编译后的二进制资源文件,许多做汉化软件的人都是修改该文件内的资源以实现软件的汉化的。
META-INF目录:META-INF目录下存放的是签名信息,用来保证apk包的完整性和系统的安全。在eclipse编译生成一个apk可包时,会对所有要打包的文件做一个校验计算,并把计算结果放在META-INF目录下。而在OPhone平台上安装apk包时,应用管理器会按照同样的算法对包里的文件做校验,如果校验结果与META-INF下的内容不一致,系统就不会安装这个apk.这就保证了apk包里的文件不能被随意替换.比如拿到一个apk包后,如果想要替换里面的一幅图片,一段代码,或一段版权信息,想直接解压缩、替换再重新打包,基本是不可能的.如此一来就给病毒感染和恶意修改增加了难度,有助于保护系 统的安全。
classes.dex是java源码编译后生成的java字节码文件。但由于Android使用的dalvik虚拟机与标准的java虚拟机是不兼容的,dex文件与class文件相比,不论是文件结构还是opcode都不一样。
XML文件的反编译
在apk中的xml文件是经过压缩的,可以通过AXMLPrinter2工具解开,具体命令为:
java -jar AXMLPrinter2.jar AndroidManifest.xml
HelloAndroid程序中Manifest文件的实例:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.android.com/apk/res/android
package="name.feisky.Android.test
Android:versionCode="1
Android:versionName="1.0" >
<application
Android:icon="@7F020000
Android:label="@7F040001" >
<activity
Android:name=".HelloAndroid
Android:label="@7F040001" >
<intent-filter>
<action Android:name="android.intent.action.MAIN" >
</action>
<category Android:name="android.intent.category.LAUNCHER" >
</category>
</intent-filter>
</activity>
</application>
<uses-sdk Android:minSdkVersion="6" >
</uses-sdk>
</manifest>
而原文件为:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.android.com/apk/res/android
package="name.feisky.Android.test
Android:versionCode="1
Android:versionName="1.0" >
<application
Android:icon="@drawable/icon
android:label="@string/app_name" >
<activity
Android:name=".HelloAndroid
Android:label="@string/app_name" >
<intent-filter>
<action Android:name="android.intent.action.MAIN" />
<category Android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-sdk Android:minSdkVersion="6" />
</manifest>
classes.dex文件反编译
classes.dex是java源码编译后生成的java字节码文件。但由于Android使用的dalvik虚拟机与标准的java虚拟机是不兼容的,dex文件与class文件相比,不论是文件结构还是opcode都不一样。目前常见的java反编译工具都不能处理dex文件。
Android模拟器中提供了一个dex文件的反编译工具,dexdump。
1.用法为首先启动Android模拟器,把要查看的dex文件用adb push上传的模拟器中,
2.然后通过adb shell登录,找到要查看的dex文件,执行dexdump xxx.dex。但是这样得到的结果,其可读性是极差的。下面介绍一个可读性比较好的工具。
工具准备:
1、把dex文件反编译为jar文件的工具。(dex2jar)
2、把jar反编译为java的工具。(JD-GUI)
反编译的步骤
1、从APK中提取classes.dex文件,对APK文件解压即可得到。将其放到dex2jar的目录下,打开cmd,运行dex2jar.bat classes.dex,生成classes.dex.dex2jar.jar。
2、运行JD-GUI工具,打开上面的jar文件,即可看到源代码。
HelloAndroid实例:
import Android.app.Activity;
import Android.os.Bundle;
public class HelloAndroid extends Activity {
public void onCreate(Bundle paramBundle) {
super.onCreate(paramBundle);
setContentView(2130903040);
}
}
其原程序为:
import Android.app.Activity;
import Android.os.Bundle;
public class HelloAndroid extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
Android反编译工具Apktool使用
Android反编译工具:Apktool,支持Linux 、Windows下工作。
安装步骤如下:
1.首先安装需要JAVA环境,先下载JDK/JRE,点击下载,已经有JAVA环境的可跳过此步。
2.到code.google上下载apktool.jar以及相关文件:http://code.google.com/p/android-apktool/downloads/list
点击下载apktool-1.0.0.tar.bz2 和apktool-install-windows-2.1_r01-1.zip。
3.解压apktool.jar 到 C:\Windows文件夹下。
解压apktool-install-windows.zip到任意文件夹。
4.点击开始菜单,运行,输入CMD回车,用cd命令转到刚刚解压apktool-install-windows所在的文件夹,输入apktool,出现一些命令说明即成功安装。
Apktool 命令
apktool d geek.apk test 反编译 geek.apk到文件夹test
apktool b geek 从文件夹geek重建APK,输出到ABC\dist\out.apk
Android命令行编译方法,不用Eclipse IDE
想必大家都知道Google官方提供的Android开发环境是Eclipse,仅仅给出了ADT插件。但是在Android SDK Tool文件夹中我们可以找到一个名为activityCreator.bat的批处理文件,它调用的是tools\lib\activityCreator文件夹中的activityCreator.exe程序,其实为一个Python语言解释程序。activityCreator的Activity创建脚本全部参数使用方法如下:
Usage:
activityCreator [--out outdir] [--ide intellij] your.package.name.ActivityName
Creates the structure of a minimal Android application.
The following will be created:
- AndroidManifest.xml: The application manifest file.
- build.xml: An Ant script to build/package the application.
- res : The resource directory.
- src : The source directory.
- src/your/package/name/ActivityName.java the Activity java class. packageName
is a fully qualified java Package in the format . … (with
at least two components).
- bin : The output folder for the build script.
Options:
--out : specifies where to create the files/folders.
--ide intellij: creates project files for IntelliJ
比如:定位目录到Android SDK的Tools目录中,执行activityCreator -out ReleaseDir cn.com.android.www
其中 -out参数为设置输出文件夹为ReleaseDir,而最后的cn.com.android.www为我们的Package包名称。
注意:由于Android SDK对应开发平台不同,而对应编译文件也不同,Windows下为批处理activityCreator.bat,而Linux系统自带Python解释器,所以为activityCreator.py。
Android反编译小结
总结反编译主要的目的在于学习。利用反编译进行相关的汉化或修改,都是不道德的!
大家都知道,将apk文件解压后有两部分文件需要处理,一种是xml文件,另一种一个dex文件(.dex),我们可以从.dex文件中得到.class,利用后者再得到大家垂涎已久的java文件。
下面分别针对这三种格式的文件进行反编译处理;
1.对xml文件进行包的解析,一般有两种方式:apktool(推荐)和AXMLPrinter2.jar;
2.从dex到class公认dex2jar.bat,实现反编译;公认的强者;
3.而class到java的方式要更多样化一些,因为只是查看反编译后的代码:jd-gui(推荐),Jodeclipse(Jode的Eclipse插件),JadClipse(Jad的Eclipse插件)。
还是作个大致介绍吧:
1.首先把apk文件改名为.zip,然后解压缩其中的class.dex文件,它就是java文件编译再通过dx工具打包成的。
2.把class.dex拷贝到dex2jar.bat所在目录。运行dex2jar.bat class.dex,生成classes.dex.dex2jar.jar。
3.运行JD-GUI工具(绿色软件,好用的软件!),打开上面的jar文件,即可看到java源代码。
A1. apktool:
通常用于生成程序的源代码和图片、XML配置、语言资源等文件。我们对图片和语言资源等文件修改后,可以再把它们编译打包成APK,签名后就是手机可以安装的本地化/修正版APK了。支持Linux 、Windows下工作。
安装步骤:
1.安装JAVA环境(官方推荐jdk 1.6);
2.下载apktool.jar:http://code.google.com/p/android-apktool/downloads/list
点击下载apktool1.3.2.tar.bz2 和apktool-install-windows-2.2_r01-3.tar.bz2 (不一定是这个,但最好选最新版本的吧!);
3.解压apktool1.3.2.tar.bz2得到apktool.jar;
解压apktool-install-windows.zip到任意文件夹,将apktool.jar拷入此文件夹中(也有人说是直接全部拷入C:/Windows,一样的);
(目前此文件夹中有三个文件:apktool.jar/apktool.bat/aapt.exe)
4.cmd命令行进入到解压apktool-install-windows-2.2_r01-3.tar.bz2所得的文件夹,输入apktool测试是否安装成功;
安装成功后,下面开始反编译过程:
1.apktool d (要反编译的文件) (输出文件夹)
如:
apktool d XXX.apk (目标文件夹) 反编译 geek.apk到文件夹test
2.apktool b (目标文件夹)
从目标文件夹中重建APK,生成的APK在"目标文件夹"\dist文件夹里,叫out.apk。
这个out.apk是没有签名的,所以不能直接装到手机里。签名工具和方法见http://www.hiapk.com/bbs/thread-21261-1-1.html,这里就不说了。签名后得到的APK,就是可以装到手机里的了。
A2. AXMLPrinter2.jar
将它放到android-sdk-windows-1.5_r3\tools文件夹中。运行cmd,进入tools目录,运行java -jar AXMLPrinter2.jar main.xml > main.txt;
于是我们就得到了反编译后的XML文件。
经历了这么多,我们得到的只是部分布局文件和资源文件,但java文件还是"犹抱琵琶半遮面"。
下面,让我们掀起她的红盖头来:
B. dex2jar
下载:http://code.google.com/p/dex2jar/downloads/list
方法:
1.首先找到Android软件安装包中的classes.dex (解压得到);
它就是java文件编译再通过dx工具打包成的,所以现在我们就用上述提到的2个工具来逆方向导出java源文件。
2.把classes.dex拷贝到dex2jar.bat所在目录;
在命令行模式下定位到dex2jar.bat所在目录,运行 dex2jar.bat classes.dex,生成classes.dex.dex2jar.jar,成功了一半!
C1. JD-GUI
下载:http://java.decompiler.free.fr/?q=jdgui
方便好用,直接解压得到JD-GUI,用它打开上面的jar文件,File-->Save JAR Source,即可看到梦寐以求的java源代码。
我们也可以解压B步骤得到的jar文件得到class文件,到这里,我们就要用到Jodeclipse和JadClipse了。
C2. Jodeclipse---Jode的Eclipse插件 C3. JadClipse---Jad的Eclipse插件
关于这两个Eclipse插件的安装可见下面链接:
http://tgyd2006.javaeye.com/blog/553061
(C4. 还有朋友提到DJ Java Decompiler,没用过,可以一试!)
但也有人提出此问题:
自从eclipse升级到3.3以后jad插件就一直没有成功的安装上去,网上看了好多文章也是以前版本的安装方法,3.3目前通过eclipse的software update的插件安装方式已经不行了。
解决方法如下:
1.从http://www.kpdus.com/jad.htmldownload地址下载最新的jad,我目前下载的是jadnt158.zip。
2.从http://nchc.dl.sourceforge.net/s ... jadclipse_3.3.0.jar地址下载jadclipse_3.3.0.jar,拷贝到eclipse的plugins目录下。
3.启动或重起eclipse,修改window -> Preferences -> Java -> JadClipse 下的Path to decompiler 如:D:\eric\jadnt158\jad.exe(jadnt158.zip解压后的目录)。
4.Windows -> Perference -> General -> Editors -> File Associations中修改“*.class”默认关联的编辑器为“JadClipse Class File Viewer” 大功告成,之后在java类里按住ctrl点击类就可以看到它jad反编译后的源带码了。
如果发现安装了没有效果,可以删除eclipse主目录下的\configuration\org.eclipse.update后,再执行eclipse -clean试试。
最后,将得到的java文件和得到的xml文件组合可得一个android工程,即可得到相对比较完整的apk源码;但也有些额外加的包没被编译出来。