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:

  • MarkerClick funziona ma InfoWindowClick non apre ViewModel
  • Pubblica l'opzione Android App in disabilitato in Xamarin usando Visual studio 2015
  • disabilitare un ImageButton?
  • Uso della camera nell'orientamento ritratto
  • Aggiornamento delle variables UI / runOnUiThread / finale: come scrivere il codice magro che fa l'aggiornamento dell'interface utente quando viene richiamato da un altro thread
  • Come integrare la libreria di runtime nativa con dlopen su NDK?
  • 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 get frammenti esistenti quando si utilizza FragmentPagerAdapter
  • Android TextWatcher.afterTextChanged vs TextWatcher.onTextChanged
  • Come è ansible creare un filatore con immagini al posto del text?
  • Come colbind due dispositivi tramite Bluetooth inviando il codice di coppia per parametro? JAVA-Android
  • Android: Come monitorare la potenza del segnale WiFi
  • Convertire RGB in HEX programmaticamente - Android
  • 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.