apkのパッケージと逆コンパイル一、コード混同ProGuard


ProGuardの紹介Googleで提供されているヘルプドキュメントについて詳しく説明します:android SDKディレクトリ/docs/guide/developing/tools/proguard.html
以下はcopyからの翻訳です:原文の住所:http://www.cnblogs.com/xirihanlin/archive/2011/06/10/2077951.html
ProGuard(混同器)
ProGuardツールは、不要なコードを削除し、意味的に混同された名前でクラス、フィールド、メソッドの名前を変更することで、コードを圧縮、最適化、混同します.結果はもっと小さいです.apkファイルは、逆コンパイルがより困難です.ProGuardは、プログラムが逆コンパイルされにくいため、プログラムが機密情報を使用している場合に使用することが重要です.
ProGuardはAndroidのコンパイル環境に統合されているため、手動でトリガーする必要はありません.ProGuardはreleaseモードでのみアプリケーションをコンパイルするので、debugモードでコンパイルすると、混同されたコードを処理する必要はありません.ProGuardを実行するかどうかは完全にオプションですが、強くお勧めします.
この記事では、ProGuardの有効化と構成方法、および混同されたスタックトラッキング情報を復号するためにretraceツールを使用する方法について説明します.
ProGuardの有効化
Androidプロジェクトを作成するとcfgファイルは、プロジェクトのルートディレクトリで自動的に作成されます.このファイルでは、ProGuardがコードを最適化して混同する方法を定義しているので、カスタマイズする方法を理解することが重要です.デフォルトのプロファイルは共通の状況を上書きしているだけなので、基本的にはニーズを満たすために編集する必要があります.ProGuardのカスタマイズ方法については、後述の「ProGuardの構成」章を参照してください.
ProGuardを有効にしてAntまたはEclipseコンパイル時に一緒に実行させるには/default.propertiesファイルでproguardを設定します.configプロパティ.パスは、絶対パスまたはエンジニアリングルートディレクトリの相対パスです.
もしあなたがproguardをcfgファイルはデフォルトの場所(プロジェクトのルートディレクトリ)に配置され、このように場所を指定できます.
proguard.config=proguard.cfg
また、ファイルを任意の場所に移動し、絶対パスを指定することもできます.
proguard.config=/path/to/proguard.cfg
releaseモードでプログラムをコンパイルするとant releaseでもEclipseのエクスポートウィザードでもコンパイルシステムは自動的にproguardをチェックします.configプロパティが設定されているかどうか.設定するとProGuardはパッケージ化されます.apkファイルの前に、アプリケーションのバイトコードを自動的に処理します.Debugモードコンパイルでは、デバッグがより複雑になるため、ProGuardはトリガーされません.
ProGuardの実行が終了したら、次のファイルを出力します.
dump.txt
説明apkファイル内のすべてのクラスファイル間の内部構造
mapping.txt
元のクラス、メソッド、フィールド名と混同されたコード間のマッピングがリストされます.このファイルは重要です.releaseバージョンからバグレポートを受け取ると、混同されたコードを翻訳することができます.
seeds.txt
混同されていないクラスとメンバーのリスト
usage.txt
からリストされています.apkで削除されたコード
これらのファイルは次のフォルダに配置されます.
· Ant:/bin/proguard
· Eclipse: /proguard
注意:releaseモードでコンパイルするたびに、これらのファイルは上書きされます.もちろん、ProGuardツールで生成された最新のファイルに上書きされます.プログラムを発表するたびに、将来バグレポートを復号できるように保存する必要があります.
ProGuardの設定
場合によってはcfgファイルのデフォルト構成で十分です.しかし、ProGuardでは正確な分析が難しい場合もあります.不要と思われるコードを削除する可能性がありますが、実際にはプログラムに必要なものです.例:
lはAndroidManifestにしかありません.xmlファイルで参照されるクラス
l JNIにより呼び出される方法
l動的参照のフィールドと方法
デフォルトのproguard.cfgファイルは共通の状況を上書きしようと努力していますが、ClassNotFoundExceptionのような異常に遭遇する可能性があります.これはProGuardがクラス全体を削除したためです.
ProGuardがコードを削除したことによるエラーを修正することができます.proguardだけです.cfgファイルに「-keep」の行を追加します.例:
-keep public class
-keepオプションを使用する場合は、いくつかのオプションと推奨事項があります.そのため、カスタムプロファイルの詳細については、ProGuardマニュアルを参照することを強くお勧めします.「Overview of Keep options」と「Examples section」が役立ちます.「Troubleshooting」の章には、コードが削除されたときに発生する可能性のある一般的な問題もリストされています.
混同されたスタックトラッキング情報の復号
混同されたコードがスタック情報を出力すると、メソッド名は認識できず、デバッグが困難になり、不可能になる.幸いなことに、ProGuardが実行されると/bin/proguard/mapping.txtファイルで、このファイルには元のクラス、メソッド、フィールド名がマッピングされた混同された名前が含まれています.
retrace.Batスクリプト(Window)またはretrace.shスクリプト(Linux,Mac OS X)は、混同されたスタックトラッキング情報を読み取り可能な情報に復元することができる./tools/proguardフォルダにあります.retraceツールを実行する構文は次のとおりです.
retrace.bat|retrace.sh [-verbose] mapping.txt []
例:
retrace.bat -verbose mapping.txt obfuscated_trace.txt
では、retraceツールが標準入力から読み込まれます.
パブリッシャのデバッグ推奨事項
プログラムをユーザーに配布するたびにmappingを保存する必要があります.txt.これにより、ユーザーがバグに遭遇し、混同されたスタック情報を送信すると、この問題をデバッグできることが保証されます.エンジニアリングtxtファイルはreleaseコンパイルを行うたびに上書きされますので、必要なバージョンを慎重に保存してください.
mappingの保存方法txtファイルはあなたのことです.たとえば、バージョン情報やコンパイル番号を含む名前でファイルの名前を変更したり、コードと同じようにバージョン管理したりすることができます.
 
