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

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

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

Ответ 1

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

Ответ 2

Вы должны иметь возможность указать хранилище ключей для использования с этими свойствами

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"
  • Пароль ключа: "андроид"
  • Ключевой псевдоним: "androiddebugkey"
  • Пароль ключа: "android"
  • CN: "CN = Android Debug, O = Android, C = US"

При необходимости вы можете изменить местоположение/имя отладочного хранилища ключей/ключа или предоставить настраиваемое хранилище/ключ отладки для использования. Тем не менее, любое настраиваемое кэширование/ключ отладки должно использовать те же ключевые имена ключей и паролей в качестве отладочного ключа по умолчанию (как описано выше). (Для этого в Eclipse/ADT перейдите в раздел "Windows" > "Настройки" > "Android" > "Сборка" ).

Ответ 3

Насколько я могу судить, для этого вам нужно переопределить цель "-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" />

Ответ 4

  • Создайте новую и пустую папку в рабочем пространстве Eclipse.

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

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

Ответ 5

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

В pseudo- script это выглядит так:   # Нормальная Ant отладка   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

Ответ 6

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

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

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

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

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

Ответ 7

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

Добавьте следующее в ${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>