Класс не найден в aar

Я получаю исключение class not found в моей библиотеке Android (aar) при вызове GoogleApiAvailability.

    Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.android.gms.common.GoogleApiAvailability" on path: DexPathList[[zip file "/data/app/com.myunityplugin.PushNotifications-1/base.apk"],nativeLibraryDirectories=[/data/app/com.myunityplugin.PushNotifications-1/lib/arm, /vendor/lib, /system/lib]]

Ошибка говорит сама за себя, но я не уверен, что я делаю неправильно. Я новичок в Gradle и AndroidStudio.

У меня есть следующие зависимости в моем gradle.build:

    compile 'com.google.android.gms:play-services:8.4.0'
    compile 'com.google.android.gms:play-services-gcm:8.4.0'

Я думаю, проблема в том, что библиотеку play-services нужно включать в aar, а компиляция этого не делает. Я пытался использовать «среду выполнения», но получаю «среда выполнения gradle dsl не найдена».

Вопросы:

  1. Является ли это проблемой, когда мне нужно включить библиотеку play-services в мой aar, и как мне это сделать? (если нет, то как решить эту проблему)
  2. Нужно ли указывать play-services или достаточно play-services-gcm?

Информация об ошибке/настройка

Строка, вызывающая ошибку

GoogleApiAvailability ServiceAvailability = GoogleApiAvailability.getInstance();

Исключение:

05-23 05:38:48.221 28055-28055/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.myunityplugin.PushNotifications, PID: 28055
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/gms/common/GoogleApiAvailability;
   at com.myplugin.unitynotification.GCM.GCM.checkPlayServices(GCM.java:33)
   at com.myplugin.unitynotification.GCM.MainActivity.onCreate(MainActivity.java:80)
   at android.app.Activity.performCreate(Activity.java:6550)
   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1120)
   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3108)
   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3263)
   at android.app.ActivityThread.access$1000(ActivityThread.java:197)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1687)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:145)
   at android.app.ActivityThread.main(ActivityThread.java:6897)
   at java.lang.reflect.Method.invoke(Native Method)
   at java.lang.reflect.Method.invoke(Method.java:372)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.android.gms.common.GoogleApiAvailability" on path: DexPathList[[zip file "/data/app/com.myunityplugin.PushNotifications-1/base.apk"],nativeLibraryDirectories=[/data/app/com.myunityplugin.PushNotifications-1/lib/arm, /vendor/lib, /system/lib]]
   at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
   at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
   at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
   at com.myplugin.unitynotification.GCM.GCM.checkPlayServices(GCM.java:33) 
   at com.myplugin.unitynotification.GCM.MainActivity.onCreate(MainActivity.java:80) 
   at android.app.Activity.performCreate(Activity.java:6550) 
   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1120) 
   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3108) 
   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3263) 
   at android.app.ActivityThread.access$1000(ActivityThread.java:197) 
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1687) 
   at android.os.Handler.dispatchMessage(Handler.java:102) 
   at android.os.Looper.loop(Looper.java:145) 
   at android.app.ActivityThread.main(ActivityThread.java:6897) 
   at java.lang.reflect.Method.invoke(Native Method) 
   at java.lang.reflect.Method.invoke(Method.java:372) 
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) 
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) 
    Suppressed: java.lang.ClassNotFoundException: com.google.android.gms.common.GoogleApiAvailability
   at java.lang.Class.classForName(Native Method)
   at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
   at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
   at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
        ... 16 more
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available

Уровень приложения build.gradle

apply plugin: 'com.android.library'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        minSdkVersion 19
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.2.1'
    compile 'com.google.android.gms:play-services:8.4.0'
    compile 'com.google.android.gms:play-services-gcm:8.4.0'
    provided files('lib-not-include/classes.jar')
}

Уровень проекта gradle.build

// Top-level build file where you can add configuration options common to all sub-projects/modules.

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

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

person Shroder    schedule 23.05.2016    source источник
comment
установить classpath 'com.android.tools.build:gradle:2.0.0-alpha3' вместо 1.5.0   -  person IntelliJ Amiya    schedule 23.05.2016
comment
@Shroder Вы нашли решение этой проблемы? Я сталкиваюсь с той же ошибкой.   -  person IgorGanapolsky    schedule 20.12.2016


Ответы (1)


Файл aar не содержит вложенных (или transitive) зависимостей и не имеет pom-файла, который описывает зависимости, используемые библиотекой.

Это означает, что если вы импортируете файл aar с помощью репозитория flatDir, вы должны указать зависимости также в своем проекте.

Вы должны использовать репозиторий maven (вы должны опубликовать библиотеку в частном или общедоступном репозитории maven), у вас не будет такой же проблемы.
В этом случае gradle загружает зависимости, используя pom, который будет содержать список зависимостей.

person Gabriele Mariotti    schedule 23.05.2016
comment
Вот почему моя библиотека не работает. Знаете ли вы, может ли библиотека .jar иметь файл AndroidManifest.xml? - person luiscosta; 20.06.2016
comment
@luiscosta Нет. Файл jar не может содержать файл ресурсов. - person Gabriele Mariotti; 20.06.2016
comment
Значит, GoogleApiAvailability нельзя получить через зависимость Gradle? - person IgorGanapolsky; 20.12.2016
comment
Итак, что является хорошим способом обойти эту проблему? У меня есть файл aar с манифестом и class.jar, содержащий все классы. - person Akshay Shah; 09.06.2017
comment
Вы правы, я развертываю библиотеку aar, содержащую две собственные библиотеки и две оболочки jar, чтобы скрыть оболочки, которые я импортировал в свой локальный репозиторий maven с помощью mvn install:install-file -Dfile=myjar1.jar -DgroupId= com.my.package -DartifactId=engine -Dversion=1.1.1 -Dpackaging=jar и сослаться на него внутри проекта lib. Но если я не ссылаюсь на эти банки в проекте приложения, я просто обнаружил NoClassDefFoundError при попытке использовать любой класс этих банок. Знаете ли вы, как я могу решить эту проблему, избегая заполнения и ссылки на эти банки в проекте приложения? - person ariel; 09.08.2017
comment
@GabrieleMariotti, который действительно помог мне и сэкономил много моего времени, в любом случае мне не нужно публиковать свой aar в maven, а также не нужно предоставлять зависимость в проекте, используя мой aar? - person riksof-zeeshan; 14.09.2017