[YukSharing] Flutter AndroidX App Compatibility

Misael Jonathan
PPL A-4 YUK RECYCLE
3 min readMar 10, 2019

AndroidX merupakan Android Extension Library terbaru yang sudah dikenalkan pada tahun 2018 lalu. Untuk saat ini, versi AndroidX yang sudah dapat digunakan publik dan untuk production adalah versi 1.0.0. AndroidX hadir untuk menggantikan library lama android (android.support) pada aplikasi generasi mendatang.

Versi stabil dari AndroidX baru direlease pada September 21, 2018. Kehadiran versi yang sudah siap dipakai publik ini menyebabkan banyak developer yang mencoba untuk melakukan migrasi terhadap dependency dan plugin yang tersedia agar compatible dengan AndroidX. Contohnya adalah plugin google_maps_flutter yang melakukan migrasi pada versi 0.2.0.

Namun tidak banyak juga plugin yang belum melakukan migrasi agar compatible dengan AndroidX. Hal ini merupakan salah satu tantangan yang saya hadapi ketika menambahkan dependencies untuk aplikasi YukRecycle.
Sebagai gambaran, aplikasi YukRecycle menggunakan Google Maps API untuk memilih lokasi dan pembuatan route. Dependency yang saya gunakan antara lain :
- google_maps_flutter
- flutter_google_places
- location
- cloud_firestore

Ternyata keempat dependency tersebut tidak saling compatible, dikarenakan pada plugin tersebut terdapat perbedaan versi AndroidX yang mereka gunakan dan masih ada yang belum support AndroidX. Contoh error yang dapat terjadi (google_maps_flutter: ^0.4.0):

WARNING: This version of google_maps_flutter will break your Android build if it or its dependencies aren't compatible with AndroidX.
See https://goo.gl/CP92wY for more information on the problem and how to fix it.
This warning prints for all Android build failures. The real root cause of the error may be unrelated.

Warning ini dikeluarkan karena ternyata terdapat dependency lain belum migrasi ke AndroidX. Kemudian terdapat error lagi yang mungkin terjadi:

* What went wrong:
Execution failed for task ':app:preDebugBuild'.
> Android dependency 'androidx.core:core' has different version for the compile (1.0.0) and runtime (1.0.1) classpath. You should manually set the same version via DependencyResolution

Error ini terjadi ketika library sudah support AndroidX, tetapi terdapat perbedaan versi pada dependency Androidx.core:core pada compile dan runtime.

Semua error diatas dapat dihindari dengan memilih plugin yang tepat dan memilih versi yang tepat. Namun tidak jarang pasti diantara para developer akan mengalami error seperti diatas. Untuk itu akan saya rangkum beberapa tips yang mungkin dapat membantu kalian:

1. Sesuaikan dependency terhadap kebutuhan anda

Tidak menutup kemungkinan bahwa hanya terdapat 1 plugin yang dapat menyediakan fitur yang anda inginkan. Misalnya untuk kasus saya, sebelumnya saya menggunakan plugin “Geolocator” untuk mendapatkan current location dari user. Namun setelah bermain dengan versi-versi Geolocator, solusi tidak ditemukan. untuk itu saya mencari plugin serupa yang dapat menghasilkan output yang kurang lebih sama. Ternyata ada, yaitu plugin “Location”. maka langsung diganti deh.

2. Kalau kalian belum mau aplikasinya support AndroidX, cari tau plugin apa saja yang dapat digunakan

https://flutter.dev/docs/development/packages-and-plugins/androidx-compatibility
Link diatas merupakan informasi mengenai AndroidX compatibility pada Flutter. disana juga disediakan informasi mengenai plugin apa saja yang dapat digunakan terdapat cara untuk menghindari AndroidX, dengan menggunakan versi yang masih pre-AndroidX.

3. Untuk aplikasi yang sudah support tapi masih error different version pada runtime dan compile, mainkan Dependency Resolution

Kita dapat melakukan konfigurasi pada Dependency Resolution agar aplikasi menggunakan versi sebuah library yang telah didefine pada Depedency Resolution. Untuk kasus error seperti saya, kita dapat melakukan konfigurasi pada :

build.gradle level Android (bukan App Level)
tambahkan potongan code berikut ini pada subprojects

if (details.requested.group == 'androidx.core'
&&!details.requested.name.contains('androidx') ) {
details.useVersion "1.0.1"
}

Sehingga menjadi :

buildscript {
ext.kotlin_version = '1.2.51'
repositories {
google()
jcenter()
}

dependencies {
classpath 'com.android.tools.build:gradle:3.2.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'com.google.gms:google-services:4.2.0'
}

subprojects {
project.configurations.all {
resolutionStrategy.eachDependency { details ->

if (details.requested.group == 'androidx.core'
&& !details.requested.name.contains('androidx') ) {details.useVersion "1.0.1"
}

}
}
}

}

allprojects {
repositories {
google()
jcenter()
}
}

rootProject.buildDir = '../build'
subprojects {
project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
project.evaluationDependsOn(':app')
}

task clean(type: Delete) {
delete rootProject.buildDir
}

Semoga tips dan info yang saya paparkan diatas dapat berguna. Jikalau masi terdapat kekurangan dan kesalahan, mohon dimaafkan dan dikoreksi agar informasi ini dapat terus berkembang dan membantu yang membutuhkan.

Terima Kasih

--

--