android-apkの解凍とパッケージ化


タイトル: android-apk の解凍とパッキング
カテゴリ: Android
タグ: [アンドロイド, パッキング]
日付: 2022-09-28 10:29:51
コメント: false
mathjax: true
toc: true

android-apk は解凍とパックを行います。以下のすべての操作は、構成された Java 環境で実行する必要があります。


前編

  • Android APK の解凍とパッケージ化 - https://blog.csdn.net/u011435933/article/details/89555328
  • APK の解凍 + ソース コードの変更 + Android アプリの再パッケージ化と変更のチュートリアル 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/
    • バンドルツール - https://github.com/google/bundletool/releases
      • 使用説明書 - https://developer.android.com/studio/command-line/bundletool
    • AXMLPrinter2.jar - https://code.google.com/archive/p/android4me/downloads

逆コンパイルのフローチャート


apktoolを使用する

  • 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]
      
      • 位置がずれている場合、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 は署名される必要があります。署名されていない場合は、エラーが報告されます。

      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 を逆コンパイルするときに、-rresc 逆コンパイルを回避するためにパラメーターを渡すことができます。以下の図を参照してください。この方法では、xml を含むパッケージ化時に resc ファイルが再コンパイルされなくなります。

参考: 逆コンパイルツール apktool の使用に関する問題 - https://www.jianshu.com/p/47a5511e17bf


jadx ツールを使用して APK を表示する (推奨)

  • GitHub - https://github.com/skylot/jadx/releases

  • 使用するには、apk、jarをツールに直接ドラッグします

    画像-20221020160031677


smali ツールを使用する

baksmali-2.2.2.jarおよびsmali-2.2.2.jarの使用

  • デックスはスマリを開梱します

    $ java -jar baksmali-2.2.2.jar d [classes.dex] -o [myout]
    

    class.dexを解決するsmali がmyoutディレクトリに生成されます

  • smali を dex にパッケージ化

    java -jar smali-2.2.2.jar assemble [myout] -o [my_classes.dex]
    

    myoutディレクトリをmy_classes.dexファイルパッケージ化します。


署名済みの APK パッケージ

  • 注文

    $ 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] [证书别名]
      

      Android 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
    

jarにインストールされたdex

  • まず Android SDK ビルド ツール ディレクトリに cd します。実際のテストは 30 です。その後、次のコマンドを使用できます。

    $ 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 インストールを検索し、次のように再起動します。

  2. Javaコードを開き、「ビルド」→「smariにコンパイル」します。

    画像-20220929141600475


jd-gui を使用して jar コードを表示します (非推奨)

  • class3-dex2jar.jarをjd-gui直接ドラッグするだけです

    画像-20220928164212278

    [jadx ツールを使用して apk を表示](#jadx ツールを使用して apk を表示) を使用し、逆コンパイルしてからソース コードに近づける方が良いでしょう。


Dex、Smali、Class、Java、Jar間の相互変換

道具

道具 効果
ジャバック java------>クラス
ddx クラス------>デックス
バクスマリ語 デックス------>スマリ
羊飼い スマリ------>デックス
dex2jar dex------>jar (クラスの圧縮パッケージ)
apktool apk------>smali

Android ソースコードのコンパイルから動作まで

  • Javaからクラスへ

    javac Test.java
    
  • クラスからデックスまで

    ddx --dex --output=Test.dex Test.class
    
  • スマリへのデックス

    java -jar baksmali.jar -o [输出文件夹] dex文件
    
  • スマリからデックスへ

    java -jar smali.jar -o 目标dex文件 [smali文件夹] 
    
  • 瓶へのデックス

    d2j-dex2jar.bat dex文件
    

aabとapkの変換

  • Android APK と AAB を相互に変換 - https://blog.51cto.com/u_12300179/5267430

aabからapkへ

  • ある

apkをaabに変換する

  • aab への APK - https://juejin.cn/post/6982111395621896229
    • GitHub - https://github.com/37sy/build_aab_tool
  • APK2AAB - https://github.com/先生-z/APK2AAB

37 モバイルゲーム構築ツールの使用
  • aab への APK - 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

    • libmain.soaab を直接インストールすると、ダイナミック ライブラリが見つからないというエラーが報告されます。
    • aabから解凍されたapkは正常に動作します

解決:

  • apks ファイルをエクスポートするコマンドにパラメーターを追加して--mode=universal、強化されているかどうかに関係なく、エクスポートされた apk が通常どおり実行できるようにします。

aab 署名

  • 37 モバイル ゲーム Android チーム - APK を AAB 形式に変換 - https://juejin.cn/post/6982111395621896229

    • GitHub - https://github.com/37sy/build_aab_tool
  • jarsignerAab はを使用して署名できます。aab に署名する場合、v2 署名を使用する必要はなく、JDK の通常の署名を使用するだけです。

    jarsigner -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からaxmlへ

      java -jar xml2axml-2.1.0.jar e [AndroidManifest-readable-in.xml] [AndroidManifest-bin-out.xml]
      
    • axmlからxmlへ

      java -jar xml2axml-2.1.0.jar d [AndroidManifest-bin-in.xml] [AndroidManifest-readable-out.xml]
      

コマンドラインからアプリをビルドする

  • コマンドラインからアプリをビルドします - https://developer.android.com/studio/build/building-cmdline#bundletool-build

おすすめ

転載: blog.csdn.net/yangxuan0261/article/details/128047885