apktool 现在最流行的apk反编译工具,下载apktool之后会发现下面几个文件(Windows平台,mac 和Linux应该类似)
>apktool
Apktool v1.5.2 - a tool for reengineering Android apk files
Copyright 2010 Ryszard Wi?niewski <brut.alll@gmail.com>
with smali v1.4.1, and baksmali v1.4.1
Updated by @iBotPeaches <connor.tumbleson@gmail.com>
Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
Usage: apktool [-q|--quiet OR -v|--verbose] COMMAND [...]
COMMANDs are:
d[ecode] [OPTS] <file.apk> [<dir>](反编译)
Decode <file.apk> to <dir>.
OPTS:
-s, --no-src
Do not decode sources. (不反编代码)
-r, --no-res
Do not decode resources.(不反编资源文件,因为Android中的资源都是重新打包成二进制格式的,所以也需要反编之后才能看因为比较耗时,所以有这个选项可以跳过)
-d, --debug
Decode in debug mode. Check project page for more info.
-b, --no-debug-info
Baksmali -- don't write out debug info (.local, .param, .line, etc.)
-f, --force
Force delete destination directory. (如果反编的文件夹已经存在,强制删除)
-t <tag>, --frame-tag <tag>
Try to use framework files tagged by <tag>.
--frame-path <dir>
Use the specified directory for framework files (指定framework文件的路径)
--keep-broken-res
Use if there was an error and some resources were dropped, e.g.:
"Invalid config flags detected. Dropping resources", but you
want to decode them anyway, even with errors. You will have to
fix them manually before building.
b[uild] [OPTS] [<app_path>] [<out_file>](重新打包)
Build an apk from already decoded application located in <app_path>.
It will automatically detect, whether files was changed and perform
needed steps only.
If you omit <app_path> then current directory will be used.
If you omit <out_file> then <app_path>/dist/<name_of_original.apk>
will be used.
OPTS:
-f, --force-all (强制打包,略过错误检测,因为资源可能会变化或者反编译的时候就损坏了)
Skip changes detection and build all files.
-d, --debug
Build in debug mode. Check project page for more info.
-a, --aapt (指定一个 aapt ,原始的apk打包的时候可能使用的版本可能比较新,这时候如果用较旧的aapt可能会出现问题)
Loads aapt from specified location.
if|install-framework <framework.apk> [<tag>] --frame-path [<location>]
Install framework file to your system.
For additional info, see: http://code.google.com/p/android-apktool/
For smali/baksmali info, see: http://code.google.com/p/smali/
反编译一个APK:执行 apktool d xxx.apk
就可以把 xxx.apk 反编译,反编译之后的东西在 xxx 这个文件夹中,调用 apktool b xxx out.apk
就可以把 xxx 文件夹中的东西打包成 out.apk。
有两个没有解释的选项 -d
和 -b
这两个选项是在把dex文件中的代码反编译成smali文件的时候使用的,具体也没有深入研究过,可以参考下
这里.
有些选项是和framework文件相关的,这是什么东西呢?如果使用过一次apktool这个工具,就会发现在当前用户名的目录下会多一个目录,比如我的
机器 C:\Users\Administrator\apktool\framework
这个目录中包含一个文件叫1.apk, 解压1.apk里面只包含一个 resources.arsc 文件,这是
Android中资源文件的打包方式,res目录下的非二进制资源都会按照一定格式打包在这中文件中。
但是这个文件究竟做什么用的呢?原因是这样的,在写Android程序的时候我们有时候会引用一些系统的资源,比如 android.R.string.ok
这会
引用一个内置在系统里面的字符串,如果App在机器上运行的时候使用到了这个资源,就是显示 “Ok” 这个字符串,但是在反编apk的时候,解析
到了这个值(R文件中定义的都是整型值比如 android.R.string.ok 等价于 0x0104000a)反编工具看到的是0x0104000a
这样一个值我们需要
一个映射表找到对应的资源, resources.arsc 文件就是这个映射表,里面定义了”0x0104000a” -> “Ok” 的映射。
在apktool中内置一个1.apk是标准Android程序需要的,但是在修改一些特有机型上的App的时候比如HTC的 sense UI 的home程序,这个桌面程序 会引用一些标准Android中不存在,但是这台机器上存在的资源,那么就需要专门再指定HTC机器上的framework文件。具体可以看看 这里的描述。
反编的时候一个常见问题是Android的版本一直在升级,framework 文件也一直在变化,这导致不同版本的apktool所携带的frmework文件也会升级。但是我们
这些用现成工具搞反编译的,有时候会下载不同版本的apktool工具,然后每个工具都会引用用户名\apktool\framework\1.apk
这个文件,但是
这个文件适用的版本又不一样,就会导致反编译不成功,这时候只要删除这个文件,让 apktool 重新再生成一次就行了。
PS:使用友盟的渠道打包工具的时候,有时候会报一些错误”Parsing ‘AndroidManifest.xml’ eror:” 这个错误实际是由于打包工具反编译APK失败 导致的,反编失败有两种可能一种是 java的环境变量设置有错误,一种是上面提到的 framework文件版本不对导致的,删除旧的就行了。
nTop 05 December 2014