7

Sto configurando una libreria Android con diverso productFlavors. La libreria ha una luce e uno completo. Il file viene settato correttamente:Impossibile importare il supporto per android v4 o v7 nella libreria utilizzando productFlavors

src/main/java/com/example/... per le classi principali
src/full/java/com/example/... per le classi piene
src/light/java/com/example/... per le classi di luce

Android Studio capito bene questo e ha aggiunto un (full) al sapore pieno.

NUMERO: Le dipendenze come okhttp funziona come previsto, ma non il appcompat-v7. Tutto usando ViewPager, FragmentActivity, RecyclerView. Ho provato ad aggiungere le dipendenze allo fullCompile ma non ha funzionato neanche. Le dipendenze non vengono risolte da Android Studio, l'importazione non funziona, eccetto ok okhttp, exoplayer e così via.

Ho provato Invalidate Cache/Restart, clean Project, Resync gradle, nessuno ha funzionato.

Bibliotecabuild.gradle

apply plugin: 'com.android.library' 

android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.1" 

    ... 

    buildTypes { 
     release { 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
      minifyEnabled false 
     } 
    } 
    lintOptions { 
     abortOnError false 
    } 

    publishNonDefault true 

    productFlavors { 
     full { 
     } 
     light { 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:support-v4:23.1.1' 
    compile 'com.android.support:appcompat-v7:23.1.1' 
    compile 'com.squareup.okhttp:okhttp:2.3.0' 
    fullCompile 'com.android.support:support-v4:23.1.1' 
    fullCompile 'com.android.support:appcompat-v7:23.1.1' 
    fullCompile 'com.android.support:recyclerview-v7:23.1.1' 
    fullCompile 'com.squareup.picasso:picasso:2.5.0' 
} 

Appbuild.gradle

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.1" 

    buildTypes { 
     release { 
     } 
    } 

    productFlavors { 
     full { 
     } 
     light { 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:appcompat-v7:23.+' 
    compile 'com.android.support:support-v4:23.+' 
    compile 'com.google.android.gms:play-services-base:7.5.0' 
    compile 'com.google.android.gms:play-services-ads:7.5.0' 
    compile 'com.google.android.gms:play-services-location:7.5.0' 
    compile 'com.android.support:recyclerview-v7:23.1.1' 
    compile 'com.android.support:design:23.1.1' 
    fullCompile project(path: ':library', configuration: 'fullRelease') 
    lightCompile project(path: ':library', configuration: 'lightRelease') 
} 
+1

È possibile fornire l'errore prodotto in gradle? – droidpl

+0

quando si crea l'app, si dice 'Errore: (1073, 64) errore: il pacchetto ViewPager non esiste'. Se sfoglio le classi, l'importazione di 'ViewPager' non viene risolta e genera un errore in quelle classi. @droidpl –

+0

Se si utilizza in qualche luogo un viewPager e questa classe non è nella versione full/light nella cartella src/light o src/full corrispondente, non verrà importata poiché con fullCompile si dice in questa versione la biblioteca è disponibile. Puoi ricontrollare dove si trova questo file in crash? – droidpl

risposta

3

si deve dichiarare la configurazione nel Gradle app. Quando è correlato a una libreria, le configurazioni non sono dichiarate correttamente. Prova:

configurations { 
    fullDebugCompile 
    fullReleaseCompile 
    lightDebugCompile 
    lightReleaseCompile 
} 

dependencies { 
... 
    fullDebugCompile project(path:":library", configuration:"fullDebug") 
    fullReleaseCompile project(path:":library", configuration:"fullRelease") 
    lightDebugCompile project(path:":library", configuration:"lightDebug") 
    lightReleaseCompile project(path:":library", configuration:"lightRelease") 
} 

lunga spiegazione

Il plugin di Android Gradle utilizza implementazioni diverse per l'applicazione e la biblioteca, chiamato AppVariant e LibraryVariant rispettivamente. A volte il modo in cui varianti e tipi di build funzionano è diverso in entrambi i tipi di progetti. In questo caso, qualche tempo fa le librerie venivano sempre compilate nel tipo di build di rilascio all'interno di una determinata variante, cosa che rendeva i progetti di libreria non così flessibili come lo erano le app.

Ecco perché hanno deciso di abilitare l'opzione publishNonDefault e portare il supporto in Android Studio per questo tipo di comportamenti, quindi è possibile utilizzare diverse build di una libreria in diverse build di un'app, ma è necessario specificare quale build utilizzare quale biblioteca. Questo è il motivo per cui si dichiara esplicitamente lo configurations.

Il nome convenzione utilizzato dal team di Android Build Tools è {buildType}{flavor}TaskName, quindi per la configurazione del percorso di classe è necessario utilizzare lo stesso nome.

Tutto questo processo ha un rovescio della medaglia, che è se si pubblicano le dipendenze non di default, il plugin di Android garantirà tutte le possibili configurazioni di libreria sono compilati prima che la vostra applicazione è costruita, in modo che il tempo di costruzione può aumentare un po '(a seconda sulle dimensioni della libreria)