android-apk解包打包

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


前篇


反编译流程图


使用 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]
    • 此时生成的 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 到工具即可

    image-20221020160031677


使用 smali 工具

使用的是 baksmali-2.2.2.jarsmali-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*

    ![image-20220929141600475](https://pic05.wilker.cn/20220929141603-297.webp)



    ---

    #### 使用 jd-gui 查看 jar 代码 (不推荐)

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

    ![image-20220928164212278](https://pic05.wilker.cn/20220928164217-960.webp)

    使用 [使用 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.java
  • class 转 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 互转


aab 转 apk

  • a

apk 转 aab


37 手游构建工具使用

实测:

  • 加固后的 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, 运行正常

解决办法:

  • 在导出 apks 文件的命令中加入 --mode=universal 参数, 这样导出的 apks 无论是 加固 还是 不加固 的, 都能正常运行

aab签名


AndroidManifest.xml 的 解码 编码


命令行构建应用