Android版EclipseでのProGuardの有効化


112

Android用ProGuardの新しいドキュメントでは、プロジェクトのホームディレクトリにあるdefault.propertiesファイルに行を追加するように指示されています。しかし、このファイルを開くと、私は最初に読みました:

# This file is automatically generated by Android Tools. 
# Do not modify this file -- YOUR CHANGES WILL BE ERASED! 

何か不足していますか?

また、Eclipseからのプロダクションビルドに対してのみProGuardを有効にする方法はありますか(つまり、完成した製品をエクスポートする場合)?


default.propertiesは毎回再生成されるという点に同意します。したがって、これは興味深い質問です
アマン・アラム、

ligiの回答を受け入れる必要があります。NeTeInStEiNは保持されなくなり、新しいユーザーを混乱させます。
Gaurav Agarwal 2012

2
回答を最新のものに変更しました。
neteinstein 2014

新しいインストールの場合、ligiの答えはneteinsteinの答えよりも明確です。最も重要なのproguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt は、特定のプロジェクトにカスタム設定が必要な場合に表示されます。
ToolmakerSteve 2017

回答:


76

私が同じことを探していたので、ただフォローアップします-そしてここでの答えは古くなっています-最近の基本的なプロガード設定はここのsdk dirにあります-これをあなたのproject.propertiesに入れるだけです:

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

プロジェクト固有の変更を行う場合は、proguard-project.txtを作成し、行を次のように変更します。

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

(R20ではなく、以前のリリースで生成された)、上記の方法の組み合わせを使用するように見える私のプロジェクトを見て:
トム・

26
project.propertiesにも次のように記載されているため、まだかなり混乱しています。#このファイルは変更しないでください-変更は消去されます!
Todd Painton、2012

12
「これをあなたのproject.propertiesに入れるだけです」。この行はproject.propertiesにありますが、デフォルトでコメント化されています。コメントを外してください。
ブラジ2013

113

Android SDK(r20以降)

project.propertiesで参照されている事前定義されたproguard.configを確認してください

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

詳細:http : //proguard.sourceforge.net/manual/examples.html#androidapplication

Gradleの場合:

buildTypes {
 release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

            ...
  }
 }

ここで、更新を続けるProguardの「デフォルト」ファイルを確認できます。https://medium.com/code-procedure-and-rants/android-my-standard-proguard-ffeceaf65521


Android SDK(r19以下)

これをdefault.propertiesに追加できます。これまで問題なく手動で追加してきました。

次の行を追加すると、

proguard.config=proguard.cfg

前述のように、署名付きアプリケーションをエクスポートするときにのみProGuardを使用します(Android Tools => Export Signed Application)

Android 2.3より前のSDKでプロジェクトを開始した場合、proguard.cfgファイルは作成されません(default.properties2.3>のように)。

自動作成を有効にするには、Android 2.3のSDKに更新し、既存のソース(現在使用しているプロジェクトのソース)で新しいプロジェクトを作成するだけです。

自動的にproguard.cfg塗りつぶしが作成されます。

それでも手動で作成したい場合は、次のようにします。

-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontwarn android.support.**
-verbose

-dontoptimize
-dontpreverify


-keepattributes *Annotation* 
-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.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
-keep public class * extends android.support.v4.app.Fragment
-keep public class * extends android.app.Fragment

-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 public class * extends android.view.View {
  void set*(***);
  *** get*();
 }

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

-keepclassmembers class **.R$* {
  public static <fields>;
}

上記のすべての質問に答えたと思います。

更新

行ごとの説明:

#Use 5 step of optimization 
#-optimizationpasses 5

#When not preverifing in a case-insensitive filing system, such as Windows. This tool will unpack your processed jars,(if using windows you should then use):
-dontusemixedcaseclassnames

#Specifies not to ignore non-public library classes. As of version 4.5, this is the default setting
-dontskipnonpubliclibraryclasses

# Optimization is turned off by default. Dex does not like code run
# through the ProGuard optimize and preverify steps (and performs some
# of these optimizations on its own).    
-dontoptimize
-dontpreverify

-dontwarn android.support.**

#Specifies to write out some more information during processing. If the program terminates with an exception, this option will print out the entire stack trace, instead of just the exception message.
-verbose

#The -optimizations option disables some arithmetic simplifications that Dalvik 1.0 and 1.5 can't handle. Note that the Dalvik VM also can't handle aggressive overloading (of static fields).
#To understand or change this check http://proguard.sourceforge.net/index.html#/manual/optimizations.html
#-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

# Note that if you want to enable optimization, you cannot just
# include optimization flags in your own project configuration file;
# instead you will need to point to the
# "proguard-android-optimize.txt" file instead of this one from your
# project.properties file.

