android-apk解包打包
android-apk解包打包, 以下所有操作都需要在配置好 java 环境下进行
前篇
- android apk解包和打包 - https://blog.csdn.net/u011435933/article/details/89555328
- apk解包+修改源码+重新打包 修改Android端app教程 修改apk文件教程 - https://blog.51cto.com/u_15328720/3384769
- apk解包修改后重新打包 (好文) - https://blog.csdn.net/qq_16692517/article/details/107220707
- Android apk反编译,smali文件修改,重新打包 - https://blog.csdn.net/q610098308/article/details/105336399
- java 反编译 修改smali和重新打包 (好文) - https://blog.csdn.net/weixin_28947723/article/details/115075813
- 几种Android混淆和逆向工具介绍 - https://blog.51cto.com/u_15060511/4080326
- Android反编译工具 apktool 、dex2jar、jd-gui、jadx的对比及使用 - https://zhuanlan.zhihu.com/p/389584833
- https://developer.aliyun.com/article/534391
- 相关工具下载
- jd-gui 下载 - https://github.com/java-decompiler/jd-gui/releases
- dex2jar - https://github.com/pxb1988/dex2jar
- smali 与 baksmali 下载 - https://bitbucket.org/JesusFreke/smali/downloads/?tab=downloads
- jadx - https://github.com/skylot/jadx/releases
- apktool - https://bitbucket.org/iBotPeaches/apktool/downloads/
- bundletool - https://github.com/google/bundletool/releases
- AXMLPrinter2.jar - https://code.google.com/archive/p/android4me/downloads
反编译流程图
使用 apktool
解包 apk
1
$ java -jar -Duser.language=en -Dfile.encoding=UTF8 apktool.jar d [test_hi.apk] -o [test_hi]
会将 test_hi.apk 解包到 test_hi 目录
打包 apk
1
$ java -jar -Duser.language=en -Dfile.encoding=UTF8 apktool.jar b [test_hi]
将 test_hi 目录打包, 在 test_hi/dist 目录下生成 test_hi.apk
打包完后需要 4 字节对齐
1
$ zipalign -p -f -v 4 [test_hi.apk] [test_hi_align.apk]
- 不对齐的情况下, 在 Android 11+ (R+, sdk 30+) 机子安装 apk 会报错:
Failure [-124: Failed parse during installPackageLI: Targeting R+ (version 30 and above) requires the resources.arsc of installed APKs to be stored uncompressed and aligned on a 4-byte boundary]
- 不对齐的情况下, 在 Android 11+ (R+, sdk 30+) 机子安装 apk 会报错:
此时生成的 apk 需要签名一下, 否安装报错
1
adb: failed to install test_hi.apk: Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES: Failed to collect certificates from /data/app/vmdl2044401184.tmp/base.apk: Attempt to get length of null array]
签名参考 [签名 apk 包](#签名 apk 包)
踩坑
apk 文件夹编译 apk 报资源错误
错误: Error: Resource is not public
解决办法: 在 反编译 apk 时, 可以通过 -r
参数来避免resc的反编译,见下图。这样在打包的时候就不会重新编译 resc 文件包括 xml
参考: 反编译工具apktool使用问题 - https://www.jianshu.com/p/47a5511e17bf
使用 jadx 工具查看 apk (推荐)
使用, 直接拖动 apk, jar 到工具即可
使用 smali 工具
使用的是 baksmali-2.2.2.jar 和 smali-2.2.2.jar
dex 解包出 smali
1
$ java -jar baksmali-2.2.2.jar d [classes.dex] -o [myout]
解出 classes.dex 的 smali 会生成到 myout 目录下
smali 打包成 dex
1
java -jar smali-2.2.2.jar assemble [myout] -o [my_classes.dex]
将 myout 目录打包成 my_classes.dex 文件
签名 apk 包
命令
1
$ java -jar apksigner.jar sign -verbose --v1-signing-enabled false --v2-signing-enabled true --ks [证书文件.jks] --ks-key-alias [证书别名] --ks-pass pass:[证书密码] --key-pass pass:[别名密码] --out [out_sign.apk] --in [in_unsign.apk]
不能使用一下命令打包
1
$ jarsigner -verbose -keystore [证书文件.jks] -storepass [证书密码] -signedjar [签名后输出文件.apk] [需要签名的文件.apk] [证书别名]
安装在 安卓 11+ 机子上会报错:
ERROR: Target SDK version 32 requires a minimum of signature scheme v2; the APK is not signed with this or a later signature scheme
dex 转 jar
dex2jar 和 jd-gui 只是查看源码的工具
使用 dex2jar 工具
1
2$ d2j-dex2jar.bat [classes3.dex] --force -o [aaa.jar]
dex2jar classes3.dex -> aaa.jar
jar 装 dex
先 cd 到 android sdk 构建工具目录下, 实测 30- 的才可以使用以下的命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64$ cd android_sdk\build-tools\30.0.3
$ dx.bat --dex --output=C:\AndroidLib02.dex C:\JavaLab.main.jar
---
### java 转 smali
- Android Studio配置超实用java转smali插件 - https://blog.csdn.net/u011426115/article/details/112855820
*java2smali* 插件一款 Android Studio 上非常实用的插件。通过该插件可以将 Java或者Kotlin 的源文件转为 smali 文件。使用该插件可以方便我们做如下事情:
1. 对比java源文件学习smali语法
2. apk重打包过程中Smali插桩
#### 使用插件
1. 在 *plugins* 中搜索 java2smali 安装, 然后重启 as
2. 打开 java 代码, *Build -> compile to smali*

---
#### 使用 jd-gui 查看 jar 代码 (不推荐)
- 直接将 *classes3-dex2jar.jar* 拖入 *jd-gui* 即可

使用 [使用 jadx 工具查看 apk](#使用 jadx 工具查看 apk) 会更好, 反编译后跟接近 *源代码*
---
### Dex、Smali、Class、Java、Jar 之间的相互转换
工具
| 工具 | 作用 |
| -------- | ---------------------------- |
| javac | java------>class |
| ddx | class------>dex |
| baksmali | dex------>smali |
| smali | smali------>dex |
| dex2jar | dex------>jar(class的压缩包) |
| apktool | apk------>smali |
#### Android源代码从编译到运行
- java 转 class
```shell
javac Test.javaclass 转 dex
1
ddx --dex --output=Test.dex Test.class
dex 转 smali
1
java -jar baksmali.jar -o [输出文件夹] dex文件
smali 转 dex
1
java -jar smali.jar -o 目标dex文件 [smali文件夹]
dex 转 jar
1
d2j-dex2jar.bat dex文件
aab 与 apk 互转
- Android apk和aab互相转换 - https://blog.51cto.com/u_12300179/5267430
aab 转 apk
- a
apk 转 aab
- apk 转 aab - https://juejin.cn/post/6982111395621896229
- APK2AAB - https://github.com/sensei-z/APK2AAB
37 手游构建工具使用
- apk 转 aab - https://juejin.cn/post/6982111395621896229
实测:
加固后的 apk 构建 aab
直接安装 aab, 命令:
java -jar E:/bundletool-all-1.12.1.jar install-apks --apks=I:\base.apks
闪退, 报错:
Didn't find class "androidx.core.app.CoreComponentFactory"
将 aab 解压出来的 apk, 运行正常
未加固的 apk 构建 aab
- 直接安装 aab, 报错找不到
libmain.so
动态库 - 将 aab 解压出来的 apk, 运行正常
- 直接安装 aab, 报错找不到
解决办法:
- 在导出 apks 文件的命令中加入
--mode=universal
参数, 这样导出的 apks 无论是 加固 还是 不加固 的, 都能正常运行
aab签名
37手游安卓团队 - apk转化aab格式 - https://juejin.cn/post/6982111395621896229
能使用
jarsigner
为 aab 签名。签名aab的时候不需要使用v2签名,使用JDK的普通签名就行。1
2
3
4
5
6jarsigner -digestalg SHA1 -sigalg SHA1withRSA \
-keystore luojian37.jks \
-storepass ****** \
-keypass ****** \
base.aab \
******
AndroidManifest.xml 的 解码 编码
还原AndroidManifest.xml明文的方法 - https://blog.csdn.net/wwt831208/article/details/54692561
下载 AXMLPrinter2.jar - https://code.google.com/archive/p/android4me/downloads
xml2axml (不错的转换工具) - https://github.com/codyi96/xml2axml
xml to axml
1
java -jar xml2axml-2.1.0.jar e [AndroidManifest-readable-in.xml] [AndroidManifest-bin-out.xml]
axml to xml
1
java -jar xml2axml-2.1.0.jar d [AndroidManifest-bin-in.xml] [AndroidManifest-readable-out.xml]