前言
前一阵子用到用命令行对Android文件进行解包、打包和编译,在这里把相关工具和命令做下记录。
apktool
apktool可以对akp包进行解包,或者把Android文件夹打包成apk包。
解包;-o
后面接的是输出路径;
apktool d -f <file>/temp.apk -o <file>
打包;
apktool b -f <file> -o <file>/temp.apk
aapt
aapt即Android Asset Packaging Tool,在SDK的build-tools目录下可以找到。
该工具可以用来操作apk文件,也可以用来编译Android的资源文件。
将res文件夹下的资源编译成R.java,存放在gen文件夹下;需要用到android.jar
,在SDK的platform里面可以找到;还需要用到你Android工程的AndroidManifest.xml
,会根据文件里面的包名package,在gen生成相应的路径;
aapt p -f -m -J <file>/gen -S <file>/res -I <file>android.jar -M <file>/AndroidManifest.xml
从apk包中把签名文件删除;
aapt r <file>/temp.apk META-INF
javac
javac是java文件的编译工具,可以将.java编译成.class。
javac只要电脑安装了jdk,并设置好环境变量就可以调用。
将.java编译成.class,并存放于制定路径:
javac -d <file>/class <file>/R.java
dx.bat
dx.bat是Android的批处理工具,能够将.class文件,编译成.dex文件。
.dex文件是Android虚拟机Dalvik的执行文件。
dx.bat在SDK的build-tools文件夹下可以找到。
将class文件夹下的所有.class文件,编译成.dex文件:
./dx --dex --output=<file>/dex/class.dex <file>/class
baksmali
baksmali是.dex文件的解析工具,可以将.dex文件解析成.smali文件。
.dex文件和.smali文件的区别:.dex是给Dalvik虚拟机执行用的,人看不懂;.smali是由.dex解析出来,人勉强能够看得懂。
使用baksmali将.dex解析成.smali:
java -jar baksmali-2.0.6.jar -o <file>/samli <file>/classes.dex
smali
smali是.smali文件的编译工具,可以将.smali编译成.dex文件。
java -jar smali-2.0.6.jar -o <file>/classes.dex <file>/samli
生成签名文件
Android的签名文件是Android的数字证书,使用Java的数字证书相关的机制,用来标识app的作者。
每个app都要有签名,不然系统不给安装。
同一个app但是有不同的签名,系统还是会认为这是两个不同的app,会要求后面安装的app更改包名。
生成签名文件,先cd到Java的安装目录下的Home/bin文件夹。
命令行输入如下命令,回车后按提示进行下一步;-keystore
是要输出的签名文件;-keyalg
是算法模式;-validity
是证书有效期,单位:天;-alias
是签名文件的别名。
keytool -genkey -keystore <file>/feiyumobile.keystore -keyalg RSA -validity 10000 -alias feiyumobile.keystore
使用签名文件签名
使用已经产生的签名文件,为apk签名;此处不用特殊工具,只需安装了jdk就行;
jarsigner -digestalg SHA1 -sigalg MD5withRSA -keystore <keystore_file> -signedjar <output_apk> <input_apk> <alias>
带密码的命令行,可以不用手动输入密码:
jarsigner -digestalg SHA1 -sigalg MD5withRSA -keystore <keystore_file> -storepass <storepass> -keypass <keypass> -signedjar <output_apk> <input_apk> <alias>
参数解释:
- keystore_file : .keystore 文件
- storepass : keystore密码
- keypass : 别名密码
- output_apk :输出.apk文件
- input_apk :输入.apk文件
- alias :别名
zipalign
zipalign是字节对齐工具,可以给apk进行优化,使得运行时Android系统与app间的交互更加有效率。
zipalign可以在SDK的build-tools找到。
使用zipalign给apk优化;-v 4
是指4个字节4个字节对齐;
./zipalign -v 4 <file>/temp_sign.apk <file>/final.apk
总结
- 使用这些工具,可以给Android进行自动打包,也可以给.apk文件进行反编译。
- 使用apktool解包,src文件夹下得到的是.smali格式的文件。
- 可以修改.smali文件,然后用apktool打包,这样可以达到偷偷修改别人的代码的目的。
- 想要查看别人apk里面的代码,可以先使用zip解压工具解压apk,然后使用dex2jar工具,将.dex解析成jar包,然后使用jd-gui工具查看jar包里的代码。