Создание нескольких (тестовых / продвинутых) версий Android APK в Eclipse - PullRequest
23 голосов
/ 21 октября 2010

Я хочу оптимизировать создание немного разных APK одного и того же приложения для Android, с той лишь разницей, что используется сервер HTTP API, который он использует (dev / staging / prod).

В идеале, я бы хотел, чтобы мой Eclipse создавал 2 APK, один с сервером prod, а другой с dev.

У меня даже все в порядке с конфигурациями 2 Run, но я не смог выяснить, как передать параметры в приложение и прочитать их из кода.

Я хочу нацелиться на 1,5, кстати, и я бы хотел использовать инструменты автоматической сборки Eclipse, поэтому я ищу наиболее универсальное решение.

Спасибо.

Ответы [ 5 ]

9 голосов
/ 04 ноября 2011

Я думаю, что использование ant build script было бы самым простым решением.Eclipse поддерживает сборку ant, поэтому вы можете запустить команду ant в eclipse.

Вы можете решить вашу проблему с помощью ant следующим образом.

  1. подготовить два файла ресурсов Android xml.
  2. построить пакет с ресурсом # 1
  3. перезаписать ресурс # 1 содержимым ресурса # 2
  4. построить другой пакет

xml будет выглядеть так:

ресурс № 1:

<resources>
    <string name="target">dev</string>
</resources>

ресурс № 2:

<resources>
    <string name="target">staging</string>
</resources>

, и скрипт ant будет выглядеть следующим образом:

<project>
  <target name="build_all">
     <copy file="res1.xml" to="res/values/target.xml"/>
     <ant antfile="build.xml" target="debug"/>
     <copy file="res2.xml" to="res/values/target.xml"/>
     <ant antfile="build.xml" target="debug"/>
  </target>
</project>
4 голосов
/ 03 ноября 2011

Переместите весь ваш код в проект библиотеки, см. http://developer.android.com/guide/developing/projects/projects-eclipse.html#SettingUpLibraryProject

Затем создайте отдельные проекты в eclipse для тестирования и производства, каждый из которых будет иметь уникальное имя пакета. Затем вы можете использовать имя пакета, чтобы различать версии.

Что-то вроде:

public static boolean isProductionVersion(){
  return context.getPackageName().toLowerCase().contains("production");
}

Это может показаться излишним для управления различными конечными точками http, но это сделает код более управляемым. Вы также можете делать полезные вещи, такие как:

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

Все это можно сделать в Eclipse без использования сторонних инструментов.

1 голос
/ 02 ноября 2011

Это не совсем то, что вы хотите:

