使用android studio混淆多个模块

Rob*_*erV 12 obfuscation android proguard gradle android-studio

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

  • 应用:主应用模块.有依赖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')
}
Run Code Online (Sandbox Code Playgroud)

ModuleA:

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

ModuleB:

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
Run Code Online (Sandbox Code Playgroud)

ModuleC:与ModuleB相同.

穿:

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
Run Code Online (Sandbox Code Playgroud)

**我只写了重要的一行

我的问题是,如果我使用该配置生成已签名的APK,当我将其安装在设备上时,它会因此异常而崩溃:

java.lang.NoSuchFieldError:类Lcom/package/ClassInJar中没有name ='peer'cignate ='J'的字段;

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

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

Error:Execution failed for task ':ModuleB:proguardRelease'.
Run Code Online (Sandbox Code Playgroud)

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

小智 3

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

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

因此,就“缩小”而言,这是没有必要的,尽管它可能会在各处节省几千字节。你也许可以把它关掉,一切都会好起来的。

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

  • 找到“app”文件夹中“build.gradle”文件旁边的“proguard-rules.pro”文件(下图)。在此输入图像描述

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

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


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

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

祝你好运=)