JavascriptProva

giovedì 8 febbraio 2018

Creare una libreria "interna" in Android

Spinoso problema delle librerie android.
Il punto chiave è generare un .aar.

Iniziamo con: Click File > New > New Module.
In the Create New Module window that appears, click Android Library, then click Next.

Give your library a name and select a minimum SDK version for the code in the library, then click Finish.

L'ho chiamata Mia Libreria e l'SDK minimo è 17.

E' stata fatta la sincronizzazione di Gradle.
Il cambiamento della voce apply plugin sul modulo Gradle della libreria è già stato cambiato da c.antonello.studiojar3 a com.android.library.
Ora dovrei salvare il file.
Come?
Boh... faccio "Save All"...

Ma il passo completo è Save the file and click Tools > Android > Sync Project with Gradle Files. Vado a cliccare quanto dovuto...

Bene.
Ora se io clicco "build APK" dovrebbe generarmi un AAR...
Lo deduco da questo: When you want to build the AAR file, select the library module in the Project window and then click Build > Build APK


Proviamo...

Fatto, e vediamo se si è generato un AAR...

Non funziona.
La procedura che funziona per creare l'aar è invece
View -> Tool Windows -> Gradle
Sulla finestra di gradle che si apre a destra si va su mialibreria -> Tasks -> assemble, e si generano due aar: una versione debug e una versione release.

Ora il problema è come usare queste librerie.
Ora, dato che la libreria fa parte di questo progetto, posso fare direttamente questo:
Make sure the library is listed at the top of your settings.gradle file, as shown here for a library named "my-library-module":
include ':app', ':my-library-module'
include ':app', ':mialibreria'
Confermato!
Open the app module's build.gradle file and add a new line to the dependencies block as shown in the following snippet:
dependencies {
    compile project(":my-library-module")
}
Vediamo:
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
    compile project(":mialibreria")
}
Vediamo se sincronizza...

Ha sincronizzato.

Ora, nella mia libreria ho messo un codice estremamente fesso per fare la prova:
public class Classe {
    public Classe(){}
    public void Scrivi(){
        System.out.println("Ciao");
    }
}
Vediamo se si riesce a inserire la funzione.
No.


Anziché modificare manualmente il file app Gradle (parte che ho scritto in rosso) si può procedere con File -> Project Structure
Quindi si seleziona la scheda Dependencies e si aggiunge con il + il riferimento alla libreria.
Il file Gradle app si modifica così:
dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
    implementation project(':mialibreria')
}
compile è deprecato, l'uso più moderno è di implementation.