EclipseとAndroidソースでのProGuardツールの使用(コード混同)

26168 ワード

仕事のため、この2、3日同僚とandroidの下のProGuardツールの使用を研究して、androidの公式サイトのこのツールの紹介とネット上のその他の関連資料を見ることを通じて、更に自分の手で実践して、1つの基本的な理解があります.以下、自分の理解と認識を簡単にメモして、異議や理解できないことがあれば、直接伝言することができます.
ProGuardツールとは?
ProGuardはandroidが提供する無料のツールで、エンジニアリングの不要なコードを削除したり、意味的に曖昧な名前を使用してコードのクラス、フィールド、関数などを名前を変更したりして、コードを圧縮、最適化、混同する機能を実現します.具体的には、ProGuardツールを使用すると、次の2つの目的を達成できます.
ソースファイルに呼び出されていないコードの一部を削除し、最終的に生成されるapkファイルをより小さくするためにバイトコードファイルを最大化しました.
意味混同のネーミングを使用して、コード内のクラス、フィールド、関数などを置き換え、他の人がソースコードを逆コンパイルして取得することができず、コードの保護に役立ちます.
ProGuardツールの役割によって、直接「コード混同ツール」と呼ぶ人も少なくないと思いますが、本稿ではしばらくこの言葉で略称します.
詳細については、ProGuardツールの公式ドキュメントアドレス:http://developer.android.com/tools/help/proguard.htmlを参照してください.
ProGuardツールの統合と使用環境
実は、ProGuardツールはすでにandroidシステムに統合されているので、ユーザーが手動で統合する必要はありません.ただし,プログラムがReleaseモードの場合のみProGuardが有効であり,逆にDebugモードではProGuardでコードを混同することはできないことに注意する必要がある.
ProGuardの具体的な使用環境によって、Eclipseツールとandroidソースコードの2種類のコンパイル環境に分けてProGuardの使用方法を簡単に話します.
Eclipse環境でのProGuardの使用
私のパソコンのandroid 4.0環境を例にとると、Eclipseでプロジェクトを新規作成するか、既存のプロジェクトをインポート(現在のプロジェクトに構文エラーがないことを保証)すると、プロジェクトのルートディレクトリでProGuardの混同ファイル:proguard-projectが自動的に生成されます.txtとproject.properties(旧バージョンのADTではproguard.cfgというファイルしか生成されません).まずファイルを見てみましょうproperties :
 1

 2

 3

 4

 5

 6

 7

 8

 9

10

11

12

13

14
# This file is automatically generated by Android Tools.

# Do not modify this file -- YOUR CHANGES WILL BE ERASED!

#

# This file must be checked in Version Control Systems.

#

# To customize properties used by the Ant build system edit

# "ant.properties", and override values to adapt the script to your

# project structure.

#

# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):

#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt



# Project target.

target=android-16


次のコメントを見てください.To enable ProGuard to shrink and obfuscate your code,uncomment this(available properties:sdk.dir,user.home)は、ProGuardにコードを圧縮して混同させることを意味します.このコメントを削除すればいいです.したがって、次のコメントをキャンセルすれば、次のようになります.
1

2
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):

proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt


このコードをよく見てみましょう.ここではproguardを設定します.configプロパティは、混同コードのプロファイルがネイティブSDKディレクトリの下にあるproguard-androidであることを指定する.txtファイル、および混同された個性化プロファイルを現在のエンジニアリング(eclipse下)のルートディレクトリの下のproguard-projectとする.txtファイル、後ろのこのファイルは、さっき見たルートディレクトリの下で自動的に生成された別のファイルです!
この場所を開くと、コードを混同することができますが、eclipseのRun asメニューとDebug asメニューを実行して混同コードを生成することはできません.下の図に示す方法でapkをエクスポートする必要があります.もちろん、「署名」または「署名しない」を選択することができます.
このような操作を行うと、コード混同が完了します.では、私たちが本当にコードを混同していることを検証するにはどうすればいいのでしょうか.まず、プロジェクトのルートディレクトリに新しいフォルダproguardが生産され、その内容は以下の通りです.
dump.txt:apk内のすべてのクラスファイルの内部の構造体を説明します.( Describes the internal structure of all the class files in the .apk file )
mapping.txt:元のクラス、メソッド、および名前と混同コードの可視マッピングがリストされます.( Lists the mapping between the original and obfuscated class, method, and field names. )
seeds.txt:混同されていないクラスとメソッドがリストされます.( Lists the classes and members that are not obfuscated )
usage.txt:congapkで削除したコードをリストします.( Lists the code that was stripped from the .apk )
同時に反コンパイルソフトを使って新しく生成したapkを反コンパイルすると、中のクラス名、方法、変数などが、簡単なa、b、c、dなどの意味のないアルファベットになっていることがわかり、混同の目的を達成しました.
しかし、実際の使用中に、現在のapkのいくつかの方法とクラスが外部で使用されることがわかります.この場合、名前が混同され、外部呼び出しが間違って報告されます.では、この問題をどのように解決しますか.ここでは、先ほどお話しした混同されたパーソナライズドプロファイルproguard-projectを使用します.txtは、混同する必要のないクラス、メソッド、変数などを構成します.混同ファイルの具体的な構成方法については、次の最後のタイトルを参照してください.
Androidソース環境でProGuardが使用
Googleが発表したandroidソースでは、多くのコードとファイルディレクトリに直面していますが、コードと構成の混同ファイルをどのように混同すればいいのでしょうか.
Androidではデフォルトでは、alps/build/core/proguardでコードを混同して閉じます.flagsには、デフォルトを混同せず、コード削除を必要としないことを意味する次の文があります.この文を注釈すると、コード混同コンパイルの役割を果たします.
1

