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