2016-09-01 4 views
3

Я просто включил ProGuard на моей сборки, и теперь я получаюПочему я получаю ClassNotFoundException из Play Services lib при использовании Proguard?

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

документы говорят, что все, что мне нужно использовать Proguard с Play Services должен быть включен плагин Android Gradle:

Примечание. Директивы ProGuard включены в список сервисов Play Apps для сохранения необходимых классов. Плагин Android для Gradle автоматически добавляет файлы конфигурации ProGuard в пакете AAR (Android ARchive) и добавляет этот пакет в конфигурацию ProGuard . Во время создания проекта Android Studio автоматически создает файлы конфигурации ProGuard и свойства build.gradle для использования ProGuard. Чтобы использовать ProGuard с Android Studio, вы должны включить параметр в настройках ProGuard в ваших build.gradle buildTypes. Для получения дополнительной информации см. Руководство ProGuard.

Это важная часть моего приложения файл модуля build.gradle:

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' 
} 

Это мой верхний уровень build.gradle файла:

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

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

Что мне не хватает?

ответ

5

ClassNotFoundException обычно возникает, когда приложение пытается загрузить в класс через его строковое имя, но определение класса с указанным именем не может быть найдено.

Из этого forum вы можете исправить это, добавив com.google.android.gms.** { *; }.

Просто добавьте в Proguard-project.txt:.

  • com.google.android.gms класса Keep ** {*; }
  • dontwarn com.google.android.gms. **

Вы также можете проверить на предложенный комментарий в этом SO question.

В продуктах Google Play Services содержится proguard.txt с необходимыми предложениями. Поэтому настройка не должна быть необходимой. Вы можете узнать, что произошло с фрагментом в выходных файлах ProGuard. Проверьте app/build/output/mapping/{buildVariant} /usage.txt и mapping.txt. Осколок следует упомянуть в одном из них.

Надеюсь, это поможет!

+0

Спасибо. Я добавил эти флаги keep/dontwarn. Рад знать, что они «не должны» нуждаться, как я думал. Я буду исследовать выходные отображения. – tir38

Смежные вопросы