Android Studio不能为调试版本签名

28

Android Studio拒绝为我的调试版本构建签名代码。

我有一个旧的项目,在build.gradle文件中没有任何签名指导,所以我根据这个Android gradle signingConfig error和其他文章添加了这些指导。

我的模块级(唯一的模块)build.gradle文件如下(节选):

android {
    compileSdkVersion 21
    buildToolsVersion '21.1.2'
    defaultConfig {
        applicationId "cc.appname.android"
        minSdkVersion 11
        targetSdkVersion 21
        versionCode 1
        versionName '1.0'
    }
    signingConfigs {
        debug {
            storeFile file('../../../.android/debug.keystore')
            keyAlias 'androiddebugkey'
            keyPassword 'android'
            storePassword 'android'
        }
    }
    buildTypes {
        debug {
            signingConfig signingConfigs.debug
        }
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
    productFlavors {
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
}

因为当我更改路径时,会出现编译错误,所以可以找到storeFile。当路径正确时,它会编译,但是当我尝试在我的应用程序中使用Facebook SDK时,它报告了一个错误的keyhash。

我注意到了signingConfigs

signingConfig signingConfigs.debug

出现下划线错误信息“无法推断参数类型……”

于是我进入UI中的项目设置,取消了签名和构建之间的关系,并保存,然后重新添加。但问题依旧。

我确定这只是我忽略的一个非常小的问题,或者是谷歌在版本之间重命名了该命令。

有谁能提供帮助吗?

3个回答

44

假设您的debug.keystore是来自~/.android文件夹中的那个,请注意以下几点:

更改为:

    debug {
        storeFile file('../../../.android/debug.keystore')
        keyAlias 'androiddebugkey'
        keyPassword 'android'
        storePassword 'android'
    }

debug.keystore存储在根项目中,方法如下:

    debug {
        storeFile rootProject.file('debug.keystore')
        keyAlias 'androiddebugkey'
        keyPassword 'android'
        storePassword 'android'
    }

您不需要重写 debug BuildType,因为它会自动使用debug密钥进行签名,所以您可以删除以下内容:

    debug {
        signingConfig signingConfigs.debug
    }

最终的 build.gradle 文件:

android {
    compileSdkVersion 21
    buildToolsVersion '21.1.2'
    defaultConfig {
        applicationId "cc.appname.android"
        minSdkVersion 11
        targetSdkVersion 21
        versionCode 1
        versionName '1.0'
    }
    signingConfigs {
        debug {
            storeFile rootProject.file('debug.keystore')
            keyAlias 'androiddebugkey'
            keyPassword 'android'
            storePassword 'android'
        }
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
    productFlavors {
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
}

1
谢谢Jared,现在已经签名了。有趣的是,当我进入UI时,它会自动添加错误的signingConfig signingConfigs.debug。我相信这可能是一个bug或缺少某些依赖项。至少现在它可以工作了。 - Oliver Hausler
关于 rootProject.file('debug.keystore') - 感谢提示,但是相对路径仍然是从项目根目录开始的。由于调试密钥库在路径上更高,我仍然需要返回到 rootProject.file('../../.android/debug.keystore')。因此,要么调试密钥库位置不正确(不在项目根目录内),要么这是构建系统的惯例,但是它不应该需要在 build.gradle 中引用。 - Oliver Hausler
我还必须使用 storeFile file('../../../.android/debug.keystore')。 - Clive Jefferies
@CliveJefferies 这是因为您将其放置在多个目录上方。 - Jared Burrows
@JaredBurrows 我没有把密钥放在任何地方 ;) - Clive Jefferies
这个答案对我有用,除了我还必须替换以下行: <code>storeFile rootProject.file('debug.keystore')</code> 使用以下行: <code>storeFile rootProject.file('../../.android/debug.keystore')</code> 或者更好的是使用@donturner的答案中所示的以下行: <ocde>storeFile = new File("${System.properties['user.home']}/.android/debug.keystore")</code> - jonathanzh

2

默认情况下,buildTypes.debugsigningConfigs.debug 都存在。
如果您不想更改它们,就不需要定义buildTypes.debugsigningConfigs.debug
如果您想要在不同的构建类型中使用默认的调试签名,则可以这样做。例如,以下内容也可以正常工作而无需定义其他任何内容:

buildTypes {
 unsignedRelease {
  initWith release
  signingConfig signingConfigs.debug
 }
}

-1

针对新的gradle实验性插件添加答案,因为语法不同:

model {
    android {
        buildTypes {
            release {
                signingConfig = $("android.signingConfigs.myConfig")
                ...
            }
        }
    }
    android.signingConfigs {
        create("myConfig") {
            keyAlias = 'androiddebugkey'
            keyPassword = 'android'
            storeFile = new File("${System.properties['user.home']}/.android/debug.keystore")
            storePassword = 'android'
            storeType = "jks"
        }
    }
 }

注意: android.signingConfigs 块必须放在 android 块之外。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接