【问题标题】:How can I specify location of debug keystore for Android ant debug builds?如何为 Android ant 调试版本指定调试密钥库的位置?
【发布时间】:2012-01-26 14:44:45
【问题描述】:

是否可以在使用ant debug 创建调试.apk (<project-name>-debug.apk) 时指定自行创建的调试密钥库的位置?我只看到指定发布密钥库位置的可能性。

我想在多台 PC 上共享调试密钥库,而不是将它们复制到放置在“.android”目录中的那个上。例如,调试密钥库可以驻留在源代码存储库中。但我需要一种方法来告诉 ant 在哪里可以找到调试密钥库。

【问题讨论】:

  • 因为我想将这些文件添加到版本控制中

标签: android debugging ant keystore


【解决方案1】:

您应该能够指定与这些属性一起使用的密钥库

key.store=/path/to/key.keystore
key.alias=alias
key.store.password=pass
key.alias.password=pass

只需将属性传递给 Ant。

[编辑] 来自http://developer.android.com/guide/publishing/app-signing.html#setup的文档

Android 构建工具提供了一种调试签名模式,可让您更轻松地开发和调试应用程序,同时仍满足 Android 系统对 .apk 签名的要求。使用调试模式构建应用时,SDK 工具会调用 Keytool 来自动创建调试密钥库和密钥。然后使用此调试密钥对 .apk 进行自动签名,因此您无需使用自己的密钥对包进行签名。

SDK 工具使用预先确定的名称/密码创建调试密钥库/密钥:

  • 密钥库名称:“debug.keystore”
  • 密钥库密码:“android”
  • 密钥别名:“androiddebugkey”
  • 密钥密码:“android”
  • CN: "CN=Android 调试,O=Android,C=US"

如有必要,您可以更改调试密钥库/密钥的位置/名称或提供自定义调试密钥库/密钥以供使用。但是,任何自定义调试密钥库/密钥都必须使用与默认调试密钥相同的密钥库/密钥名称和密码(如上所述)。 (要在 Eclipse/ADT 中执行此操作,请转到 Windows > Preferences > Android > Build。)

【讨论】:

  • 这似乎不适用于调试,但仅适用于发布。您确定这适用于签署调试 apk 吗?
  • 可能只能覆盖默认位置的密钥库。对于平台或发布密钥,可以通过上述属性指定位置。
  • Eclipse 首选项在使用 ant 构建命令行时不使用,这是我的问题。构建调试时省略 key.store。
  • 这对任何使用 ant building 进行签名调试的人都有效吗?
  • 这种方法不适用于“ant debug”,但肯定适用于“ant release”
【解决方案2】:

据我所知,为了做到这一点,您需要覆盖“-do-debug”目标。不过,我想知道是否有更优雅的方式。我将此添加到我的 build.xml 中

<property name="build.is.signing.debug" value="false"/>
<target name="-do-debug" depends="-set-debug-mode, -debug-obfuscation-check, -package, -post-package">
    <!-- only create apk if *not* a library project -->
    <do-only-if-not-library elseText="Library project: do not create apk..." >
        <sequential>
            <property name="out.unaligned.file" location="${out.absolute.dir}/${ant.project.name}-debug-unaligned.apk" />

            <!-- Signs the APK -->
            <echo>Signing final apk...</echo>
            <signjar
                    jar="${out.packaged.file}"
                    signedjar="${out.unaligned.file}"
                    keystore="${key.store}"
                    storepass="${key.store.password}"
                    alias="${key.alias}"
                    keypass="${key.alias.password}"
                    verbose="${verbose}" />

            <!-- Zip aligns the APK -->
            <zipalign-helper
                    in.package="${out.unaligned.file}"
                    out.package="${out.final.file}" />
            <echo>Debug Package: ${out.final.file}</echo>
        </sequential>
    </do-only-if-not-library>
    <record-build-info />
</target>
<import file="${sdk.dir}/tools/ant/build.xml" />

【讨论】:

  • 我不确定出了什么问题,但是当使用这种方法运行 Ant 时,我收到一个警告:“没有提供 -tsa 或 -tsacert 并且这个 jar 没有时间戳。”尝试安装生成的 APK 时,我收到“失败 [INSTALL_PARSE_FAILED_NO_CERTIFICATES]”。但是,通过 Eclipse 导出似乎可以工作。有什么想法吗?
  • 在运行 Ant 后在 APK 上运行 jarsigner 确实会产生 SecurityException,因此它似乎没有正确签名。
  • 看来build.is.signing.debug 属性与此方法冲突,因为apkbuilder 已经使用您主目录中的调试密钥库对其进行了签名。我设法通过覆盖 -setup 目标并将属性设置为 false 来解决此问题。
【解决方案3】:

您可以删除最终 apk 的签名并重新签名。这只是一个调试构建,因此可以避免 zipalign(至少我的构建没有问题)。

将你的密钥库复制到项目中的一个文件 debug.keystore 并在 ant.properties 中添加以下内容

debug.key.store.password=android
debug.key.alias.password=android
debug.key.store=../debug.keystore
debug.key.alias=androiddebugkey

并在您的 build.xml 中添加以下内容

