在使用.apk
创建调试<project-name>-debug.apk
(ant debug
)时,是否可以指定自创建的调试密钥库的位置?我只看到指定发布密钥库的位置的可能性。
我想在多台PC上共享调试密钥库,而不是将它们复制到放在“.android”目录中的密钥库。调试密钥库可以例如驻留在源代码库中。但是我需要一种方法告诉ant在哪里找到调试密钥库。
答案 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工具使用预定的名称/密码创建调试密钥库/密钥:
如有必要,您可以更改调试密钥库/密钥的位置/名称,或提供自定义调试密钥库/密钥以使用。但是,任何自定义调试密钥库/密钥必须使用与默认调试密钥相同的密钥库/密钥名称和密码(如上所述)。 (要在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>