【问题标题】:Gradle Android Studio signing with a properties fileGradle Android Studio 使用属性文件签名
【发布时间】:2014-10-08 05:30:09
【问题描述】:

我正在尝试使用 gradle 构建文件对我的应用程序进行签名。当我使用普通的signingConfigs时,它可以工作(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 studios 会显示一个对话框,上面写着:

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

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

我的一些系统细节:

Android Studio 0.8.6 视窗 8.1 x64 毕业 1.12

希望任何人都可以帮助我。如果您想了解更多详细信息,请询问我。

【问题讨论】:

    标签: android build gradle android-studio


    【解决方案1】:

    这就是我所做的,它对我有用:

    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 文件是多余的,但它确实对我有用。

    【讨论】:

    • 感谢您的回答。您的解决方案有效,但有人可以解释一下原因吗?
    • 是的。首先,您正在加载 local.properties 文件。然后将其加载到包含您的密钥库(keystore.props.file)的 a 中。这样做可以让您定义一个单独的路径(不在您的项目中)到您的密钥库属性所在的位置,这样您就可以放心地上传到 git 存储库。
    • 我收到了Cannot resolve symbol 'Properties' 这是预期的吗?还有断言:assert localProps['keystore.props.file']; 失败!
    • 没关系,问题是我的local.properties 文件缺少keystore.props.file=../keystore.properties 行。修复该问题并将我的 Android Studio gradle 插件更新到最新版本修复了Properties 的分辨率
    • 我仍然对“属性”的冗余使用感到困惑......!! :(
    【解决方案2】:

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

    keyPassword 道具["KeyPassword"]

    但文件只包含

    密码

    为什么 gradle 不告诉我?

    【讨论】:

      【解决方案3】:

      这是我使用属性文件将我的两个密钥从 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 条件内执行“android {}”块,其中分配了 props 变量,所以只需将整个 android{ ... } 部分移动到分配 props 变量的条件,然后再试一次。

      我根据herehere 找到的信息拼凑了这些步骤。

      【讨论】:

      • 我想你需要改写你的答案,你的步骤不清楚(至少对我来说不是)。可能是从读者的角度来看!
      【解决方案4】:

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

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

      signingConfig signingConfigs.release
      

      【讨论】:

        猜你喜欢
        • 2014-01-22
        • 2017-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-18
        • 1970-01-01
        • 2014-07-15
        • 2015-07-30
        相关资源
        最近更新 更多