Nessuna delle risposte esistenti mi soddisfaceva, tuttavia Liberty era vicino. Quindi è così che lo sto facendo. Prima di tutto al momento sto lavorando con:
- Android Studio Beta 0.8.2
- Plugin Gradle 0.12. +
- Grado 1.12
Il mio obiettivo è eseguire la Debug
versione insieme alla Release
versione sullo stesso dispositivo utilizzando lo stesso ContentProvider
.
In build.gradle del suffisso del set di app per la build di debug:
buildTypes {
debug {
applicationIdSuffix ".debug"
}
}
Nel file AndroidManifest.xml imposta la android:authorities
proprietà del tuo ContentProvider
:
<provider
android:name="com.example.app.YourProvider"
android:authorities="${applicationId}.provider"
android:enabled="true"
android:exported="false" >
</provider>
Nella proprietà del set di codiciAUTHORITY
che può essere utilizzata dove necessario nella tua implementazione:
public static final String AUTHORITY = BuildConfig.APPLICATION_ID + ".provider";
Mancia: prima che lo fosseBuildConfig.PACKAGE_NAME
Questo è tutto! Funzionerà come un incantesimo. Continua a leggere se usi SyncAdapter!
Aggiornamento per SyncAdapter (14.11.2014)
Ancora una volta inizierò con la mia configurazione attuale:
- Android Studio Beta 0.9.2
- Plugin Gradle 0.14.1
- Grado 2.1
Fondamentalmente, se hai bisogno di personalizzare alcuni valori per build diverse puoi farlo dal file build.gradle:
- usa buildConfigField per accedervi dalla
BuildConfig.java
classe
- usa resValue per accedervi dalle risorse, ad esempio @ string / your_value
In alternativa alle risorse, puoi creare directory buildType o flavour separate e sovrascrivere XML o valori al loro interno. Tuttavia, non lo userò nell'esempio seguente.
Esempio
Nel file build.gradle aggiungi quanto segue:
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"'
}
}
Vedrai i risultati nella classe BuildConfig.java
public static final String ACCOUNT_TYPE = "your.syncadapter.type.debug";
e in 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>
Nel tuo authenticator.xml usa la risorsa specificata nel file 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"
/>
Nella tua syncadapter.xml utilizzare la stessa risorsa ancora e @ stringa / autorità troppo
<?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"
/>
Suggerimento: il completamento automatico (Ctrl + Spazio) non funziona per queste risorse generate, quindi devi digitarle manualmente