2013-12-16 9 views
7

私はAndroidアプリケーションにProGuardを適用しました。ProguardがAndroidでアクティビティクラスを使用する理由

私は何も変えない、設定ファイルとして

android-studio/sdk/tools/proguard/proguard-android.txt 

を使用しています。私は活動についてのみ文を参照してくださいすることができます。このファイルで

We want to keep methods in Activity that could be used in the XML attribute onClick 
-keepclassmembers class * extends android.app.Activity { 
    public void *(android.view.View); 
} 

それは彼らがそうであるように、いくつかの方法は保存されたまま活動クラス名は、ProGuardのでobfusctatedされていることから、次の。これは理解できる。

しかし、私のアプリケーションでは、私はその後、私はこの活動を開始し、それがうまく起動し

Class.forName("my.app.MyActivity") 

を使用して文字列からのアクティビティクラスを作成します。

しかし、これは、アクティビティ由来のクラスは難読化されていないことを意味しますか?。 ProGuardのはActivityため-keep classディレクティブを持っていないので、それは私が私が観察行動に依存していることができれば、それだけで、誰かが、説明していただけます-keepclassmembers.

を持って、失敗している必要がありますか?または、私は-keepclassmembers指令を誤解していますか? ProGuard FAQから

+0

ファイル全体を投稿する必要があります。その行だけでは、アクティビティ名を保持する理由を説明できません – Raffaele

答えて

9

マニフェストにアクティビティがリストされ、参照されているクラスが自動的に保持されるためです。これは、Androidフレームワークがリフレクションによってこれらのアプリエントリポイントにアクセスするために必要です。hereから

ビルドプロセスはAndroidManifest.xmlと他のXMLファイルに基づいて、自動的にコンフィギュレーションファイルbin/proguard.txtを作成するためのツールAAPTを実行します。ビルドプロセスは、設定ファイルをProGuardに渡します。だからProGuard自体は実際にはAndroidManifest.xmlを考慮しないが、aapt + ProGuardはそうする。

3

んProGuardのハンドルClass.forNameの呼び出し?

はい。 ProGuardは、Class.forName( "SomeClass")やSomeClass.classのようなコンストラクトを自動的に処理します。参照されるクラスは縮小フェーズで保持され、文字列引数は難読化フェーズで適切に置き換えられます。 可変文字列引数では、一般に可能な値を決定することはできません。たとえば、設定ファイルから読み込むことができます。しかし、ProGuardは、 "(SomeClass)Class.forName(variable).newInstance()"のようないくつかの構造に注意します。これらは、クラスまたはインタフェースSomeClassおよび/またはその実装が保持される必要がある可能性があることを示している可能性があります。開発者はそれに応じて設定を変更することができます。だから、

、ProGuardの者は、あなたが予想より賢いこと:それは自動的にforName()のための使用の簡単な例を検出して処理します。 Androidマニフェストファイルでクラスが参照されていなくても、ProGuardはforName()への呼び出しでクラスの両方のクラス名を難読化します。活動のための

あなたはこの動作の両方でと@laaltoが彼の答えに言及して、ビルドプロセスの一部だProGuardのにAndroidの固有の入力により、二重に覆われている場合、それは私は驚かないだろう。

関連する問題