如何在 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.** {*;}