Intereting Posts

Как определить местоположение хранилища отладки для отладочной сборки Android ant?

Можно ли указать местоположение собственного созданного хранилища отладки при создании debug .apk ( <project-name>-debug.apk ) с ant debug ? Я вижу только возможность указать местоположение хранилища ключей выпуска.

Я хотел бы поделиться хранилищем отладки на нескольких ПК, не копируя их над тем, который помещен в каталог «.android». Хранилище отладки может, например, находиться в репозитории исходного кода. Но мне нужен способ сказать муравью, где найти отладочное хранилище.

Solutions Collecting From Web of "Как определить местоположение хранилища отладки для отладочной сборки Android ant?"

Вы можете удалить подпись последнего 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> к <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> к <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.

[EDIT] Из документов на странице 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»> «Настройки»> «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" /> к <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.

  • Скопируйте файл «debug.keystore» из его стандартного местоположения (например, «c: /Users/YourAcount/.Android/» в Windows) в этот новый каталог.

  • Настройте Eclipse, чтобы использовать этот новый каталог / файл для всех отладочных APK (Eclipse -> Window -> Preferences -> Android -> Build -> Custom Debug Keystore ".

Один простой способ, который вы можете использовать в качестве рабочего процесса (что особенно приятно в нашей системе CI, где построено много проектов и где требуется мягкое касание при работе с хранилищами ключей), заключается в том, чтобы идти вперед и запускать сборку отладки, использовать AAPT Чтобы удалить содержимое папки META-INF, и запустите jarsigner, чтобы подписать его с вашим пользовательским debug.keystore.

В псевдо-сценарии это выглядит так: # Normal Ant debug build ant debug

 # 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 

Насколько я уже видел, ни одно существующее решение не работает с последней версией ant.

Единственный примитивный способ сделать это – заменить файл debug.keystore по умолчанию в папке по умолчанию.

По умолчанию используется папка .android. Обычно в C: \ Users \ USER_NAME.android. В окнах вы можете добраться до него, используя% USERPROFILE% .android.

То, что я сделал, это создать сценарий powershell для резервного копирования файла по умолчанию, скопировать файл хранилища ключей в место по умолчанию, создать подписанный отладочный apk, удалить файл хранилища ключей, восстановить исходный файл.

Дайте мне знать, если вам нужна дополнительная информация здесь.

Я нашел другое решение.

Добавьте в $ {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> к <?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>