当前位置: 首页 > 知识库问答 >
问题:

AssemblereRelease任务依赖关系-请求密钥库密码

施恩
2023-03-14

为了避免以纯文本形式编写密钥库密码,我正在尝试向android Gradle插件创建的assembleRelise任务添加依赖项。

我检查了Gradle留档操作现有任务,但我无法将依赖项放置在应该放置的位置

这是我的任务,在$root$/myApp/build中定义。android插件之上的渐变。

task readPasswordFromInput << {
    def console = System.console()

    ext.keystorePassword = console.readLine('\n\n\n> Enter keystore password: ')
}

apply plugin: 'android'

然后,我尝试了Gradle提供的两种可能性:任务。dependsOn和task。先做,但都不管用。后者似乎被忽略,而dependsOn确实添加了依赖项,但在依赖链中为时已晚。正在运行./gradlew任务--所有任务都打印此

:assembleRelease - Assembles all Release builds [libs:ActionBarSherlock:bundleRelease, libs:DataDroid:bundleRelease, libs:SlidingMenu:bundleRelease]
    :compileRelease
    ...
    [SEVERAL TASKS]
    ...
    :packageRelease
    ...
    [SEVERAL TASKS]
    ...
    :readPasswordFromInput

问题是,任务包租赁中需要密钥库密码

作为旁注,这是我想要的

buildTypes {
        release {
            def console = System.console()

            ext.keystorePassword = console.readLine('\n\n\n> IF building release apk, enter keystore password: ')

            debuggable false

            signingConfigs.release.storePassword = ext.keystorePassword
            signingConfigs.release.keyPassword = ext.keystorePassword

            signingConfig signingConfigs.release
        }
    }

但是每次你使用gradlew时,不管它是干净的还是组装的,它都会要求输入密码

谢啦!

编辑

感谢@Intate Kim,这是我的身材。gradle 2.0版

task readPasswordFromInput << {
    def console = System.console()

    ext.keystorePassword = console.readLine('\n\n\n> Enter keystore password: ')

    android.signingConfigs.release.storePassword = ext.keystorePassword
    android.signingConfigs.release.keyPassword = ext.keystorePassword
}

tasks.whenTaskAdded { task ->
    if (task.name == 'validateReleaseSigning') {
        task.dependsOn readPasswordFromInput
    }
}

apply plugin: 'android'

然后,构建类型

release {
    debuggable false

    signingConfig signingConfigs.release

    runProguard true
    proguardFile 'my-file.txt'
}

Gradle执行正确,但它只生成release-unsigned.apk

共有3个答案

蒲曦
2023-03-14

我已经创建了解决方案,对我来说很好,你们可以测试一下

android { 
    signingConfigs {
        release {
            storeFile = file('android.keystore')
            keyAlias = "my_key_alias"
        }
    }

    buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }
}

task readPasswordFromInput << {
    if(!project.hasProperty('keyStore') || !project.hasProperty('keyPass') || !project.hasProperty('storePass')) {
        println "\n\$ Enter signing details manually or run with \"-PkeyStore={key.store.name} -PstorePass={StoreSecretPassword} -PkeyPass={KeySecretPassword}\""   
    }

    if(!project.hasProperty('keyStore')) {
        def newKeyStore = System.console().readLine("\n\$ Enter keystore location or enter (default: android.keystore): ")
        if(newKeyStore != '') android.signingConfigs.release.storeFile = file('${newKeyStore}')
    } else {
        android.signingConfigs.release.storeFile = file(project.keyStore)
    }

    android.signingConfigs.release.storePassword = project.hasProperty('storePass') ? project.storePass : new String(System.console().readPassword("\$ Store password: "))
        android.signingConfigs.release.keyPassword = project.hasProperty('keyPass') ? project.keyPass : new String(System.console().readPassword("\$ Key password: "))
}

tasks.whenTaskAdded { task ->
    if (task.name == 'validateReleaseSigning') {
        task.dependsOn readPasswordFromInput
    }
}

然后,您可以在提示符下从CLI传递所有参数(使用readPassword,因此它不可见),或者可以将它们作为CLI参数传递给脚本

gradle assemble
gradle assemble -PkeyStore="~/.android/my.keystore"
gradle assemble -PkeyStore="~/.android/my.keystore" -PstorePass="MyStorePass"
gradle assemble -PkeyStore="~/.android/my.keystore" -PstorePass="MyStorePass" -PkeyPass="MyKeyPass"
韩弘阔
2023-03-14

这是我发布密钥签名的完整解决方案。

  1. 它检测控制台在守护进程模式下是否不可用

如果您使用的是守护进程模式,请使用gradle——无守护进程组装。

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:0.5.+'
    }
}

