Gradle Android Studio使用属性文件签名

Gradle Android Studio使用属性文件签名,android,build,gradle,android-studio,Android,Build,Gradle,Android Studio,我正在尝试用gradle构建文件对我的应用程序进行签名。当我使用普通的signingConfigs时,它可以工作(signingConfigs.release)!但是如果我试图从属性文件中读取属性,它将无法工作。(signingConfigs.config) 属性文件: storeFile=xyz.jks storePassword=xyz keyAlias=xyz keyPassword=xyz 当我运行该项目时,android Studio会显示一个对话框,上面写着: xyz.apk未签名

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

属性文件:

storeFile=xyz.jks
storePassword=xyz
keyAlias=xyz
keyPassword=xyz
当我运行该项目时,android Studio会显示一个对话框,上面写着:

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

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

我的一些系统详细信息:

Android Studio 0.8.6 Windows 8.1 x64 格拉德尔1.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文件是多余的,但它确实对我有用。

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

keyPassword道具[“keyPassword”]

但该文件仅包含

钥匙密码


格雷德尔为什么不告诉我

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

1)创建一个gradle.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 {
    ...
}
此文件的位置取决于您的操作系统:

   /home/<username>/.gradle/ (Linux)
   /Users/<username>/.gradle/ (Mac)
   C:\Users\<username>\.gradle (Windows)
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 {
    ...
}
享受吧
现在,您的所有密钥都将位于目录的根目录之外,但您仍然可以享受每个构建的自动化乐趣

如果您在gradle.build文件中得到一个关于“props”变量的错误,那是因为您没有在分配
props
变量的第一个
If
条件中执行“android{}”块,所以只需移动整个android{…}请输入分配props变量的条件,然后重试


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

处理变量的替代方法是包含/应用一个包含签名配置的渐变文件

所以在你的身材里,格雷德尔

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*'
        }
    }
}
是的,额外的安卓包装必须在那里。优点是上面的文件是一个普通的gradle文件,因此您可以在其中实现所有您想要的魔法

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

signingConfig signingConfigs.release

谢谢你的回答。你的解决办法行得通,但有人能解释一下为什么吗?是的。首先,加载local.properties文件。然后加载包含密钥库(keystore.props.file)的a。这样做可以让您定义一个单独的路径(不在您的项目中)到您的密钥库属性所在的位置,这样您就可以毫无顾虑地上传到git repo。我得到一个
无法解析符号“properties”
这是预期的吗?还有断言:
assertlocalprops['keystore.props.file']失败!没关系,问题是我的
local.properties
文件缺少
keystore.props.file=../keystore.properties
行。修复了这个问题,并将我的Android Studio gradle插件更新到最新版本,修复了
属性的分辨率
我仍然对“属性”的冗余使用感到困惑…!!:(我想你需要重新措辞你的答案,你的步骤不清楚(至少对我来说不是)。可能是从读者的角度来看的!
signingConfig signingConfigs.release