private static Boolean isSignedWithDebugKey = null;
    protected boolean signedWithDebug() {
        if(isSignedWithDebugKey == null) {
            PackageManager pm = getPackageManager();
            try {
                PackageInfo pi = pm.getPackageInfo(getPackageName(), 0);
                isSignedWithDebugKey = (pi.applicationInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
            }
            catch(NameNotFoundException nnfe) {
                nnfe.printStackTrace();
                isSignedWithDebugKey = false;
            }
        }

        return isSignedWithDebugKey;
    }

После этого вы можете подключиться к серверу разработчика / промежуточного уровня, если приложение подписано с помощью ключа отладки, а продукт - с сертификатом выпуска.

0 голосов
/ 14 февраля 2014

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

Сначала я должен загрузить библиотеку ant-contrib, чтобы определить задачу цикла for:

<taskdef resource="net/sf/antcontrib/antcontrib.properties">
    <classpath>
        <pathelement location="lib/ant-contrib-1.0b5-SNAPSHOT.jar" />
    </classpath>
</taskdef>

Я поместил свой список конфигураций config.names в properties file:

config.url.root=http://projectserver.aptivate.org/
config.names=student-production, teacher-production, student-testing, teacher-testing

И определите цель build-all, которая зацикливается на config.names:

<target name="build-all">
    <for param="config.name" trim="true" list="${config.names}">
        <sequential>

Определение пользовательского каталога resources для каждого, сохраняяимя каталога в свойстве config.resources:

<var name="config.resources" unset="true" />
<property name="config.resources" value="bin/res-generated/@{config.name}" />

Удалите его и скопируйте в него глобальные ресурсы из res:

<delete dir="${config.resources}" />

<copy todir="${config.resources}">
    <fileset dir="res"/>
</copy>

Измените - на /в имени конфигурации, чтобы указать путь в параметре URL:

<var name="config.path" unset="true" />
<propertyregex property="config.path"
    input="@{config.name}" regexp="-"
    replace="/" casesensitive="true" />

Запустите преобразование XSLT, чтобы изменить файл strings.xml:

<xslt in="res/values/strings.xml"
    out="${config.resources}/values/strings.xml"
    style="ant/create_xml_configs.xslt"
    force="true">
    <param name="config.url.root" expression="${config.url.root}" />
    <param name="config.name" expression="@{config.name}" />
    <param name="config.path" expression="${config.path}" />
</xslt>

Это таблица стилей XSLTчто я использую:

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
            <xsl:param name="config.url.root" />
            <xsl:param name="config.name" />
            <xsl:param name="config.path" />

            <!-- http://my.safaribooksonline.com/book/xml/9780596527211/creating-output/xslt-id-4.6 -->
            <xsl:template match="/">
                    <!--
                    This file is automatically generated from res/values/strings.xml
                    by ant/custom_rules.xml using ant/create_xml_configs.xslt.
                    Do not modify it by hand; your changes will be overwritten.
                    -->
                    <xsl:apply-templates select="*"/>
            </xsl:template>

            <xsl:template match="*">
                    <xsl:copy>
                            <xsl:for-each select="@*">
                                    <xsl:copy/>
                            </xsl:for-each>
                            <xsl:apply-templates/>
                    </xsl:copy>
            </xsl:template>

            <!-- the value of update_server_url must end with a slash! -->
            <xsl:template match="string[@name='update_server_url']/text()">
                    <xsl:value-of select="$config.url.root" /><xsl:value-of select="$config.path" />/
            </xsl:template>

            <xsl:template match="string[@name='app_version']/text()">
                    <xsl:value-of select="." />-<xsl:value-of select="$config.name" />
            </xsl:template>
    </xsl:stylesheet>

И обратно к custom_rules.xml, где я затем извлекаю app_version из оригинала (неизмененного) res/values/strings.xml:

<xpath input="res/values/strings.xml" 
    expression="/resources/string[@name='app_version']" 
    output="resources.strings.app_version" />

И использую *Задача 1046 * для вызова debug сборки:

<antcall target="debug">
    <param name="resource.absolute.dir" value="${config.resources}" />
    <param name="out.final.file" value="${out.absolute.dir}/${ant.project.name}-${resources.strings.app_version}-@{config.name}.apk" />
</antcall>

с двумя измененными значениями свойств:

  • resource.absolute.dir указывает цели debug использовать мою модифицированную res каталог, определенный вconfig.resources свойство выше;
  • out.final.file говорит ему о необходимости создать APK с другим именем, включая имя конфигурации (например, student-testing) и номер версии, извлеченный из strings.xml.

И, наконец, я могу запустить ant build-all из командной строки и построить все четыре цели.Немного больше скрипта, непосредственно перед концом цели build-all, перечисляет скомпилированные файлы APK вместе для справки:

<echo message="Output packages:" />
<for param="config.name" trim="true" list="${config.names}">
    <sequential>
        <echo message="${out.absolute.dir}/${ant.project.name}-${resources.strings.app_version}-@{config.name}.apk" />
    </sequential>
</for>
0 голосов
/ 01 ноября 2011

Для передачи параметров вы всегда можете создать файл в системе каталогов Android и получить от него код для чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...