【问题标题】:Run Proguard on multi-module project as "one piece"在多模块项目上运行 Proguard 作为“一件”
【发布时间】:2017-06-04 12:26:38
【问题描述】:

TLDR:如何将 proguard 映射传递给 javac 以针对混淆库进行编译?

这很长,但我不知道如何使它更短:

背景: 我有以下产品设置:

Android Studio 项目 - 图书馆模块 - (子)模块核心 - (子)模块 A - (子)模块 B - (子)模块 C - 示例应用模块 - ... 其他模块

每个库子模块 A、B、C 引用 Core 中的类,但 A、B、C 相互独立。概念上类似于 Play 服务,用户只能拥有代码和所需的子模块。 每个库子模块都有外部 API,但也有许多内部类 目标是能够将 Core、A、B、C 作为独立的 aar-s 分发。

目标: 将所有子模块混淆在一起,只暴露公共 API,但以混淆/优化的形式分别打包和分发。

问题: 我看不到如何通过简单的 gradle 配置来使用它。这里需要自定义构建系统,除非有任何已知的解决方案?

这里需要的是:

  • Java-将所有子模块一起编译
  • Proguard 将它们混淆在一起
  • 单独运行所有其余的构建过程

每个模块的正常构建过程是: - 编译 -> 做所有事情,包括。混淆 -> 包

Core 之后的第一个子模块编译时直接设置失败。如果只能将 Proguard mapping.txt 作为输入传递给 Java 编译器……但我找不到这样的选项。有什么想法吗?

谢谢!!!

【问题讨论】:

    标签: java android proguard android-proguard


    【解决方案1】:

    问题:我看不到如何将它与简单的 gradle 一起使用 配置。这里需要自定义构建系统,除非有 任何已知的解决方案?

    因此,您正在寻找“自定义构建系统”,因为您不知道如何在 gradle 中进行操作。但是如果这可以在 gradle 中解决,你会想用它,对吧?

    要使用 gradle 保护库,您有 2 个选项:

    • 为每个库独立运行 Proguard:在每个模块中,设置 minifyEnabled true,并使用 proguardFiles 函数设置您的 proguard.txt 文件。
    • 在您的应用模块中运行 Proguard:在每个模块中,设置 minifyEnabled false,并使用 consumerProguardFiles 函数将 proguard.txt 文件从每个库传递到主模块。

    这里用代码示例详细解释,所以我不打算复制答案:https://stackoverflow.com/a/42758629/1516973

    【讨论】:

      【解决方案2】:

      我也遇到了同样的问题,我写了this post on my personal website

      本质上,您正在寻找的是maven-publish Gradle 插件,它允许您将库模块打包到 AAR 并方便地管理和分发它们,同时保留有关它们的依赖关系的信息。

      您可以配置此插件以打包特定的buildType,您将为其启用 proguard 混淆。

      【讨论】:

      • 不会在编译时对每个模块应用混淆,从而使所有类都对子模块进行混淆?
      • 如果你想让你的模块被混淆,你必须给每个模块添加一个 proguard 指令来保持所有的公共类: -keep public class * { public protected *; }
      猜你喜欢
      • 2015-02-24
      • 1970-01-01
      • 2021-02-01
      • 2014-11-15
      • 2016-06-29
      • 2021-12-29
      • 1970-01-01
      • 2015-05-22
      • 2014-09-19
      相关资源
      最近更新 更多