【问题标题】:Android Gradle Plugin: runProguard in productFlavors?Android Gradle 插件:productFlavors 中的 runProguard?
【发布时间】:2014-08-27 11:04:09
【问题描述】:

我有一个 Android 库项目和一个使用该库项目的应用。在应用程序的 build.gradle 文件中,我让 ProGuard 混淆了整个应用程序,包括库项目代码:

//from the app project
buildTypes{
    release {
        runProguard true
        proguardFile 'proguard-project.txt'
    }
    debug{
        runProguard false
    }
}

一切正常,lib 项目和 app 项目都被混淆了。 但是,我想构建我的 lib 项目“standalone”,所以我可以在没有 app 项目的情况下分发它。这当然意味着自行混淆 lib 项目。

我不能通过在 lib-projects build.gradle 中使用 buildTypes 代码并简单地运行 proGuard 来做到这一点,因为这会破坏 app-project 构建,因为构建应用程序会再次编译它的代码已经混淆lib-项目代码... :-)

如果我在“独立”模式下构建 lib 项目,我需要运行 ProGuard,例如通过传递参数或执行特殊任务。

谁能指出我正确的方向?

【问题讨论】:

  • 你的库是你项目中的一个模块吗?您可以使用自己的 proguard 配置文件为您的库模块创建一个 build.gradle。您的库公共方法的名称不能被混淆。
  • “这当然意味着自己混淆 lib 项目”——你为什么这么说?绝大多数作为 AAR 分发的 Android 库项目都没有经过混淆处理。
  • @CommonsWare:当然我只能为自己说话,而且我(或:我的雇主)宁愿通过反编译使我们的代码不可读。
  • @MartinCR:module 到底是什么意思?这是一个经典的 Android 库项目,可以独立于应用项目存在,如果这是您的问题。
  • @paul-latzelsperger 使用 Android Studio 每个模块(应用程序中的每个项目)都有自己的 build.gradle 文件,您可以在其中定义它是否会被混淆。我认为您应该为您的库创建一个特定的 proguard 文件,并混淆除公共方法名称之外的所有内容。

标签: android gradle proguard


【解决方案1】:

自己解决了。在 lib-project 的构建文件中,我有两种构建类型,我将它们都发布:

publishNonDefault true

以及构建类型:

buildTypes {
    debug {
        debuggable true
        runProguard false
    }

    release {
        runProguard true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'

    }

}

这会导致创建 debugrelease APK。然后,在我的应用项目的构建文件中,我通过如下方式向debug configuration 添加显式依赖项:

dependencies{
    compile project(path: ':FancyLibProject', configuration: 'debug')
    //...
}

当然,在 app-project 中,我也有两种构建类型 debug 和 release,它们反过来调用 ProGuard 的方式与 lib-project 相同。
注意:我省略了发布版本的签名配置 - 没有这些,APK 将无法安装!

【讨论】:

    猜你喜欢
    • 2013-10-06
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    相关资源
    最近更新 更多