2016-08-15 40 views
5
我的Android应用程序崩溃的

发布版本有以下例外如何免除亲卫队库模块中的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"

此错误是在调试版本中发现,因此是因为我想是的proguard。

上面提到的类在其中一个也使用JNI库的模块中。 我proguard的规则应用模块文件低于

-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 

为有关模块的build.gradle文件低于

应用插件: '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') 
} 

即使添加了一行-keep class com.mm.android.dhproxy.client.DHProxyClient后,我可以看到usage.txt文件conatins以下条目

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 

在此先感谢。

回答

3

的解决方案是来查找需要被免除的方法和类新并将它们添加到ProGuard的规则如下(在这里,我需要保持在班级com.mm文件**和com.company。** **地方作为野生焦炭

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

您可以尝试将minifyEnabled设置为true,并使用以下命令生成发布版本。

./gradlew assembleRelease如果您使用的是Mac gradlew assembleRelease如果你正在使用的寡妇

检查构建运行命令后,看看它是否工作

+0

嗯,我想从缩小过程 – dmSherazi

+0

豁免图书馆我想,如果你不会让你minifyenabled真您的ProGuard会被忽略。你是否使用我提到的命令生成了发布版本? – Avinash4551

+0

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

2

如果您正在使用外部/独立的源图书馆与您的主要项目/应用程序,您不应该使用库模块上的proguard。相反,你替换下面,

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

具有以下(在库的build.gradle /库):

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

其中proguard的-project.txt是包含proguard相关文件您的图书馆项目的规则。在构建应用程序时(无论是在调试模式还是释放模式下),编译器都会处理所有规则(在库和应用程序中)。

来源:本stackoverflow answer

相关问题