Android Studio:创建自定义构建类型时是否需要创建签名配置?

时间:2015-12-05 21:45:28

标签: android gradle build signing android-build-type

我有创建自定义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构建变体运行应用程序时,它会要求我为每个自定义构建类型创建一个签名配置。

This is the error message i see

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

  

失败[INSTALL_PARSE_FAILED_NO_CERTIFICATES]

     

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

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

尝试设置

debuggable true

(这是默认调试buildType和我的自定义调试buildType的属性的唯一区别)希望它像默认调试buildType一样工作,但没有。还需要更改其他内容以使自定义buildType像默认值一样工作,即不需要签名配置。

2 个答案:

答案 0 :(得分:2)

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

debugfree.initWith(buildTypes.debug)

其中debugfree是您要定义的构建类型,debug是您要从中复制的构建类型。

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

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

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

答案 1 :(得分:1)

根据@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
    }
}