Слишком много ссылок на методы в проекте библиотеки Android - ClassNotFoundException

У меня есть проект библиотеки, который я использую в основном проекте Android с использованием файла AAR. Я получаю знаменитый предел метода 65k, который я ожидал, но у меня есть несколько запросов.

Я добавил файл AAR в папку libs моего основного проекта и скомпилировал его в build.gradle.

1) Нужно ли добавлять многоэкранную поддержку как в библиотеке, так и в главном проекте андроида?

2) Нужно ли добавить afterEvaluate script в оба проекта?

Самое главное, если мы работаем с несколькими деками, мы можем получить проблему, что в главном проекте андроида мы получаем исключение Classnotfound, если какой-либо из класса, который мы пытаемся использовать, не находится в главном списке dex.

Редактирование: - Я пытаюсь продолжать публикацию обновлений на основе моего тестирования, поэтому любой, кто имеет какую-либо идею, может помочь всем нам.

зависимости, используемые в проекте: -

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:22.2.1'
    compile 'com.google.android.gms:play-services-gcm:7.8.0'
    compile 'com.google.android.gms:play-services-location:7.8.0'
    compile 'com.google.android.gms:play-services-ads:7.8.0'
    compile 'co.pointwise:pw-proto:0.0.5'
    compile 'com.amazonaws:aws-android-sdk-sns:2.2.1'
    compile 'com.amazonaws:aws-android-sdk-core:2.2.1'
    compile 'com.github.tony19:logback-android-core:1.1.1-4'
    compile 'com.github.tony19:logback-android-classic:1.1.1-4'
    compile 'org.slf4j:slf4j-api:1.7.6'
    compile 'com.android.support:multidex:1.0.0'
    compile(name: 'sdk-debug', ext: 'aar') // my library project

    // Crashlytics Kit
    compile('com.crashlytics.sdk.android:crashlytics:[email protected]') {
        transitive = true
    }
}

17-08-2015. Согласно документации, я изменил свой код и теперь его работу, но я не могу сгенерировать подписанный apk с proguard.

Файл Proguard выглядит так: -

-keep class ch.qos.** { *; }
-keep class org.slf4j.** { *; }
-keep class io.protostuff.** { *; }
-keep class com.google.common.** { *; }
-keep com.amazonaws.http.** { *; }
-keep com.amazonaws.internal.** { *; }
-keepattributes *Annotation*

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

# Keep SafeParcelable value, needed for reflection. This is required to support backwards
# compatibility of some classes.
-keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable {
    public static final *** NULL;
}

# Keep the names of classes/members we need for client functionality.
-keepnames @com.google.android.gms.common.annotation.KeepName class *
-keepclassmembernames class * {
    @com.google.android.gms.common.annotation.KeepName *;
}

# Needed for Parcelable/SafeParcelable Creators to not get stripped
-keepnames class * implements android.os.Parcelable {
    public static final ** CREATOR;
}

Ошибки: -

Warning: com.amazonaws.AmazonWebServiceClient: can't find referenced class org.apache.commons.logging.LogFactory
Warning: ch.qos.logback.core.net.SMTPAppenderBase: can't find referenced class javax.mail.internet.MimeMessage
Warning: com.google.common.base.Absent: can't find referenced class javax.annotation.Nullable
Warning: there were 1406 unresolved references to classes or interfaces.
         You may need to add missing library jars or update their versions.
         If your code works fine without the missing classes, you can suppress
         the warnings with '-dontwarn' options.
         (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedclass)
Warning: there were 9 unresolved references to program class members.
         Your input classes appear to be inconsistent.
         You may need to recompile the code.
         (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedprogramclassmember)
:app:proguardProdRelease FAILED

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

Любые идеи?

Ответ 1

Прежде всего, ознакомьтесь с официальной документацией , в которой подробно описывается, как добавить поддержку multi-dex.

Ответы:

Нужно ли добавлять многоэкранную поддержку как в библиотеке, так и в основной андроидный проект?

Укажите "multiDexEnabled = true" (по умолчаниюConfig) только в основном проекте Android. Не нужно объявлять его в библиотеках.

Нужно ли добавить afterEvaluate script в оба проекта?

v0.14.0 плагина Gradle для Android добавлена ​​поддержка multi-dex, и вам больше не нужно добавлять код, который вы упомянули. Плагин автоматически создаст основной список dex и передаст необходимую информацию процессу dex.

Опубликуйте результаты и сообщите нам, если у вас все еще есть ошибки ClassNotFoundException.

Я получаю следующую ошибку при попытке создать выпуск вариант с proguard:
Предупреждение: com.amazonaws.AmazonWebServiceClient: не может найти ссылочный класс org.apache.commons.logging.LogFactory

В своем github repo авторы AWS включили инструкции как настроить конфигурацию proguard:

-keep class org.apache.commons.logging.**               { *; }
-keep class com.amazonaws.services.sqs.QueueUrlHandler  { *; }
-keep class com.amazonaws.javax.xml.transform.sax.*     { public *; }
-keep class com.amazonaws.javax.xml.stream.**           { *; }
-keep class com.amazonaws.services.**.model.*Exception* { *; }
-keep class com.amazonaws.internal.**                   { *; }
-keep class org.codehaus.**                             { *; }
-keep class org.joda.convert.*                          { *; }
-keepattributes Signature,*Annotation*,EnclosingMethod
-keepnames class com.fasterxml.jackson.** { *; }
-keepnames class com.amazonaws.** { *; }

-dontwarn com.amazonaws.auth.policy.conditions.S3ConditionFactory
-dontwarn org.joda.time.**
-dontwarn com.fasterxml.jackson.databind.**
-dontwarn javax.xml.stream.events.**
-dontwarn org.codehaus.jackson.**
-dontwarn org.apache.commons.logging.impl.**
-dontwarn org.apache.http.conn.scheme.**
-dontwarn org.apache.http.annotation.**
-dontwarn org.ietf.jgss.**
-dontwarn org.w3c.dom.bootstrap.**

Обратите внимание, что в вашей конфигурации proguard отсутствует запись org.apache.commons.logging. **.