使用属性文件Gradle Android Studio签名

时间:2014-08-14 14:07:51

标签: android build gradle android-studio

我正在尝试使用gradle构建文件对我的应用进行签名。当我使用普通的signedConfigs时,它可以工作(signingConfigs.release)!但如果我试图从属性文件中读取属性,它将无法工作。 (signingConfigs.config)

Properties props = new Properties();
props.load(new FileInputStream(file(rootProject.file("signing.properties"))))

android {
        signingConfigs {
            config {
                storeFile file(props["storeFile"])
                storePassword props["storePassword"]
                keyAlias props["keyAlias"]
                keyPassword props["KeyPassword"]
            }
            release {
                storeFile file("..\\xyz.jks")
                storePassword "****"
                keyAlias "****"
                keyPassword "****"
            }
        } 
    .
    .
    .
        buildTypes {
            release {
                runProguard false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
                signingConfig signingConfigs.release
            }
            debug {
                applicationIdSuffix '.debug'
                versionNameSuffix '-SNAPSHOT'
            }
        }

属性文件:

storeFile=xyz.jks
storePassword=xyz
keyAlias=xyz
keyPassword=xyz

当我运行该项目时,android工作室会显示一个对话框,其中显示:

  

xyz.apk未签名。请配置签名信息   使用“项目结构”对话框选择的风味。

正确读取属性文件,因为我可以从文件中记录一些属性抛出控制台。

我的一些系统细节:

Android Studio 0.8.6 Windows 8.1 x64 gradle 1.12

希望有人能帮助我。如果你想了解更多细节,请问我。

4 个答案:

答案 0 :(得分:12)

这就是我的工作,它对我有用:

signingConfigs {
    release {
        def Properties localProps = new Properties()
        localProps.load(new FileInputStream(file('../local.properties')))
        def Properties keyProps = new Properties()
        assert localProps['keystore.props.file'];
        keyProps.load(new FileInputStream(file(localProps['keystore.props.file'])))
        storeFile file(keyProps["store"])
        keyAlias keyProps["alias"]
        storePassword keyProps["storePass"]
        keyPassword keyProps["pass"]
    }
}

我的local.properties文件包含" keystore.properties"的路径。文件。这包含我关于密钥库的信息:

store=***
alias=***
pass=***
storePass=***

也许加载两个Propreties文件是多余的,但它对我有用。

答案 1 :(得分:2)

以下是我使用属性文件将我的两个密钥从gradle.build文件中移出到一个不会包含在任何构建或存储库提交中的文件的完整步骤。

1) 创建一个gradle.properties(如果您还没有)。

此文件的位置取决于您的操作系统:

   /home/<username>/.gradle/ (Linux)
   /Users/<username>/.gradle/ (Mac)
   C:\Users\<username>\.gradle (Windows)

2)添加指向yourprojectname.properties文件的条目。  (Windows的例子)

yourprojectname.properties=c:\\Users\\<username>\\signing\\yourprojectname.properties

3)使用以下信息在您在步骤2中指定的位置创建yourprojectname.properties文件:

keystore=C:\\path\\to\\keystore\\yourapps.keystore
keystore.password=your_secret_password

4)修改您的gradle.build文件以指向yourprojectname.properties文件以使用变量。

if(project.hasProperty("yourprojectname.properties")
        && new File(project.property("yourprojectname.properties")).exists()) {

    Properties props = new Properties()
    props.load(new FileInputStream(file(project.property("yourprojectname.properties"))))

    android {
        signingConfigs {
            release {
                keyAlias 'release'
                keyPassword props['keystore.password']
                storeFile file(props['keystore'])
                storePassword props['keystore.password']
            }
            debug {
                keyAlias 'debug'
                keyPassword props['keystore.password']
                storeFile file(props['keystore'])
                storePassword props['keystore.password']
            }
        }
        compileSdkVersion 19
        buildToolsVersion "20.0.0"
        defaultConfig {
            applicationId "your.project.app"
            minSdkVersion 16
            targetSdkVersion 17
        }
        buildTypes {
            release {
            }
        }
    }

}

dependencies {
    ...
}

5)享受!现在您的所有密钥都将位于目录的根目录之外,但您仍然可以为每个构建获得自动化的乐趣。

如果你的gradle.build文件中有关于“props”变量的错误,那是因为你没有在if props条件的{{1}}条件内执行“android {}”块变量被赋值,所以只需将整个android {...}部分移动到分配props变量的条件,然后再试一次。

我根据找到的信息herehere将这些步骤拼凑在一起。

答案 2 :(得分:0)

我发现了错误! 问题是区分大小写的!我写了

  

keyPassword道具[“KeyPassword”]

但该文件仅包含

  

keyPassword

为什么gradle不告诉我?

答案 3 :(得分:0)

变量变量的替代方法是包含/应用包含签名配置的gradle文件。

所以在你的build.gradle中

android {
// the part to include
    if (project.hasProperty("yourproject.signing") && new File(project.property("yourproject.signing")).exists()) {
        println 'apply yourproject signing property';
        apply from: project.property("yourproject.signing");
    } else {
        println 'no yourproject signing property';
    }
// the rest of the usual stuff
    compileSdkVersion etc.

在.gradle目录中(取决于您的操作系统所在位置)添加gradle.properties文件,如果存在,请添加以下行

yourproject.signing=*the full path to your magic file*signing.gradle

在上面条目指向的文件中,您可以像在build.gradle文件中一样包含签名配置

android {
    signingConfigs {
        release {
            keyAlias '*your release key alias*'
            keyPassword '*your key password*'
            storeFile file('*the full path to your keystore file*.jks')
            storePassword '*your keystore password*'
        }
    }
}

是的,额外的android包装必须在那里。优点是上面是一个普通的gradle文件,所以你可以在那里做你想要的所有魔法。

根据需要添加更多的signedConfigs,使用通常的方法,例如

signingConfig signingConfigs.release