简体   繁体   中英

Adding release keys in the experimental Gradle plugin for Android

Hey I am having some issues adding a signing my release build variant. Currently I am using the experimental gradle 2.5 with the new android gradle plugin version 0.1.0.

build.gradle:

apply plugin: 'com.android.model.application'

model {
    android {
        compileSdkVersion = 15
        buildToolsVersion = "22.0.1"

        defaultConfig.with {
            applicationId = "com.testcom.test"
            minSdkVersion.apiLevel = 14
            targetSdkVersion.apiLevel = 14
            versionCode = 1
            versionName = "1.0"
        }

        compileOptions.with {
            sourceCompatibility JavaVersion.VERSION_1_6
            targetCompatibility JavaVersion.VERSION_1_6
        }
    }

    android.ndk {
        ...
    }

    android.signingConfigs {
        signed {
            keyAlias = "meow"
            keyPassword = "**"
            storeFile = file("meow-key.keystore")
            storePassword = "**"
        }
    }

    android.buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles += file('proguard-rules.pro')
            signingConfig  = signingConfigs.signed
        }
        debug {
            isDebuggable = true
            isJniDebuggable = true
        }
    }

    // You can modify the NDK configuration for each variant.
    components.android {
        binaries.afterEach { binary ->
            binary.mergedNdkConfig.cppFlags.add(
                    "-DVARIANT=\"" + binary.name + "\"")
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

My root build.gradle:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle-experimental:0.1.0'
    }
}

allprojects {

    repositories {
        jcenter()
    }
}

The error that I am getting when running ./gradlew assembleRelease is:

> Exception thrown while executing model rule: model.android.buildTypes > named(release)
   > Attempt to read a write only view of model of type 'java.lang.Object' given to rule 'model.android.buildTypes'

Has anyone had a similar issue with the experimental gradle plugin? Help would be greatly appreciated. :)

This workaround works for me and does not require -Dorg.gradle.model.dsl=true

model {
    def signConf

    android.buildTypes {
        release {
            signingConfig = signConf
        }
    }

    android.signingConfigs {
        create("signed") {
            keyAlias = "meow"
            keyPassword = "**"
            storeFile = file("meow-key.keystore")
            storePassword = "**"
            storeType = "jks"

            signConf = it
        }
    }
}

However, it only works if you only have one signingConfig.

You should be able to add the release keys with a script like this:

model {
    android.buildTypes {
        release {
            signingConfig = $("android.signingConfigs.signed")
        }
    }

    android.signingConfigs {
        create("signed") {
            keyAlias = "meow"
            keyPassword = "**"
            storeFile = file("meow-key.keystore")
            storePassword = "**"
            storeType = "jks"
        }
    }
}

Currently it seems to be a bug in the plugin.
You need to specify -Dorg.gradle.model.dsl=true when you run your gradle command.

Also you should have an issue with proguard. In this case you can use new File("path/to/proguard-rules.pro") instead of file('proguard-rules.pro')

The right way to do this with the latest version of the Android plugin ( 0.6.0-alpha3 ) is as follows:

android.signingConfigs {
    create("release") {
        storeFile = file("../keys.keystore")
        storePassword = "st0r3pa$$"
        keyAlias = "SecretKey"
        keyPassword = "k3ypa$$"
    }
}

android.buildTypes {
    release {
        signingConfig = $.android.signingConfigs.get("release")
    }
}

In Gradle 2.9 which is used by this version of the plugin, the declared rules can depend on each other using a special syntax: $.<path-to-element> . The trick is to create the signing config as usual, then assign it to a field in a different rule using this syntax. Gradle will realize that the signing configuration is an input dependency and will let you access it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM