web-dev-qa-db-fra.com

Android Gestion du progiciel Studio dans les projets multi-bibliothèques

J'ai une application qui utilise une bibliothèque référencée en externe (c'est-à-dire que le répertoire de la bibliothèque est au même niveau que l'application - il n'est pas copié dans le dossier de l'application). La bibliothèque est référencée par l'application et la bibliothèque et l'application incluent des fichiers proguard. Tout fonctionne bien jusqu'à ce que je crée l'application. Lorsque j'ai créé l'application, toutes les références aux classes définies dans la bibliothèque ne sont pas trouvées - j'obtiens "ne peut pas trouver de classe de symboles ...) des erreurs sur toutes les importations de classes de bibliothèque. Comme je l'ai trouvé, c'est parce que lors de la reconstruction de l'application, proguard masque toutes les classes et variables et par conséquent, l'application ne peut pas les référencer. J'ai ajouté ce qui suit à mon fichier build.gradle,

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

mais il semble que lors de la construction de l'application, ce qui précède n'est pas pris en compte (ou la construction se fait en mode release). Si je change ce qui précède en ce qui suit (c'est-à-dire, désactiver proguard en mode de libération)

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

l'application se compile très bien.

Y a-t-il une solution à cela? Puis-je activer proguard uniquement lors de la création d'une application signée?

Voici le fichier proguard de la bibliothèque:

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

Est-ce un problème que j'utilise proguard à la fois dans la bibliothèque et dans l'application?

28
a.p.

Après quelques recherches, j'ai trouvé la réponse. Si vous utilisez des bibliothèques source externes/séparées avec votre projet/application principale, vous ne devez pas utiliser de proguard sur les modules de bibliothèque. Au lieu de cela, vous remplacez ce qui suit,

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

avec ce qui suit (dans le build.gradle de la bibliothèque/bibliothèques):

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

où proguard-project.txt est le fichier qui contient les règles de proguard pour votre projet de bibliothèque. Lors de la construction de l'application (en mode debug ou release), le compilateur prendra en charge toutes les règles (dans la bibliothèque et dans l'application).

53
a.p.

Je pense que vous devez définir des règles de proguard pour vos bibliothèques. Ils se trouvent généralement dans les documents de la bibliothèque.

(Par exemple, jetez un œil à ma réponse ici pour ButterKnife lib: link )

1
Andrey