Android Studio build flavors – Come avere gli stessi file sorgenti in diversi tipi di sapori

Devo creare un sapore demo nello studio android per un'app. Nel mio gradino di livello di app ho creato un altro sapore chiamato demo e il sapore predefinito di pieno naturalmente. Sembra così:

apply plugin: 'com.android.application' android { compileSdkVersion 22 buildToolsVersion "21.1.2" defaultConfig { applicationId "com.example.uen229.myapplication" minSdkVersion 17 targetSdkVersion 22 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } productFlavors { demo { applicationId "com.buildsystemexample.app.demo" versionName "1.0-demo" } full { applicationId "com.buildsystemexample.app.full" versionName "1.0-full" } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:22.2.0' } 

e qui è un'image della mia struttura di progetto in cui ho creato una directory di demo:

  • Miglior modo per build e gestire la visualizzazione Elenco con diverse righe
  • Android EditText: Fatto invece che Enter o Word Wrap invece di Multi Line
  • Errore Google Maps v2 sull'uso di setMyLocationEnabled
  • Firebase console: come specificare click_action per le notifiche
  • Come visualizzare i testi secondo la canzone che suona in android?
  • Distriggerszione del completamento automatico per textarea e campi di input in Android Cordova-app
  • immettere qui la descrizione dell'immagine

    Ora sulla questione. Ho due classi chiamate Hello.java. Entrambi sono in corrispondenza dei rispettivi sapori e printingno cose diverse. Ti mostrerò entrambi i file ora:

     import android.util.Log; /** this is from demo flavor directory**/ public class Hello { Hello(){ Log.v("","hello from demo"); } public String getName(); return "im from demo"; }; } 

    E qui è l'altra Ciao:

     package com.example.uen229.myapplication; import android.util.Log; /** this is from full or main flavor directory**/ public class Hello { Hello(){ Log.v("", "hello from main"); } public String getName(){ return "im from main"; }; } 

    notate come il primo hello.java non ha pacchetto, anche se avessi un pacchetto che l'IDE dovrà compilare. guarda questa foto:

    immettere qui la descrizione dell'immagine

    Adesso finalmente consideriamo mainActivity.java per vedere che quando commuto le varianti di build solo fa un toast per "im from main", ma ho bisogno di printingre 'im from demo' se utilizzo la variante build demoDebug. build la variante a demoDebug che printing ancora "im from main". chiunque può aiutare:

     public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Hello h = new Hello(); Toast.makeText(this, h.getName(), Toast.LENGTH_LONG).show(); } } 

    AGGIORNARE

    Dallo stackoverflow dice:

    Se vuoi avere una versione diversa della stessa class nei due sapori, dovrai crearla in entrambi i sapori.

     src/flavor1/java/com/foo/A.java src/flavor2/java/com/foo/A.java 

    E poi il tuo codice in src/main/java può fare:

     import com.foo.A 

    a seconda del sapore selezionato, viene utilizzata la versione giusta di com.foo.A

    Questo è ciò che voglio realizzare con la class Hello

  • come giocare il video dal mio account youtube in android
  • GStreamer su Android
  • Errore di protocollo di trasferimento di Adb. Nessun file o directory con questo nome
  • No ActionBar in PreferenceActivity dopo l'aggiornamento a Support Library v21
  • setMicrophoneMute (boolean) non funziona su alcuni dispositivi
  • Come posso impostare l'image di background con picasso nel codice
  • 3 Solutions collect form web for “Android Studio build flavors – Come avere gli stessi file sorgenti in diversi tipi di sapori”

    Penso che non possa avere la stessa class nel sapore principale e il tuo altro sapore. si dovrebbe solo creare un altro sapore, quindi spostare la tua class Hello dal sapore principale a quel nuovo sapore. questa regola è solo per i file .java. Voglio dire che puoi avere un file xml nel sapore principale e un'altra versione nel tuo sapore personalizzato, ma non puoi farlo con i file java.

    qui è un utile collegamento con ulteriori spiegazioni.

    Mi consiglio di creare 3 serie di sorgenti:

    • principale – che contenere classi comuni
    • demo – contiene classi specifiche demo
    • pro – contiene classi per versioni pro

    e dichiararle usando:

     sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src/main/java'] res.srcDirs = ['src/main/res'] assets.srcDirs = ['src/main/assets'] } pro { manifest.srcFile 'src/pro/AndroidManifestPro.xml' java.srcDirs = ['src/main/java', 'src/pro/java'] } demo { manifest.srcFile 'src/oldlite/AndroidManifestDemo.xml' java.srcDirs = ['src/main/java', 'src/demo/java'] } } 

    PS non è veramente sicuro della syntax del contenuto di java.srcDirs – si prega di verificare se stessi

    Sono stato in grado di ignorare le lezioni ma la chiave non era quella di includere la class nella mia cartella principale.

    Quindi la variante di build fullDebug (cioè cartella principale) non verrà mai eseguita. Sempre eseguire un sapore e non la cartella principale. La cartella principale sarà utilizzata solo per mantenere le cose comuni in esso.

    Nel mio caso avevo una demo per USA e un altro paese (demo e demo_us) e avevo bisogno di due sapori. Costruirò sempre per uno dei due e non costruirò il principale.

    immettere qui la descrizione dell'immagine

    com.example.******.myapplication potrai vedere che ho fatto tutti i nomi dei pacchetti per essere lo stesso: come il com.example.******.myapplication . Dal momento che tutti hanno lo stesso nome del pacchetto nella MainActivity è sufficiente importre Hello.java con quel nome del pacchetto e scegliere la variante appropriata al momento della creazione.

    Per le risorse, sembra che sia diverso e sovrascriverà naturalmente, ma i file di class java devono fare così.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.