web-dev-qa-db-ja.com

Androidマルチライブラリプロジェクトでのスタジオプロガード処理

外部参照ライブラリを使用するアプリケーションがあります(つまり、ライブラリのディレクトリはアプリケーションと同じレベルにあります-アプリケーションのフォルダ内にコピーされません)。ライブラリはアプリケーションによって参照され、ライブラリとアプリケーションの両方にproguardファイルが含まれます。アプリケーションをビルドするまで、すべて正常に動作します。アプリをビルドしたときに、ライブラリで定義されたクラスを参照するすべてが見つかりません-ライブラリクラスのすべてのインポートで「シンボルクラスが見つかりません...」というエラーが表示されます。私が見つけたように、これは、アプリケーションを再構築するときに、proguardがすべてのクラスと変数を難読化するため、アプリケーションがそれらを参照できないためです。 build.gradleファイルに次を追加しました。

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-project.txt'
    }
    debug {
        minifyEnabled false
    }
}

しかし、アプリケーションを構築するとき、上記は考慮されていないようです(または構築はリリースモードで行われます)。上記を次のように変更する(つまり、リリースモードでプロガードを無効にする)と、

buildTypes {
    release {
        **minifyEnabled false**
        proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-project.txt'
    }
    debug {
        minifyEnabled false
    }
}

アプリケーションは正常にコンパイルされます。

これに対する解決策はありますか?署名済みアプリケーションの作成時にのみプロガードを有効にできますか?

ライブラリプロガードファイルは次のとおりです。

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-optimizations !method/marking/static

-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.Android.vending.licensing.ILicensingService

-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 *;
}

-dontwarn **CompatHoneycomb
-keep class Android.support.v4.** { *; }

-keep class * extends Java.util.ListResourceBundle {
    protected Object[][] getContents();
}

-keep public class com.google.Android.gms.common.internal.safeparcel.SafeParcelable {
    public static final *** NULL;
}

-keepnames @com.google.Android.gms.common.annotation.KeepName class *
-keepclassmembernames class * {
    @com.google.Android.gms.common.annotation.KeepName *;
}

-keepnames class * implements Android.os.Parcelable {
    public static final ** CREATOR;
}

-keep class com.google.Android.gms.** { *; }

-keep public class com.google.ads.** { public *; }
-keep public class com.google.gson.** { public protected *; }
-keep public class com.google.ads.internal.** {*;} 
-keep public class com.google.ads.internal.AdWebView.** {*;} 
-keep public class com.google.ads.internal.state.AdState {*;} 
-keep public class com.google.ads.mediation.** { public *; }

-keep public class com.google.ads.searchads.** {*;} 
-keep public class com.google.ads.util.** {*;} 

-keep class com.google.ads.**
-dontwarn com.google.ads.**

-keepattributes *Annotation*

ライブラリとアプリケーションの両方でproguardを使用しているのは問題ですか?

28
a.p.

いくつかの検索の後、私は答えを見つけました。メインプロジェクト/アプリケーションで外部/個別のソースライブラリを使用している場合、ライブラリモジュールでプロガードを使用しないでください。代わりに、次のものを置き換えます。

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-project.txt'
    }
    debug {
        minifyEnabled false
    }
}

以下を使用して(ライブラリ/ライブラリのbuild.gradleに):

buildTypes {
    release {
        consumerProguardFiles 'proguard-project.txt'
    }
}

proguard-project.txtは、ライブラリプロジェクトのプロガードルールを含むファイルです。アプリケーションをビルドするとき(デバッグモードまたはリリースモードのいずれか)、コンパイラはすべてのルール(ライブラリおよびアプリケーション内)を処理します。

53
a.p.