tasks.whenTaskAdded { task ->
    if (task.name == 'validateReleaseSigning')
        task.dependsOn keystoreInfo
}

apply plugin: 'android'

repositories {
    mavenCentral()
}

android {
    compileSdkVersion 18
    buildToolsVersion '18.0.1'

    defaultConfig {
        minSdkVersion 7
        targetSdkVersion 18
    }

    signingConfigs {
        release {
            release {
                storeFile file('release.keystore')
                storePassword ''
                keyAlias ''
                keyPassword ''
            }
        }

        buildTypes {
            release {
                debuggable false
                signingConfig signingConfigs.release
            }
        }
    }
}

task keystoreInfo << {
    def console = System.console()
    if (console == null)
        throw new IllegalStateException('no console available, use --no-daemon flag')

    def storeFile = console.readLine('Keystore: ')
    def storePassword = console.readPassword('Keystore password: ')
    def keyAlias = console.readLine('Key alias: ')
    def keyPassword = console.readPassword('Key password: ')

    android.signingConfigs.release.storeFile = file(storeFile)
    android.signingConfigs.release.storePassword = new String(storePassword)
    android.signingConfigs.release.keyAlias = keyAlias
    android.signingConfigs.release.keyPassword = new String(keyPassword)
}

主旨http://gist.github.com/grzegorz-zur/6416924

柳豪
2023-03-14

尝试:

tasks.whenTaskAdded { task ->
    if (task.name == 'packageRelease') {
        task.dependsOn readPasswordFromInput
    }
}

使用您的readPasswordFromInput任务。

更新:

通过这种方式,您可以看到以下代码有效。

def runTasks = gradle.startParameter.taskNames
if ('assemble' in runTasks || 'assembleRelease' in runTasks || 'a' in runTasks || 'aR' in runTasks) {
    android.signingConfigs.releaseSign.storeFile = file('/path/to/keystore')
    android.signingConfigs.releaseSign.storePassword = System.console().readLine('KeyStore Password: ')
    android.signingConfigs.releaseSign.keyAlias = ...
    android.signingConfigs.releaseSign.keyPassword = System.console().readLine('Alias Password: ')
    android.buildTypes.release.signingConfig = android.signingConfigs.releaseSign
}

如果您遇到构建失败,可能需要在android上签名一个空的键签名配置。签名配置:

android {
    ...
    signingConfigs {
        releaseSign
    }
    ...
 类似资料:
  • 我用过这个命令 生成密钥库。它工作正常,但从我读到的内容来看,这个命令还应该提示您输入密钥密码(而不是存储密码)?我从来没有收到过这样的提示。我能跑 查看密钥库的内容。钥匙似乎就在那里。。。正确的别名在那里。在哪里获取/设置特定别名的密码? 我有一个key.properties在Android目录 在build.gradle我有: 当我试图生成一个发布版本时,我得到了 我想它可能与keyPassw

  • 将gradle及其spring-boot插件(1.5.1)和第一个spirit插件一起使用会引发一个错误: b)如何从“启动重新打包”中删除“fsm”的依赖项? c)是否可以显示一个分级任务依赖关系图?(不是项目依赖关系)

  • 因此,自从添加新的Room android架构库以来,这种情况已经开始发生。我在AppDatabase_Impl没有过期时遇到问题,我通过在注释中添加kapt来修复它: < li>Android Room持久性库和Kotlin < li >在Kotlin中实现房间持久性库 < in Kotlin中的房间持久性库实现(Gradle错误) 我怀疑其他错误是由于AS、Kotlin和Java 8造成的,所

  • 问题内容: 我目前有一个密钥库,其中只有我应该知道的特定密码。现在,我需要将对该密钥库的访问权授予其他人,因此我想: 1)更改密码,以便我可以与他人共享该密码并让他们签名 2)创建一个不同的密码并允许他们使用它进行签名。 这可能吗?以及-如果是-怎么样? 问题答案: 密钥库只有一个密码。您可以使用keytool进行更改: 要更改密钥的密码:

  • 我们希望利用Azure Key vault将我们的敏感密钥存储在Azure Key vault中,并利用存储的敏感密钥在发送到服务之前加密我们的字符串/纯文本数据。服务将再次与Azure Key vault交互,检索敏感密钥,用于解密客户端发送的加密字符串。任何一个可以提供一些关于如何使用azure密钥库以上的场景。

  • 我计划在key vault上保留密钥,但我不清楚密钥和秘密的版本控制,我有一些关于Azure key vault上的key/Secret的版本控制的问题。 如何创建现有密钥的新版本? 是否可以解密用不同版本的相同密钥加密的数据? 是否可以为某个版本的密钥设置过期日期?