Другой хост API с gradle и android

Мне было интересно, можно ли предоставить другой хост API для каждой сборки с помощью gradle. В идеале я хотел бы получить доступ к константе через мой код таким же образом, поэтому, когда я делаю сборку gradle, он создает файл release.apk, указывающий на http://example.com и файл debug.apk, чтобы указать на http://debug.example.com.

Я добился этого, используя следующее:

buildTypes {
    debug {
        buildConfig "public final static String API_HOST = \"http://debug.example.com\";"
    }

    release {
        buildConfig "public final static String API_HOST = \"https://example.com\";"
    }
}

Однако это кажется довольно грязным

Ваше здоровье


person tmho    schedule 12.06.2013    source источник


Ответы (3)


Альтернативой является использование buildConfigField:

buildTypes {
  debug {
    buildConfigField 'String', 'API_HOST', '"https://debug.example.com"'
  }

  release {
    buildConfigField 'String', 'API_HOST', '"https://example.com"'
  }
}

Затем вы бы ссылались на него в своем коде через BuildConfig.API_HOST

person Tash Pemhiwa    schedule 04.11.2016

Я думаю, что лучшей альтернативой сегодняшним функциям Gradle является указание как productFlavors, так и buildTypes (пример ниже).

Типы сборки определяют, каким сертификатом я подписываюсь и запущен ли Proguard.

productFlavors управляет предполагаемой средой, которая включает в себя настраиваемые ресурсы, а также другое имя пакета, поэтому я могу установить их одновременно.

Затем я настраиваю адрес своего сервера в файле strings.xml для каждого варианта и загружаю его во время выполнения.

src/dev/res/values/strings.xml
src/staging/res/values/strings.xml

Пример strings.xml из варианта "dev":

<string name="config_url">http://com.example.debug</string>

Фрагмент build.gradle:

productFlavors {
    dev {
        packageName "com.example.dev"
    }

    staging {
        packageName "com.example.staging"
    }
}

buildTypes {
    debug {
        versionNameSuffix " debug"
        signingConfig signingConfigs.debug
    }

    release {
        // A release build runs Proguard, and signs with a release certificate
        zipAlign true
        runProguard true
        proguardFile 'proguard-project.txt'
        proguardFile getDefaultProguardFile('proguard-android-optimize.txt')
        signingConfig signingConfigs.release
    }
}
person Dan J    schedule 10.01.2014
comment
Как это сделать, если у вас есть файл google-services.json, которому везде нужно одно и то же имя пакета? - person Elynad; 09.01.2019

Так что в итоге я поговорил об этом с одним из инженеров gradleware... Мое первоначальное решение было правильным. Google/Gradle улучшит это в будущем.

Чтобы добавить несколько значений, вы разделяете строки запятыми.

person tmho    schedule 29.08.2013
comment
Спасибо, как вы ссылаетесь на API_HOST? Вам нужен уже настроенный класс buildConfig? - person Karim Varela; 04.09.2013
comment
Gradle (по крайней мере, для Android, используя Visual Studio) создаст файл BuildConfig.java. Оттуда вы просто ссылаетесь на константу. т.е. callEndPoint(BuildConfig.API_HOST); - person tmho; 04.09.2013
comment
Спасибо! Однако, когда я добавляю константы таким образом, я не вижу их в BuildConfig. Любые идеи? - person Karim Varela; 04.09.2013
comment
вы используете андроид студию? если не запускать сборку gradle из командной строки, следует вызвать BuildConfig.java, чтобы отразить ваши изменения... возможно - person tmho; 04.09.2013
comment
не могу отредактировать мой комментарий выше... я имел в виду студию ANDROID, а не студию VISUAL... лол - person tmho; 04.09.2013