如何为Android蚂蚁调试版本指定调试密钥库的位置?

时间:2012-01-26 14:44:45

标签: android debugging ant keystore

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

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

7 个答案:

答案 0 :(得分:19)

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

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 Debug,O = Android,C = US”

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

答案 1 :(得分:11)

据我所知,为了做到这一点,你需要覆盖“-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" />

答案 2 :(得分:4)

  • 在Eclipse工作区中创建一个新的空文件夹。

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

  • 配置Eclipse以使用所有调试APK的新目录/文件(Eclipse - &gt; Window - &gt; Preferences - &gt; Android - &gt; Build - &gt; Custom Debug Keystore“)。

答案 3 :(得分:4)

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

在伪脚本中,它看起来像:     #Normal 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

答案 4 :(得分:4)

您可以删除最终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>

答案 5 :(得分:0)

据我所知,到目前为止,没有现有的解决方案适用于最新的ant版本。

这样做的唯一原始方法是将默认的debug.keystore替换为默认文件夹。

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

来访问它

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

如果您需要更多信息,请与我们联系。

答案 6 :(得分:0)

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

在$ {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>