Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为Android ant调试构建指定调试密钥库的位置?_Android_Debugging_Ant_Keystore - Fatal编程技术网

如何为Android ant调试构建指定调试密钥库的位置?

如何为Android ant调试构建指定调试密钥库的位置?,android,debugging,ant,keystore,Android,Debugging,Ant,Keystore,使用ant debug创建debug.apk(-debug.apk)时,是否可以指定自行创建的调试密钥库的位置?我只看到可以指定发布密钥库的位置 我希望在多台PC上共享调试密钥库,而无需在“.android”目录下的PC上复制它们。例如,调试密钥库可以驻留在源代码存储库中。但是我需要一种方法告诉ant在哪里可以找到调试密钥库。您应该能够指定用于这些属性的密钥库 key.store=/path/to/key.keystore key.alias=alias key.store.password=p

使用
ant debug
创建debug
.apk
-debug.apk
)时,是否可以指定自行创建的调试密钥库的位置?我只看到可以指定发布密钥库的位置


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

您应该能够指定用于这些属性的密钥库

key.store=/path/to/key.keystore
key.alias=alias
key.store.password=pass
key.alias.password=pass
只需将属性传递给Ant

[编辑] 从

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

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

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

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

据我所知,要执行此操作,您需要覆盖“-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" />
<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>

签署最终apk。。。
调试包:${out.final.file}
  • 在Eclipse工作区中创建一个新的空文件夹

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

  • 将Eclipse配置为将该新目录/文件用于所有调试APK(Eclipse-->窗口-->首选项-->Android-->构建-->自定义调试密钥库)


据我所知,到目前为止,没有任何现有的解决方案可以与最新的ant版本一起使用

唯一的基本方法是替换默认文件夹中的默认debug.keystore

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

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


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

一种简单的方法可以作为解决方法使用(这在我们的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

您可以删除最终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中添加以下内容

<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" />
<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>

正在使用公共签名签署最终调试apk。。。
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}”

我找到了另一个解决方案

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

签署最终apk。。。
调试包:${out.final.file}

因为我想将这些文件添加到版本控制中,所以这似乎不适用于调试,而只适用于发行版。您确定这适用于签署调试apk吗?可能只能覆盖默认位置的密钥库。对于平台或发行版密钥,可以通过上述属性指定位置。Eclips使用ant在命令行上构建时不使用e首选项,这是我的问题。为调试而构建时忽略key.store。这对任何使用ant构建进行签名调试的人都有效吗?这种方法不适用于“ant debug”,但它确实适用于“ant release”,标题明确指出为Android命令行/ant构建指定调试密钥库的位置”,但“错误”的答案可能对另一个答案是正确的。这可能会进一步说明这个问题。我不确定出哪里出了问题,但当使用此方法运行ant时,我会收到一条警告:“没有提供-tsa或-tsacert,并且此jar没有时间戳。”