2

我已经按如下方式创建了自定义 buildTypes ,并且没有使用默认的调试和发布 buildTypes

buildTypes {
        releasefree {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        releasepro {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            applicationIdSuffix ".pro"
        }
        debugfree {
            shrinkResources true
            applicationIdSuffix ".debug"
            debuggable true
        }
        debugpro {
            shrinkResources true
            applicationIdSuffix ".pro.debug"
            debuggable true
        }
    }

这样做的原因:我有几个 productFlavors 并且需要为每个都有一个 PRO 版本,我觉得这比为每个免费的创建单独的 PRO 风味更容易。我的代码使用 BuildConfig 类中的 APPLICATION_ID 处理差异。另一个原因是我有定制的课程,如果我有两种不同的风格,则需要复制两次。我知道我可以配置源集,但是当我有太多口味时我遇到了问题。非常难以追踪。

现在的问题:当我尝试使用自定义 buildType 构建变体运行应用程序时,它要求我为每个自定义构建类型创建一个签名配置。

这是我看到的错误消息

同样,我在执行时在运行控制台中看到一条消息:

失败 [INSTALL_PARSE_FAILED_NO_CERTIFICATES]

由于 APK 未签名或签名不正确,安装失败。如果这是基于 Gradle 的项目,请确保在 Gradle 构建脚本中指定了签名配置。

我了解这可能是必需的。但是,我试图找出的是:是否有我可以更改的设置,以便我创建的 debugfree 和 debugpro buildTypes 可以绕过签名配置要求,就像默认调试 buildType 一样?我知道创建签名配置是一分钟的事情,如果我没有很快得到一些东西,我会这样做。但出于好奇,我想了解需要做什么才能使自定义 buildType 像默认调试 buildType 一样工作,并且不需要签名配置。

尝试设置

debuggable true

(这是默认调试 buildType 和我的自定义调试 buildType 属性的唯一区别)希望它可以像默认调试 buildType 一样工作,但没有。为了让自定义 buildType 像默认的一样工作,还需要更改什么,即不需要签名配置。

4

2 回答 2

4

构建类型没有严格的继承。但是,您可以使用相当于复制构造函数的内容:

debugfree.initWith(buildTypes.debug)

wheredebugfree是您要定义debug的构建类型,并且是您要从中复制的构建类型。

在新构建类型的其余初始化之前执行此操作(否则,initFrom()可能会清除该初始化的部分内容)。

特别是,由于debug已经设置了签名配置,因此通过从debug使用相同的调试签名配置进行初始化来启动新的构建类型。

但是,在使用构建类型作为起点时要非常小心。debug您不希望意外地尝试使用该调试签名配置发布应用程序。

于 2015-12-05T22:04:04.630 回答
2

基于@CommonsWare 对我上面的问题的评论,我改变了 buildTypes 如下,它就像一个魅力。在添加自定义配置之前,需要使用默认 buildType 初始化自定义 buildType。它是为了调试以及发布自定义类型而做到的。

再次在这里发布它,以防像我这样好奇的灵魂可以从中受益。

buildTypes {
    releasefree.initWith(buildTypes.release)
    releasefree {
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    releasepro.initWith(buildTypes.release)
    releasepro {
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        applicationIdSuffix ".pro"
    }
    debugfree.initWith(buildTypes.debug)
    debugfree {
        shrinkResources true
        applicationIdSuffix ".debug"
        debuggable true
    }
    debugpro.initWith(buildTypes.debug)
    debugpro {
        shrinkResources true
        applicationIdSuffix ".pro.debug"
        debuggable true
    }
}
于 2015-12-05T22:03:13.773 回答