使用属性文件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未签名。 请使用“项目结构”对话框配置所选flavor的签名信息。

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

我的一些系统细节:

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

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

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

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

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

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

 yourprojectname.properties=c:\\Users\\\\signing\\yourprojectname.properties 

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

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

4)修改gradle.build文件以指向yourprojectname.properties文件以使用variables。

 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”variables的错误,那是因为你没有在第一个if条件中执行“android {}”块,因为只有移动了整个android {。 ..}段进入分配了propsvariables的条件然后再试一次。

我从这里和这里find的信息中拼凑了这些步骤。

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

keyPassword道具[“KeyPassword”]

但该文件仅包含

keyPassword

为什么gradle不告诉我?

玩杂耍variables的替代方法是包含/应用包含签名配置的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文件,所以你可以在那里做你想要的所有魔法。

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

 signingConfig signingConfigs.release