6

私が最近作成したプロジェクトでは、ビルド済みのスクリプトを使用するプロガードへの新しいアプローチがあることに気付きました。

${sdk.dir}/tools/proguard/proguard-android.txt

これは最適化されておらず、コメントが付いています。

最適化はデフォルトでオフになっています。Dex は、ProGuard の最適化および事前検証の手順を実行するコードを好みません (また、これらの最適化の一部を単独で実行します)。

このアドバイスに従うことassumenosideeffectsは、効果がないことを意味するようです。たとえば、次の一般的なタスク:

#Remove logging
-assumenosideeffects class android.util.Log {
    public static boolean isLoggable(java.lang.String, int);
    public static int v(...);
    public static int i(...);
    public static int w(...);
    public static int d(...);
    public static int e(...);
}

#Remove asserts
-assumenosideeffects class junit.framework.Assert {
  public static *** assert*(...);
}

機能していないことの証明:

if (release)
{
    Assert.assertTrue("Proguard config error, Asserts have been left in", false);
}

で定義されているように最適化を適用してデバッグを削除できますassumenosideeffectsが、Dex とプロガードの最適化に関連する問題を危険にさらすことなく、安全な妥協点はありますか?

4

1 に答える 1

3

私が見つけた解決策は、assumenosideeffectsコマンドが依存する最適化のみを明示的に有効にすることです。したがって、proguard 構成の例は次のようになります。

# proguard-project.txt

# Remove all Verbose/Debug logging
-optimizations code/removal/simple,code/removal/advanced
-dontobfuscate
-assumenosideeffects class android.util.Log {
    public static int v(...);
    public static int d(...);
}

を 1 回呼び出すだけで最適化が無効になるため、project.properties ファイルで最適化SDK の proguard 構成ファイルを指定する必要があることに注意してください-dontoptimize

# project.properties

proguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt
于 2013-10-16T21:57:32.850 に答える