android-ProGuardの混乱


タイトル:android-ProGuard混淆
カテゴリ:Android
タグ:[android、unity、ProGuard、混淆]
日付:2020-03-30 19:05:25
コメント:false
mathjax:true
toc:true

android-ProGuardの混乱


前日譚

  • 公式
    • アプリケーションを削減、難読化、最適化する-https://developer.android.com/studio/build/shrink-code
  • Androidの混乱(Proguard)の詳細な説明-https://juejin.im/post/5ae7edc7f265da0b776f7a95
  • Androidの混乱-これを理解するだけで十分です-https://juejin.im/post/5aeae5b6f265da0ba469a265
  • Androidマルチチャネルパッケージの難読化ファイルProGuardテクノロジーの詳細な説明-https://blog.csdn.net/javazejian/article/details/50587857

ProGuardツールは、コードを圧縮、最適化、および難読化するために使用されます。主な機能は、名前を難読化しながら(クラス、フィールド、メソッド、およびプロパティ)、コード内の不要なクラス、フィールド、メソッド、およびプロパティを削除することです。最終的な結果により、apkファイルが小さくなる可能性があります。また、apkが他のユーザーによってリバースエンジニアリングされるのが難しくなります。これは、特別な場合にいくつかのセキュリティ機能を含むapkにとって非常に重要です。これは非常に抽象的であり、他の資料と組み合わせて、ProGuardテクノロジーの機能を次の4つの項目に要約すると思います。

  1. 縮小:コード内の不要なクラス、フィールド、メソッド、および属性を確認して削除します。

  2. 最適化:バイトコードを最適化して、不要な命令を削除します。

  3. 難読化:a、b、c、dなどの短くて意味のない名前を使用して、クラス、フィールド、メソッドの名前を複製します。これにより、コードがリバースエンジニアリングされた場合でも、相手方が読みにくくなります。(これuglify-jsjsの圧縮コードに似ています。)

  4. 事前検出(Preveirfy):Javaプラットフォームで処理されたコードを再検出します。

ProGuard難読化テクノロジーはAndroidビルドシステムに統合されているため、手動で呼び出す必要はありません。ProGuard難読化テクノロジーは、アプリケーションをビルドしてリリースの準備をするときにのみ使用する必要があるため、デバッグモードでコードの難読化を実行する必要はありません。ProGuard難読化テクノロジーはオプションのテクノロジーにすぎません。ProGuard難読化テクノロジーを使用しなくても、アプリケーションは実行できますが、アプリケーションを公開するときはこのテクノロジーを使用することを強くお勧めします。

コードを難読化することは、アプリがGooglePlayにアップロードされた後にコードがチェックされないようにすることでもあります。


コードを難読化する

  • https://developer.android.com/studio/build/shrink-code#obfuscate

難読化の目的は、アプリケーションクラス、メソッド、およびフィールドの名前を短くすることにより、アプリケーションのサイズを縮小することです。

ただし、難読化によってコードのさまざまな部分の名前が変更されるため、特定のタスク(スタックトレースのチェックなど)を実行するには追加のツールが必要です。難読化後のスタックトレースを理解するには、次のセクションを参照してください。

混乱ログを出力する

# 未混淆的类和成员
-printseeds ../../proguard-log/seeds.txt

# 列出从 apk 中删除的代码
-printusage ../../proguard-log/unused.txt

# 混淆前后的映射
-printmapping ../../proguard-log/mapping.txt

# R8 在构建项目时应用的所有规则的完整报告
-printconfiguration ../../proguard-log/full-r8-config.txt

難読化されたスタックトレースのデコード

  • https://developer.android.com/studio/build/shrink-code#decode-stack-trace

R8がコードを難読化すると、クラスとメソッドの名前が変更された可能性があるため、スタックトレースを理解するのが非常に難しくなります。名前の変更に加えて、R8はスタックトレースの行番号を変更して、DEXファイルを書き込むときのサイズをさらに減らすこともできます。幸い、R8は、実行mapping.txtファイルごとに1つ作成します。このファイルには、難読化されたクラス、メソッド、および元の名前を持つ名前間のフィールドマッピングが一覧表示されます。このマッピングファイルには、行番号を元のソースファイルの行番号にマッピングするために使用される情報も含まれています。このR8はファイル/build/outputs/mapping//ディレクトリに保存されます

:プロジェクトをビルドするたびにR8で生成されたmapping.txtファイルがカバーされるため、新しいバージョンをリリースするたびにファイルのコピーを保存するように注意する必要があります。リリースごとにバージョンを保持するmapping.txtことで、ファイルのユーザーコピーでレガシーアプリケーションから難読化されたスタックトレースを送信し、関連する問題をデバッグできます。


UnityAndroidの混乱

  1. 難読化をオンにする

    [外部リンク画像の転送に失敗しました。ソースサイトにヒル防止リンクメカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-Bbg2Ulog-1585726911435)(http://yxbl.itengshe.com/20200331164701- 1.png)]

  2. 次に、ファイルAssets\Plugins\Android\proguard-user.txt生成し、その中に難読化ルールを追加します

    クロスプラットフォーム(すべてのパブリックメソッド)の呼び出しメソッドを保持する必要があることに注意してください。そうしないと、実行時にJavaを呼び出すときにエラーが報告されます。パブリックメソッドを保持してください。次に例を示します。

    -keep class com.yang.androidaar.MainActivity{
          
          
      public <methods>; # 保持该类下所有的共有方法不被混淆
    }
    

    エントリMainActivityクラスを保持ます。

    接続されたサードパーティSDKには、保持するために難読化を必要とするルールがあるため、内部にスローするだけです。

ピットを踏む

ユニティライブラリモジュールのjarをasにエクスポートする場合、ライブラリモジュールで難読化をオンにすることはできません。そうしないと、パッケージ化時にメインプロジェクトが難読化を開き、2番目の混乱でエラーが発生します。

transformClassesAndResourcesWithR8ForRelease FAILED

おすすめ

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