用android studio混淆多个模块

用android studio混淆多个模块,android,android-studio,gradle,proguard,obfuscation,Android,Android Studio,Gradle,Proguard,Obfuscation,我和gradle proguard有问题。。。我有以下模块: 应用程序:主应用程序模块。具有依赖性ModuleA和ModuleC 模块a:库模块。具有依赖性模块B和jar依赖性 模块B:库模块 ModuleC:库模块 磨损:磨损应用程序模块 build.gradle文件: -应用程序: 模块a: buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile

我和gradle proguard有问题。。。我有以下模块:

  • 应用程序:主应用程序模块。具有依赖性ModuleA和ModuleC
  • 模块a:库模块。具有依赖性模块B和jar依赖性
  • 模块B:库模块
  • ModuleC:库模块
  • 磨损:磨损应用程序模块
build.gradle文件: -应用程序:

模块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相同

佩戴:

**我只写了重要的几行

我的问题是,如果我使用该配置生成签名的APK,当我将其安装到设备上时,它会崩溃,出现以下异常:

Error:Execution failed for task ':ModuleB:proguardRelease'.
java.lang.NoSuchFieldError:Lcom/package/ClassInJar类中没有名称为='peer'签名为='J'的字段

它在模块a的libs文件夹中的jar中包含的类中崩溃

如果我在所有模块中将minifyEnabled设置为false,它不会崩溃,但我更喜欢混淆代码。如果我在库模块中将minifyEnabled设置为true,它将不会编译,并显示以下异常:

Error:Execution failed for task ':ModuleB:proguardRelease'.
java.io.IOException:输出jar为空。您是否指定了正确的“-keep”选项


首先,必须了解proguard扮演两个主要角色:

  • 当proguard混淆时,它实际上会占用您的所有类、类成员、方法等,并更改它们的名称,因此会变得乱七八糟。这样一来,人们就很难对你的代码进行反向工程
  • 以某种方式压缩代码,以便在编译时丢弃所有未使用的类、类成员、方法等,从而使apk更精简
因此,就“minify”而言,它是不必要的,尽管它可能会在这里和那里为您节省几千字节。你可以把它关掉,一切都会好起来的

至于崩溃-发生这种情况是因为代码的一部分试图到达一个类,而该类的名称可能被混淆,因此丢失了。
尝试为proguard设置规则。可以这样做:

  • 找到“app”文件夹中“build.gradle”文件旁边的“proguard rules.pro”文件(下图)

  • 接下来,您需要为特定的类/类成员/方法等添加“keep”规则,这样就不会在这些元素上发生混淆。您在文件中注释了一些示例,例如:

    -keepclassmembers类fqcn.of.javascript.interface.for.webview{ 公众*; }


这意味着“不要混淆给定类中公共的任何类成员。

但是,keep有许多变体。
有关“保留”变体的更多信息,请在链接中查看此文档和示例(当您单击某个项目时):。


Good luck=)

在进行模糊处理时,您看到的崩溃是什么?我更新了我的问题,但它在模块ADo的libs文件夹中的一个jar中崩溃-保留它所抱怨的符号的规则?抱歉,但我无法理解您的quiestionProguard可能正在对需要保留在clear becau中的符号进行模糊处理它们用于反射。你需要建立规则让它保留它们。
Error:Execution failed for task ':ModuleB:proguardRelease'.