【发布时间】:2015-04-05 05:52:27
【问题描述】:
我在使用 gradle proguard 时遇到问题...我有以下模块:
- 应用程序:主应用程序模块。有依赖ModuleA和ModuleC
- ModuleA:库模块。有依赖 ModuleB 和 jar 依赖。
- ModuleB:库模块
- ModuleC:库模块
- 穿戴:穿戴应用模块。
build.gradle 文件: - 应用:
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile project(':ModuleA')
compile project(':ModuleC')
wearApp project(':Wear')
}
模块A:
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile project(':ModuleB')
}
模块B:
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
ModuleC:同ModuleB。
穿着:
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
**我只写了重要的几行
我的问题是,如果我使用该配置生成一个签名的 APK,当我将它安装在设备上时,它会崩溃并出现以下异常:
java.lang.NoSuchFieldError: 在类 Lcom/package/ClassInJar 中没有 name='peer' signature='J' 的字段;
它在模块 A 的 libs 文件夹中的 jar 中包含的类中崩溃。
如果我在所有模块中将 minifyEnabled 设置为 false,它不会崩溃,但我更喜欢混淆代码。如果我在库模块中将 minifyEnabled 设置为 true,它不会编译,它会显示这个异常:
Error:Execution failed for task ':ModuleB:proguardRelease'.
java.io.IOException:输出 jar 为空。您是否指定了正确的“-keep”选项?
【问题讨论】:
-
您在混淆时看到的崩溃是什么?
-
我更新了我的问题,但它在模块 A 的 libs 文件夹中的 jar 中的一个类中崩溃
-
你对它所抱怨的符号有 -keep 规则吗?
-
对不起,我听不懂你的问题
-
Proguard 可能会混淆需要保持清晰的符号,因为它们用于反射。您需要设置规则以使其保留。
标签: android android-studio gradle proguard obfuscation