2016-09-01 3 views
3

ich nur auf ProGuard auf meinem Build gedreht und jetzt bin ich immer einWarum erhalte ich bei Verwendung von Proguard eine ClassNotFoundException von Play Services lib?

java.lang.ClassNotFoundException: Didn't find class "com.google.android.gms.chimera.GmsModuleInitializer" on path: DexPathList[[zip file "/system/app/PlayGames.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]] 

Die docs sagen, dass alles, was ich brauche Proguard mit Play-Dienste zu verwenden, sollte von der Android Gradle Plugin aufgenommen werden:

Hinweis: ProGuard-Anweisungen sind in den Play Services-Clientbibliotheken enthalten, um die erforderlichen Klassen beizubehalten. Das Android Plugin für Gradle hängt automatisch ProGuard Konfigurationsdateien in einem AAR (Android ARchive) Paket an und hängt dieses Paket an Ihre ProGuard Konfiguration an. Während der Projekterstellung erstellt Android Studio automatisch die ProGuard-Konfigurationsdateien und die Build.gradle-Eigenschaften für ProGuard. Um ProGuard mit Android Studio verwenden zu können, müssen Sie in Ihren build.gradle buildTypes die Einstellung "ProGuard" auf setzen. Weitere Informationen finden Sie im ProGuard-Handbuch.

Dies ist der wichtige Teil meiner App-Modul build.gradle Datei:

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.3" 
    defaultConfig { 
     ... 
    } 
    ... 
    buildTypes { 
     ...{ 
      applicationIdSuffix ".debug" 
      minifyEnabled true 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 
        'proguard-rules.pro' 
     } 
    } 
} 


dependencies { 
    ... 

    //google play services 
    compile 'com.google.android.gms:play-services-gcm:8.4.0' 
    compile 'com.google.android.gms:play-services-analytics:8.4.0' 
    compile 'com.google.android.gms:play-services-location:8.4.0' 
} 

Das ist meine Top-Level-build.gradle Datei:

buildscript { 
    repositories { 
     jcenter() 
     mavenCentral() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:2.1.2' 
    } 
} 

allprojects { 
    repositories { 
     jcenter() 
     mavenCentral() 
    } 
} 

Was bin ich?

Antwort

5

ClassNotFoundException tritt normalerweise auf, wenn eine Anwendung versucht, eine Klasse über ihren Zeichenfolgennamen zu laden, aber keine Definition für die Klasse mit dem angegebenen Namen gefunden werden konnte.

Von diesem forum können Sie es beheben, indem Sie com.google.android.gms.** { *; } hinzufügen.

Fügen Sie einfach zu Ihrem proguard-project.txt.

  • keep Klasse com.google.android.gms ** {*; }
  • dontwarn com.google.android.gms. **

Sie können auch in diesem SO question auf dem vorgeschlagenen Kommentar überprüfen.

Die Google Play Services-Aars enthalten proguard.txt mit den erforderlichen Klauseln. Daher sollte die Einstellung nicht wirklich notwendig sein. Sie können untersuchen, was mit dem Fragment in ProGuard-Ausgabedateien passiert ist. Überprüfen Sie app/build/output/mapping/{buildVariant}/usage.txt und mapping.txt. Das Fragment sollte in einem davon erwähnt werden.

Hoffe, das hilft!

+0

Danke. Ich hatte die keep/dontwarn Flags hinzugefügt. Freut mich zu wissen, dass sie "nicht" gebraucht werden sollten, wie ich dachte. Ich werde die Ausgabezuordnungen untersuchen. – tir38

Verwandte Themen