2
# Don't obfuscate. We only need dead code striping.

-dontobfuscate


これはandroidエンジニアリングにおけるコード混同の総スイッチと言えるが,上記のコードを注釈すると,エンジニアリング全体がコード混同になっているのだろうか.いいえ、ここではファイルalps/build/core/packageに注目します.mk、このファイルには次のセクションがあります.
1

2

3

4

5

6
ifndef LOCAL_PROGUARD_ENABLED

ifneq ($(filter user userdebug, $(TARGET_BUILD_VARIANT)),)

    # turn on Proguard by default for user & userdebug build

    #LOCAL_PROGUARD_ENABLED :=full

endif

endif


プロジェクト全体をコード混同する必要がある場合は、ここの#LOCAL_をPROGUARD_ENABLED:=fullコメントを外し、有効なマクロにすればよい.エンジニアリングコード全体を混同したくなくて、あるモジュールに対して混同しているだけなら、ここのコードを動かさないでください.
次に、本物のプロジェクトnewを1回提案し、その後、特定のapkファイルに対してファイルの設定とカスタマイズを混同することができます.次に、alps/packages/apps/Musicを例に、特定のモジュールを混同する方法について説明します.
Musicディレクトリの下で、普段はあまり注目していませんが、今日はきっと気になるファイル名:proguard.flags、そうだ、このファイルはMusicの混同プロファイルで、開けてみることができます(このファイルがないところもありますが、ユーザーは自分で手動で新規作成することができます.名前もproguard.flags、androidの下でデフォルトはこの名前です).もちろん、プロファイルを設定するだけでは足りません.同じディレクトリのAndroidも必要です.mkでは、次の2つの文を設定します.
1

2
LOCAL_PROGUARD_ENABLED  := full

LOCAL_PROGUARD_FLAG_FILES := proguard.flags


このようにしてこそ、混同コードを有効にし、混同プロファイルを関連付けることができます.(一部のモジュールではこの2つの文がないので、自分で手動で追加します)
逆に、ユーザーがalps/build/core/packageにいる場合.mkは全工程混同コンパイルの制御点を開いた後、あるモジュールに対して混同コンパイルしたくない場合はどうすればいいですか?モジュールの下にあるAndroidをmkで*LOCAL_に設定PROGUARD_ENABLED:=disabled**でOK.
このように,mmコンパイル後のコードで生成したapk,あるいはnew真のエンジニアリング後に生成した焼機コードは,対応する構成を追加した混同コードである.
逆コンパイル後、proguardを除く.flagsでカスタマイズされた混同を必要としないコード以外は、androidのMusicモジュールの混同後の逆コンパイル結果を示すように混同されています.
ファイルの構成を混同
実際の使用中に、現在のapkのいくつかのメソッドとクラスが外部で使用されることがわかりますが、名前が混同されると、外部呼び出しが間違って報告されます.では、この問題をどのように解決しますか?この場合、混同されたパーソナライズドファイルproguard-projectを構成する必要があります.txt(eclipse環境)またはproguard.flags(androidソース環境)は、混同する必要のないクラス、メソッド、変数などを構成します.混同ファイルの具体的な構成方法については、検索してみてください.ここでは、エンジニアリングファイルのActivity、Application、Service、BroadcastReceiver、ContentProvider、BackupAgentHelper、Preference、ILicensingServiceのサブクラスを保持するオンライン共有の構成コードを提供します.すべてのNative変数名とクラス名を保持し、すべてのクラスの一部は固定パラメータフォーマットを設定した構造関数、列挙などで、外部呼び出しのエラーを防止するために使用されます.参考にして、後で自分のファイルを構成することができます.
 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
-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 * extends android.app.backup.BackupAgentHelper

-keep public class * extends android.preference.Preference



 -keepclasseswithmembernames class * {

     native <methods>;

}



-keepclasseswithmembers class * {

    public <init>(android.content.Context, android.util.AttributeSet);

}



-keepclasseswithmembers class * {

    public <init>(android.content.Context, android.util.AttributeSet, int);

}



-keepclassmembers class * extends android.app.Activity {

    public void *(android.view.View);

}



-keepclassmembers enum * {

    public static **[] values();

    public static ** valueOf(java.lang.String);

}



-keep class * implements android.os.Parcelable {

    public static final android.os.Parcelable$Creator *;

}