<target name="-post-build" if="${build.is.packaging.debug}">
    <!-- Remove the signature of the debug build, and sign it again with our own debug keystore -->
    <delete dir="tmp" includeemptydirs="true" failonerror="false" />
    <mkdir dir="tmp" />
    <unzip src="${out.final.file}" dest="tmp" />
    <delete dir="tmp/META-INF" includeemptydirs="true" verbose="true" failonerror="true" />
    <delete file="${out.final.file}" failonerror="true" />
    <zip destfile="${out.final.file}" basedir="tmp" />
    <delete dir="tmp" includeemptydirs="true" failonerror="false" /> 

    <echo level="info">Signing final DEBUG apk with a common signature...
        signapk
            input="${out.final.file}"
            output="${out.packaged.file}"
            keystore="${debug.key.store}"
            storepass="${debug.key.store.password}"
            alias="${debug.key.alias}"
            keypass="${debug.key.alias.password}"
    </echo>

    <signapk
        input="${out.final.file}"
        output="${out.packaged.file}"
        keystore="${debug.key.store}"
        storepass="${debug.key.store.password}"
        alias="${debug.key.alias}"
        keypass="${debug.key.alias.password}"/>

    <delete file="${out.final.file}" failonerror="true" />
    <move file="${out.packaged.file}" tofile="${out.final.file}" failonerror="true" />

</target>

【讨论】:

    【解决方案4】:
    • 在 Eclipse 工作区中创建一个新的空文件夹。

    • 将文件“debug.keystore”从其标准位置(例如 Windows 上的“c:/Users/YourAcount/.Android/”)复制到该新目录中。

    • 配置 Eclipse 以将新目录/文件用于所有调试 APK(Eclipse --> Window --> Preferences --> Android --> Build --> Custom Debug Keystore"。

    【讨论】:

    • 标题明确指出“为 Android commandline/ant build 指定调试密钥库的位置”
    • 但是“错误”的答案可能对另一个答案是正确的。它可以更清楚地说明这个问题。
    【解决方案5】:

    您可以使用一种简单的方法作为解决方法(这在我们构建了许多项目并且在处理密钥库时需要软接触的 CI 系统中特别好)是继续运行调试构建,使用 AAPT 删除 META-INF 文件夹的内容,然后运行 ​​jarsigner 以使用您的自定义 debug.keystore 对其进行签名。

    在伪脚本中,它看起来像: # 正常 Ant 调试构建 蚂蚁调试

    # Remove default debug signing
    aapt remove YourDebugApp.apk META-INF/MANIFEST.MF
    aapt remove YourDebugApp.apk META-INF/CERT.SF
    aapt remove YourDebugApp.apk META-INF/CERT.RSA
    
    # Use Jarsigner and the custom debug.keystore. 
    # NOTE: This assumes you explicitly called out MD5withRSA as your signing algorithm 
    # when you generated the key; drop the -sigalg tag if you did not.
    jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore my-release-key.keystore -storepass android YourDebugApp.apk
    
    # Verify signing
    jarsigner -verify YourDebugApp.apk
    

    【讨论】:

      【解决方案6】:

      据我目前所见,没有任何现有解决方案适用于最新的 ant 版本。

      唯一的原始方法是替换默认文件夹中的默认 debug.keystore。

      默认位置是 .android 文件夹。通常在 C:\Users\USER_NAME.android 在 Windows 上,您可以使用 %USERPROFILE%.android 访问它。

      我所做的是创建一个 powershell 脚本来备份默认文件,将密钥库文件复制到默认位置,构建签名的调试 apk,删除我的密钥库文件,恢复原始文件。

      如果您需要更多信息,请在此处告诉我。

      【讨论】:

        【解决方案7】:

        我找到了另一个解决方案..

        在 ${PROJECT_HOME}/custom_rules.xml 中添加以下内容

        <?xml version="1.0" encoding="UTF-8"?>
        <project name="custom_rules">
            <!-- @Override -->
            <target name="-set-debug-mode" depends="-setup">
                <!-- record the current build target -->
                <property name="build.target" value="debug" />
        
                <if>
                    <condition>
                        <and>
                            <istrue value="${project.is.testapp}" />
                            <istrue value="${emma.enabled}" />
                        </and>
                    </condition>
                    <then>
                        <property name="build.is.instrumented" value="true" />
                    </then>
                    <else>
                        <property name="build.is.instrumented" value="false" />
                    </else>
                </if>
        
                <!-- whether the build is a debug build. always set. -->
                <property name="build.is.packaging.debug" value="true" />
        
                <!-- signing mode: debug -->
                <property name="build.is.signing.debug" value="false" />
        
                <!-- Renderscript optimization level: none -->
                <property name="renderscript.opt.level" value="${renderscript.debug.opt.level}" />
        
            </target>
        
            <!-- @Override -->
            <!-- Builds debug output package -->
            <target name="-do-debug" depends="-set-debug-mode, -debug-obfuscation-check, -package, -post-package">
                <property name="out.unsigned.file" location="${out.absolute.dir}/${ant.project.name}-debug-unsigned.apk"/>
                <move file="${out.packaged.file}" tofile="${out.unsigned.file}"/>
                <property name="out.unaligned.file" location="${out.absolute.dir}/${ant.project.name}-debug-unaligned.apk" />
        
                <!-- Signs the APK -->
                <echo level="info">Signing final apk...</echo>
                <signapk
                    input="${out.unsigned.file}"
                    output="${out.unaligned.file}"
                    keystore="${out.absolute.dir}/../debug.keystore" <!-- your debug.keystore path -->
                    storepass="android"
                    alias="androiddebugkey"
                    keypass="android"/>
        
                <!-- only create apk if *not* a library project -->
                <do-only-if-not-library elseText="Library project: do not create apk..." >
                    <sequential>
                        <zipalign-helper in.package="${out.unaligned.file}" out.package="${out.final.file}" />
                        <echo level="info">Debug Package: ${out.final.file}</echo>
                    </sequential>
                </do-only-if-not-library>
                <record-build-info />
            </target>
        
        </project>
        

        【讨论】:

          猜你喜欢
          • 2014-01-30
          • 2012-08-14
          • 1970-01-01
          • 2013-05-13
          • 2016-08-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多