使用android studio混淆多个模块

时间:2015-02-05 11:34:52

标签: android android-studio gradle proguard obfuscation

我遇到了gradle proguard的问题......我有以下模块:

  • App:主应用模块。有依赖ModuleA和ModuleC
  • ModuleA:库模块。拥有依赖ModuleB和jar dependecies。
  • ModuleB:图书馆模块
  • ModuleC:库模块
  • 穿:穿app模块。

build.gradle文件: - App:

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')
}

ModuleA:

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
dependencies {
  compile fileTree(dir: 'libs', include: ['*.jar'])
  compile project(':ModuleB')
}

ModuleB:

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中没有名称='peer'cignate ='J'的字段;

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

如果我在所有模块中将minifyEnabled设置为false,它不会崩溃,但我更喜欢对代码进行模糊处理。如果我在库模块中将minifyEnabled变为true,它就不会编译,它会向我显示这个异常:

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

java.io.IOException:输出jar为空。你有没有指定正确的'-keep'选项?

1 个答案:

答案 0 :(得分:3)

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

  • 当proguard 混淆时,它实际上会占用您的所有类,类成员,方法等,并更改其名称,因此它将变得乱码。这样就可以让某人对代码进行逆向工程变得更加困难。
  • 以某种方式收缩代码,以便在编译时丢弃每个未使用的类,类成员,方法等,以使您的apk变得更苗条。

因此,就“缩小”而言,没有必要,即使它可能会在这里和那里为你节省几千字节。你可以把它关掉,一切都会好的。

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

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

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

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


这意味着“不要混淆任何在给定班级内公开的班级成员。”

但是,保留有许多变化 有关“保留”变体的更多信息,请参阅链接中的示例(当您单击某个项目时)查看本文档:Keep options

祝你好运=)