基本使用手順:(copy)
Android sdktoolsディレクトリの下にproguardが見えますか?
apk的打包和反编译一、代码混淆ProGuard_第1张图片
2.3.3のプロジェクトを新規作成すると、プロジェクトファイルにproguardが表示されます.cfgファイル?
偉大なgoogleは私たちにこんなに多くのことをしてくれましたが、残念ながら2.3から始まりました.
では、私が悲しんでいるプロジェクト(2.2のsdkに基づいて)はどうすればいいですか?(残忍にプロジェクト属性を2.3に設定しなければなりませんか?
Googleはあなたのためにproguardをcfgファイル補完)
ほほほ、実は使いません.proguardを.cfgファイルを古いプロジェクトにコピーすればいいのですが、
もちろんこれでは足りません.googleはデフォルトでプロジェクトを混同しないからです.
To enable ProGuard so that it runs as part of an Ant or Eclipse build, 
set the proguard.config property in the /default.properties file. 
The path can be an absolute path or a path relative to the project's root.  
Googleはdefaultを構成すると言いましたproperties 
うーん、
これをconfig=proguard.cfgに加えて
では、再び新しいものを生成します.apkファイル、
それから上の方法であなたのプロジェクトを逆コンパイルして、aabb ccのパッケージ、aabb ccのクラスとaabb ccの変数名、方法名を見ることができます.
これはあなた自身も頭がぼんやりしていると信じていますか?
apk的打包和反编译一、代码混淆ProGuard_第2张图片
見てみろcfgファイル

   
   
   
   
-optimizationpasses 5 -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontpreverify -verbose -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -keep public class * extends android.app.Activity -keep public class * extends android.app.Application -keep public class * extends android.app.Service -keep public class * extends android.content.BroadcastReceiver -keep public class * extends android.content.ContentProvider -keep public class com.android.vending.licensing.ILicensingService -keepclasseswithmembernames class * { native < methods > ; } -keepclasseswithmembernames class * { public < init > (android.content.Context, android.util.AttributeSet); } -keepclasseswithmembernames class * { public < init > (android.content.Context, android.util.AttributeSet, int); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; }

GoogleのデフォルトはActivity、Serviceを混同していません...クラスのサブクラスは、上のスクリーンショットで見たようにすべてのactivityのサブクラス名が保持されます.