如何为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-->构建-->自定义调试密钥库)
如果您需要更多信息,请告诉我。一种简单的方法可以作为解决方法使用(这在我们的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没有时间戳。”