android-apk解包打包, 以下所有操作都需要在配置好 java 环境下进行

解包 apk
$ java -jar -Duser.language=en -Dfile.encoding=UTF8 apktool.jar d [test_hi.apk] -o [test_hi]
会将 test_hi.apk 解包到 test_hi 目录
打包 apk
$ java -jar -Duser.language=en -Dfile.encoding=UTF8 apktool.jar b [test_hi]
将 test_hi 目录打包, 在 test_hi/dist 目录下生成 test_hi.apk
打包完后需要 4 字节对齐
$ zipalign -p -f -v 4 [test_hi.apk] [test_hi_align.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]此时生成的 apk 需要签名一下, 否安装报错
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 包)
错误: Error: Resource is not public
解决办法: 在 反编译 apk 时, 可以通过 -r 参数来避免resc的反编译,见下图。这样在打包的时候就不会重新编译 resc 文件包括 xml
参考: 反编译工具apktool使用问题 - https://www.jianshu.com/p/47a5511e17bf
GitHub - https://github.com/skylot/jadx/releases
使用, 直接拖动 apk, jar 到工具即可

使用的是 baksmali-2.2.2.jar 和 smali-2.2.2.jar
dex 解包出 smali
$ java -jar baksmali-2.2.2.jar d [classes.dex] -o [myout]
解出 classes.dex 的 smali 会生成到 myout 目录下
smali 打包成 dex
java -jar smali-2.2.2.jar assemble [myout] -o [my_classes.dex]
将 myout 目录打包成 my_classes.dex 文件
命令
$ 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]
不能使用一下命令打包
$ 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
dex2jar 和 jd-gui 只是查看源码的工具
使用 dex2jar 工具
$ d2j-dex2jar.bat [classes3.dex] --force -o [aaa.jar]
dex2jar classes3.dex -> aaa.jar
先 cd 到 android sdk 构建工具目录下, 实测 30- 的才可以使用以下的命令
$ cd android_sdk\build-tools\30.0.3
$ dx.bat --dex --output=C:\AndroidLib02.dex C:\JavaLab.main.jar
java2smali 插件一款 Android Studio 上非常实用的插件。通过该插件可以将 Java或者Kotlin 的源文件转为 smali 文件。使用该插件可以方便我们做如下事情:
对比java源文件学习smali语法
apk重打包过程中Smali插桩
在 plugins 中搜索 java2smali 安装, 然后重启 as
打开 java 代码, Build -> compile to smali

直接将 classes3-dex2jar.jar 拖入 jd-gui 即可

使用 [使用 jadx 工具查看 apk](#使用 jadx 工具查看 apk) 会更好, 反编译后跟接近 源代码
工具
| 工具 | 作用 |
|---|---|
| javac | java------>class |
| ddx | class------>dex |
| baksmali | dex------>smali |
| smali | smali------>dex |
| dex2jar | dex------>jar(class的压缩包) |
| apktool | apk------>smali |
java 转 class
javac Test.java
class 转 dex
ddx --dex --output=Test.dex Test.class
dex 转 smali
java -jar baksmali.jar -o [输出文件夹] dex文件
smali 转 dex
java -jar smali.jar -o 目标dex文件 [smali文件夹]
dex 转 jar
d2j-dex2jar.bat dex文件
实测:
加固后的 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
libmain.so 动态库解决办法:
--mode=universal 参数, 这样导出的 apks 无论是 加固 还是 不加固 的, 都能正常运行37手游安卓团队 - apk转化aab格式 - https://juejin.cn/post/6982111395621896229
能使用 jarsigner 为 aab 签名。签名aab的时候不需要使用v2签名,使用JDK的普通签名就行。
jarsigner -digestalg SHA1 -sigalg SHA1withRSA \
-keystore luojian37.jks \
-storepass ****** \
-keypass ****** \
base.aab \
******
还原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
java -jar xml2axml-2.1.0.jar e [AndroidManifest-readable-in.xml] [AndroidManifest-bin-out.xml]
axml to xml
java -jar xml2axml-2.1.0.jar d [AndroidManifest-bin-in.xml] [AndroidManifest-readable-out.xml]