#To repackage classes on a single package
#-repackageclasses ''

#Uncomment if using annotations to keep them.
#-keepattributes *Annotation*

#Keep classes that are referenced on the AndroidManifest
-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
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
#Compatibility library 
-keep public class * extends android.support.v4.app.Fragment
-keep public class * extends android.app.Fragment

#To maintain custom components names that are used on layouts XML.
#Uncomment if having any problem with the approach below
#-keep public class custom.components.package.and.name.**

# keep setters in Views so that animations can still work.
# see http://proguard.sourceforge.net/manual/examples.html#beans
 -keepclassmembers public class * extends android.view.View {
  void set*(***);
  *** get*();
}

#To remove debug logs:
-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
    public static *** w(...);
}

#To avoid changing names of methods invoked on layout's onClick.
# Uncomment and add specific method names if using onClick on layouts
#-keepclassmembers class * {
# public void onClickButton(android.view.View);
#}

#Maintain java native methods 
-keepclasseswithmembernames class * {
    native <methods>;
}


#To maintain custom components names that are used on layouts XML:
-keep public class * extends android.view.View {
    public <init>(android.content.Context);
}
-keep public class * extends android.view.View {
    public <init>(android.content.Context, android.util.AttributeSet);
}
-keep public class * extends android.view.View {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

#Maintain enums
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

#To keep parcelable classes (to serialize - deserialize objects to sent through Intents)
-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

#Keep the R
-keepclassmembers class **.R$* {
    public static <fields>;
}

###### ADDITIONAL OPTIONS NOT USED NORMALLY

#To keep callback calls. Uncomment if using any
#http://proguard.sourceforge.net/index.html#/manual/examples.html#callback
#-keep class mypackage.MyCallbackClass {
#   void myCallbackMethod(java.lang.String);
#}

#Uncomment if using Serializable 
#-keepclassmembers class * implements java.io.Serializable {
#    private static final java.io.ObjectStreamField[] serialPersistentFields;
#    private void writeObject(java.io.ObjectOutputStream);
#    private void readObject(java.io.ObjectInputStream);
#    java.lang.Object writeReplace();
#    java.lang.Object readResolve();
#}

更新2:

最新のADT / Proguard -keepclasseswithmembersでは、-keepclasseswithmembernames


1
@NeTeInStEiN SDK 16(Android 4.x)に更新し、行を追加しましたproguard.config=proguard.cfgが、proguard.cfgファイルが表示されません...複数回エクスポートを実行したにもかかわらず、Eclipseを再起動しました。そしてこれを修正するには?ありがとう。
Bill The Ape、2012年

1
@NeTeInStEiN気にしないでください。自分で作成する必要があったことがわかりました。
Bill The Ape、2012年

@NeTeInStEiNプロジェクトを作成すると、ビルドターゲットはAndroid1.1ですが、自動的に作成されるproguard.cfgファイルが見つかりました。
hasanghaforian

1
@NeTeInStEiN素晴らしい男...本当にあなたの時間と努力に感謝します、乾杯!!
swiftBoy 2013年

1
@ user31231234124要求された情報を追加しました。
neteinstein

10

ADT 16以降では、実際にで行を追加でき、project.propertiesそれは保持されます。ターゲットSDKのバージョンを変更してみると、project.propertiesそれに応じて更新されますが、追加された行はまだ残っています。したがって、警告の言葉遣いはひどいものだと思います。つまり、などのファイル内の設定は、targetプロジェクト設定で上書きされるのではなく、その逆になるということです。


4

ProGuard構成への変更は、ADTバージョン17で行われました。ProGuardは4.4から4.7に更新され、構成ファイルの参照の違いはすでに注記されています。既存のプロジェクトは変更されないままであり、このバージョンと新しいADTバージョンに含まれる新しいルールセットがないままになることに注意してください。上記のligiですでに注記されている、新しい構成の配置に関する関連ドキュメントは、次の場所にあります。

http://tools.android.com/recent/proguardimprovements「2番目に、設定ファイルの処理方法を変更しました。」


3

で説明したように、行をbuild.propertiesに追加できdefault.propertiesます。


build.propertiesはどこにありますか?それとも作成する必要がありますか?
Ted Hopp、2011年

プロジェクトディレクトリのdefault.propertiesの横にあります(少なくともAndroid SDK r8では)。
エリックラフォーチューン

それはそれを探していたところですが、私のプロジェクトのいずれにもそのようなファイルはありません。私は最新のプラグインを使用しており、これをチェックするためにレベル8のプロジェクトを作成しました。
テッドホップ

4
build.propertiesの使用はAntビルドでのみ機能し、Eclipseビルドでは機能しないことがわかりました。
テッドホップ

2016 android studio buldのbuild.propertiesはどこにありますか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.