android - 使用android studio混淆多个模块

标签 android android-studio gradle proguard obfuscation

我在使用 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'
    }
}

模块C:与模块B相同。

穿着:

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

**我只写了重要的几行

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

java.lang.NoSuchFieldError: no field with name='peer' signature='J' in class Lcom/package/ClassInJar;

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

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

Error:Execution failed for task ':ModuleB:proguardRelease'.

java.io.IOException: The output jar is empty. Did you specify the proper '-keep' options?

最佳答案

首先,重要的是要了解 proguard 起着两个主要作用:

  • 当 proguard 混淆 时,它实际上会获取您所有的类、类成员、方法等并更改它们的名称,因此它会变得乱码。这样一来,别人就很难对您的代码进行逆向工程。
  • 它以某种方式压缩代码,以便在编译时丢弃每个未使用的类、类成员、方法等,从而使您的 apk 更 slim 。

就“缩小”而言,这是没有必要的,尽管它可能会为您节省几千字节的空间。您可能可以将其关闭,它会没事的。

至于崩溃 - 发生这种情况是因为您的代码的一部分正在尝试访问一个名称可能被混淆并因此丢失的类。
尝试为混淆器设置规则。可以这样做:

  • 找到“proguard-rules.pro”文件,该文件位于“app”文件夹内的“build.gradle”文件旁边(下图)。 enter image description here

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

    -keepclassmembers class fqcn.of.javascript.interface.for.webview { 上市 *;


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

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

祝你好运 =)

关于android - 使用android studio混淆多个模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28342890/

相关文章:

android - OpenGL 和布局

android - Facebook 和 Proguard 错误

java - 如何在谷歌地图上绘制所有路线

java - Facebook SDK 4.0.0,Android 上的 ShareDialog 始终为 null

android - AOSP 源代码树中的这些版本名称是什么意思?

plugins - Gradle:非法重复错误

java - Java 异常消息有约定吗?

gradle - 无法扩展 Gradle 任务

java - 有没有办法为同一个 ImageView 使用多个源?

android - 缩小 WithR8 抛出 java.lang.OutOfMemoryError : Java heap space