NoClassDefFoundError при использовании дооснащения 2.4.0 в модуле (библиотека Android) - PullRequest
0 голосов
/ 04 июня 2018

Работал над использованием модернизации в библиотеке Android для проекта.Хотя, если он настроен в режиме ожидания приложения или если источник библиотеки является частью проекта приложения, кажется, что все работает хорошо.

Но если проект библиотеки запрограммирован и включен в приложение как@aar.Кажется, есть проблема обфускации.

Вот мой совет по модернизации в проекте модуля Android:

-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keepattributes Exceptions
-keepattributes RuntimeVisibleAnnotations
-keepattributes RuntimeInvisibleAnnotations
-keepattributes RuntimeVisibleParameterAnnotations
-keepattributes RuntimeInvisibleParameterAnnotations

-keepattributes EnclosingMethod
-keepclasseswithmembers class * {
    @retrofit2.http.* <methods>;
}
-keepclasseswithmembers interface * {
    @retrofit2.* <methods>;
}

# Platform calls Class.forName on types which do not exist on Android to determine platform.
-dontnote retrofit2.Platform
# Platform used when running on RoboVM on iOS. Will not be used at runtime.
-dontnote retrofit2.Platform$IOS$MainThreadExecutor
# Platform used when running on Java 8 VMs. Will not be used at runtime.
-dontwarn retrofit2.Platform$Java8
# Retain generic type information for use by reflection by converters and adapters.
-keepattributes Signature
# Retain declared checked exceptions for use by a Proxy instance.
-keepattributes Exceptions

# Retain generic type information for use by reflection by converters and adapters.
-keepattributes Signature
# Retain service method parameters.
-keepclassmembernames,allowobfuscation interface * {
    @retrofit2.http.* <methods>;
}
# Ignore annotation used for build tooling.
-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement

-keep public interface com.mylibrary.interfaces.**
-keep public class com.mylibrary.rest.RetrofitClientInstance
-keep public class com.mylibrary.models.** {*;}

-dontwarn org.xmlpull.v1.**
-dontwarn javax.annotation.**


### OkHttp3
-dontwarn okhttp3.**
-dontwarn okio.**
-dontwarn javax.annotation.**
# A resource is loaded with a relative path so the package of this class must be preserved.
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase

И вот так выглядит мой класс RetrofitClientInstance:

public class RetrofitClientInstance {

    private static Retrofit retrofit;

    public static Retrofit getRetrofitInstance() {
        if (retrofit == null) {
            retrofit = new retrofit2.Retrofit.Builder()
                    .baseUrl(Constants.BASE_API_URL)
                    .addConverterFactory(ScalarsConverterFactory.create())
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }
}

И ошибка, которую яполучаю:

java.lang.NoClassDefFoundError: Failed resolution of: Lretrofit2/Retrofit$Builder;
        at com.mylibrary.rest.RetrofitClientInstance.getRetrofitInstance(RetrofitClientInstance.java:15)
        at com.mylibrary.rest.LoginAPIHelper.<init>(LoginAPIHelper.java:29)
        at com.mylibrary.rest.LoginAPIHelper.getInstance(LoginAPIHelper.java:36)
        at com.view.LoginActivity.onCreate(LoginActivity.java:124)
        at android.app.Activity.performCreate(Activity.java:6772)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2715)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2823)
        at android.app.ActivityThread.-wrap12(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1545)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6349)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:893)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:783)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "retrofit2.Retrofit$Builder" on path: DexPathList[[zip file "/data/app/com.inventaapp-2/base.apk"],nativeLibraryDirectories=[/data/app/com.inventaapp-2/lib/arm, /data/app/com.inventaapp-2/base.apk!/lib/armeabi-v7a, /system/lib, /vendor/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        at com.mylibrary.rest.RetrofitClientInstance.getRetrofitInstance(RetrofitClientInstance.java:15) 
        at com.mylibrary.rest.LoginAPIHelper.<init>(LoginAPIHelper.java:29) 
        at com.mylibrary.rest.LoginAPIHelper.getInstance(LoginAPIHelper.java:36) 
        at com.inventaapp.view.LoginActivity.onCreate(LoginActivity.java:124) 
        at android.app.Activity.performCreate(Activity.java:6772) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2715) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2823) 
        at android.app.ActivityThread.-wrap12(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1545) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6349) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:893) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:783) 

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

Кроме того, если aar импортируется как библиотека.Но если я добавлю импортированный Gradle-импорт в основной проект Gradle.Это работает и в этом случае.

Что мне здесь не хватает?Кажется, что проблема похожа на это: https://github.com/square/retrofit/issues/1811

К вашему сведению, мой грейдл выглядит так:

 implementation 'com.google.code.gson:gson:2.8.2'
 implementation 'com.squareup.retrofit2:retrofit:2.4.0'
 implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
 implementation 'com.squareup.retrofit2:converter-scalars:2.4.0'

Любая помощь очень ценится.

Заранее спасибо, Арнаб

...