如何在 android gradle 中免除库模块的保护
How to exempt a library module from pro-guard in android gradle
我的 Android 应用程序的发布版本崩溃并出现以下异常
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"
在调试版本中没有发现这个错误,因此我猜是因为混淆器。
上面提到的 class 是在也使用 JNI 库的模块之一中。
我的 proguard-rules app 模块 文件在
下面
-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 文件包含以下条目
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
提前致谢。
您能否尝试将 minifyEnabled 设置为 true 并使用以下命令生成发布版本。
./gradlew assembleRelease 如果你使用 mac
gradlew assembleRelease 如果你使用寡妇
在 运行 命令后检查构建,看看它是否有效
如果您在主 project/application 中使用 external/separate 源库,则不应在库模块上使用混淆器。相反,您替换以下内容,
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
}
debug {
minifyEnabled false
}
}
与以下内容(在 library/libraries 的 build.gradle 中):
buildTypes {
release {
consumerProguardFiles 'proguard-project.txt'
}
}
其中 proguard-project.txt 是包含您的库项目的混淆规则的文件。构建应用程序时(在调试或发布模式下),编译器将处理所有规则(在库和应用程序中)。
来源:这个
解决办法是查找需要免除的方法和类添加到proguard规则中如下(这里我需要把文件放在类com.mm.** 和 com.company.** 其中 ** 充当通配符
-keep class com.mm.** {*;}
-keep class com.company.** {*;}
-keepclassmembers class com.mm.** {*;}
-keepclassmembers class com.company.** {*;}
我的 Android 应用程序的发布版本崩溃并出现以下异常
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"
在调试版本中没有发现这个错误,因此我猜是因为混淆器。
上面提到的 class 是在也使用 JNI 库的模块之一中。 我的 proguard-rules app 模块 文件在
下面-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 文件包含以下条目
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
提前致谢。
您能否尝试将 minifyEnabled 设置为 true 并使用以下命令生成发布版本。
./gradlew assembleRelease 如果你使用 mac gradlew assembleRelease 如果你使用寡妇
在 运行 命令后检查构建,看看它是否有效
如果您在主 project/application 中使用 external/separate 源库,则不应在库模块上使用混淆器。相反,您替换以下内容,
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
}
debug {
minifyEnabled false
}
}
与以下内容(在 library/libraries 的 build.gradle 中):
buildTypes {
release {
consumerProguardFiles 'proguard-project.txt'
}
}
其中 proguard-project.txt 是包含您的库项目的混淆规则的文件。构建应用程序时(在调试或发布模式下),编译器将处理所有规则(在库和应用程序中)。
来源:这个
解决办法是查找需要免除的方法和类添加到proguard规则中如下(这里我需要把文件放在类com.mm.** 和 com.company.** 其中 ** 充当通配符
-keep class com.mm.** {*;}
-keep class com.company.** {*;}
-keepclassmembers class com.mm.** {*;}
-keepclassmembers class com.company.** {*;}