我如何指定Android Antdebugging版本的debugging密钥库的位置?

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

我想通过多个PC共享debugging密钥库,而不是将它们复制到'.android'目录中。 debugging密钥库可以驻留在源代码库中。 但是我需要一种方法来告诉ant在哪里可以finddebugging密钥库。

您可以删除最终apk的签名并重新签名。 这只是一个debugging版本,所以可以避免zipalign(至less我没有在我的构build中的问题)。

将密钥库复制到项目中的文件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> 

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

 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构build工具提供了一个debugging签名模式,使您可以更轻松地开发和debugging您的应用程序,同时仍能满足Android系统对签名.apk的要求。 使用debugging模式构build应用程序时,SDK工具调用Keytool自动创builddebugging密钥库和密钥。 然后使用此debugging密钥来自动签署.apk,因此您不需要使用自己的密钥对软件包进行签名。

SDK工具使用预定义的名称/密码创builddebugging密钥库/密钥:

  • 密钥库名称:“debug.keystore”
  • 密钥库密码:“android”
  • 重要别名:“androiddebugkey”
  • 密钥密码:“android”
  • CN:“CN = Android Debug,O = Android,C = US”

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

据我所知,为了做到这一点,你需要重写“-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" /> 
  • 在Eclipse工作区中创build一个新的空文件夹。

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

  • configurationEclipse使用所有debuggingAPK的新目录/文件(Eclipse – > Window – > Preferences – > Android – > Build – > Custom Debug Keystore)。

一个简单的方法可以用作解决方法(在我们的CI系统中,build立了许多项目并且在处理密钥库时需要轻松的触摸),这是一个很好的方法,就是继续运行debugging版本,使用AAPT删除META-INF文件夹的内容,然后运行jarsigner用自定义的debug.keystore对其进行签名。

在伪脚本中,它看起来像:#正常的Antdebugging生成antdebugging

 # 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 

据我目前看到,没有现有的解决scheme与最新的ant版本。

这样做的唯一原始方法是将其默认文件夹中的默认debug.keystorereplace掉。

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

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

让我知道你是否需要更多的信息在这里。

我find了另一个解决scheme..

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