2016-08-15 19 views
5
wersję

wydaniem moich Android awarie aplikacji z następującym wyjątkiemJak zwolnić moduł biblioteki z Pro-guard w android Gradle

java.lang.NoSuchMethodError: no static or non-static method "Lcom/mm/android/dhproxy/client/DHProxyClient;.InitWithName(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)I"

Ten błąd nie występuje w wersji debug i stąd właśnie z powodu proguard, jak sądzę.

Powyższa klasa znajduje się w jednym z modułów, które również korzystają z bibliotek JNI. Moi PROGUARD-rules dla aplikacji moduł pliku jest poniżej

-keepattributes InnerClasses 
-dontoptimize 
-keep class com.mm.android.dhproxy.client.DHProxyClient 
-keepclasseswithmembernames class * { 
    native <methods>; 
} 
-keep class mypackage.MyCallbackClass { 
    void myCallbackMethod(java.lang.String); 
} 
-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 

-printmapping build/outputs/mapping/release/mapping.txt 

Plik build.gradle dla danego modułu jest poniżej

zastosowanie wtyczki: 'com.android.library'

android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.3" 
    compileOptions.encoding = 'ISO-8859-1' 

    defaultConfig { 

     minSdkVersion 14 
     targetSdkVersion 23 
    } 

    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
     } 
    } 
} 

dependencies { 
    compile files('libs/IPlaySDK.jar') 
    compile files('libs/ToUProxy.jar') 
} 

nawet po dodaniu linii -keep class com.mm.android.dhproxy.client.DHProxyClient Widzę, że plik usage.txt zawiera następujące wpisy:

com.mm.android.dhproxy.client.DHProxyClient: 
    29:35:public boolean initWithName(java.lang.String,int,java.lang.String,java.lang.String) 
    64:69:public int delPort(int) 
    136:141:public int queryRate(int,com.mm.android.dhproxy.client.DHProxyRateParam) 
    158:163:public int p2pSetOption(int,int) 
    180:185:public int p2pGetOption(int) 
    192:197:public int exit() 
    private native int InitWithName(java.lang.String,int,java.lang.String,java.lang.String) 
    private native int DelPort(int,int) 
    private native int P2PSetOption(int,int,int) 
    private native int P2PGetOption(int,int) 
    private native int QueryRate(int,com.mm.android.dhproxy.client.DHProxyRateParam,int) 
    private native int Exit(int) 
com.mm.android.dhproxy.client.DHProxyRateParam 

Z góry dziękuję.

Odpowiedz

3

Rozwiązaniem jest patrzeć na metodach i classess, które muszą być wyłączone i dodać je do zasad PROGUARD następująco (Tutaj musiałem trzymać pliki w klasach com.mm . ** i com.company. ** ** gdzie działa jako dzikie char

-keep class com.mm.** {*;} 
-keep class com.company.** {*;} 
-keepclassmembers class com.mm.** {*;} 
-keepclassmembers class com.company.** {*;} 
0

Czy możesz spróbować ustawić minifyEnabled na true i wygenerować kompilację wydania za pomocą następującego polecenia.

./gradlew assembleRelease jeśli używasz Mac gradlew assembleRelease jeśli używasz wdowy

Sprawdź build po uruchomiono komendę i sprawdzić, czy to działa

+0

Dobrze Chcę biblioteka zostać zwolnione z minify procesu – dmSherazi

+0

myślę, jeśli nie sprawi, że minifyenabled prawdziwa wola Twoja PROGUARD zostać zignorowane. Czy wygenerowałeś kompilację wydania za pomocą wydanych poleceń? – Avinash4551

+0

wydanie { minifyEnabled false proguardFiles getDefaultProguardFile ('proguard-android.txt'), 'proguard-rules.txt' } – dmSherazi

2

Jeśli używasz oddzielnego źródła zewnętrznego/biblioteki z twoim głównym projektem/aplikacją, nie powinieneś używać proguarda w modułach bibliotecznych. Zamiast tego, należy wymienić następujące,

buildTypes { 
    release { 
     minifyEnabled true 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt' 
    } 
    debug { 
     minifyEnabled false 
    } 
} 

z następujących (w build.gradle biblioteki/bibliotek)

buildTypes { 
    release { 
     consumerProguardFiles 'proguard-project.txt' 
    } 
} 

gdzie PROGUARD-project.txt jest plik zawierający ProGuard zasady dla twojego projektu bibliotecznego. Podczas budowania aplikacji (w trybie debugowania lub wydania) kompilator zajmie się wszystkimi regułami (w bibliotece i aplikacji).

Źródło: Ten stackoverflow answer