【问题标题】:Obfuscating multiple modules with android studio使用 android studio 混淆多个模块
【发布时间】: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


【解决方案1】:

首先,重要的是要了解 proguard 扮演两个主要角色:

  • 当 proguard obfuscate 时,它实际上会占用您所有的类、类成员、方法等并更改它们的名称,因此它会变得乱码。这样一来,别人就很难对您的代码进行逆向工程。
  • 收缩代码,以便在编译时丢弃所有未使用的类、类成员、方法等,以使您的 apk 更精简。

因此,就“缩小”而言,它不是必需的,即使它可能会在这里和那里为您节省几千字节。你也许可以把它关掉,它会没事的。

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

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

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

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


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

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

祝你好运=)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    相关资源
    最近更新 更多