Ни один из существующих ответов меня не удовлетворил, однако Liberty была близка. Вот как я это делаю. В первую очередь на данный момент я работаю с:
- Android Studio Beta 0.8.2
- Плагин Gradle 0.12. +
- Gradle 1.12
Моя цель - запустить Debug
версию вместе с Release
версией на одном устройстве, используя то же самое ContentProvider
.
В build.gradle вашего приложения установите суффикс для сборки Debug:
buildTypes {
debug {
applicationIdSuffix ".debug"
}
}
В файле AndroidManifest.xml установите android:authorities
свойство вашего ContentProvider
:
<provider
android:name="com.example.app.YourProvider"
android:authorities="${applicationId}.provider"
android:enabled="true"
android:exported="false" >
</provider>
В свойстве кодового набора, AUTHORITY
которое можно использовать везде, где это необходимо в вашей реализации:
public static final String AUTHORITY = BuildConfig.APPLICATION_ID + ".provider";
Совет: раньше это былоBuildConfig.PACKAGE_NAME
Это оно! Это будет работать как шарм. Продолжайте читать, если вы используете SyncAdapter!
Обновление для SyncAdapter (14.11.2014)
Еще раз начну с моей текущей настройки:
- Бета-версия Android Studio 0.9.2
- Плагин Gradle 0.14.1
- Gradle 2.1
В принципе, если вам нужно настроить некоторые значения для разных сборок, вы можете сделать это из файла build.gradle:
- используйте buildConfigField для доступа к нему из
BuildConfig.java
класса
- используйте resValue для доступа к нему из ресурсов, например @ string / your_value
В качестве альтернативы для ресурсов вы можете создать отдельные каталоги buildType или разновидностей и переопределить XML-файлы или значения в них. Однако я не собираюсь использовать его в примере ниже.
пример
В файл build.gradle добавьте следующее:
defaultConfig {
resValue "string", "your_authorities", applicationId + '.provider'
resValue "string", "account_type", "your.syncadapter.type"
buildConfigField "String", "ACCOUNT_TYPE", '"your.syncadapter.type"'
}
buildTypes {
debug {
applicationIdSuffix ".debug"
resValue "string", "your_authorities", defaultConfig.applicationId + '.debug.provider'
resValue "string", "account_type", "your.syncadapter.type.debug"
buildConfigField "String", "ACCOUNT_TYPE", '"your.syncadapter.type.debug"'
}
}
Вы увидите результаты в классе BuildConfig.java
public static final String ACCOUNT_TYPE = "your.syncadapter.type.debug";
и в build / generated / res / generated / debug / values / generated.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Automatically generated file. DO NOT MODIFY -->
<!-- Values from default config. -->
<item name="account_type" type="string">your.syncadapter.type.debug</item>
<item name="authorities" type="string">com.example.app.provider</item>
</resources>
В вашем Authenticator.xml используйте ресурс, указанный в файле build.gradle
<?xml version="1.0" encoding="utf-8"?>
<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
android:accountType="@string/account_type"
android:icon="@drawable/ic_launcher"
android:smallIcon="@drawable/ic_launcher"
android:label="@string/app_name"
/>
В вашем syncadapter.xml использовать один и тот же ресурс снова и @ струнные / власти слишком
<?xml version="1.0" encoding="utf-8"?>
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
android:contentAuthority="@string/authorities"
android:accountType="@string/account_type"
android:userVisible="true"
android:supportsUploading="false"
android:allowParallelSyncs="false"
android:isAlwaysSyncable="true"
/>
Совет: автозаполнение (Ctrl + Пробел) не работает для этих сгенерированных ресурсов, поэтому вам придется вводить их вручную