Patch AndroidX


Google I / O 2018 memperkenalkan pengganti perpustakaan dukungan yang ada - AndroidX


Pada awalnya, perpustakaan dukungan dirancang untuk kompatibilitas API yang baru dan terkait erat dengan sistem operasi. Pustaka pendukung dikembangkan di cabang internal, yang secara berkala bergabung ke dalam Android Open Source Project (AOSP). Pendekatan ini membatasi permintaan tarik gabungan dari komunitas ke periode kecil ketika kode AOSP dan kode Google internal disinkronkan. Selain itu, untuk bekerja dengan pustaka dukungan, perlu memompa semua kode platform, dan ini lebih dari 40GB kode sumber. Untuk drive 250 GB saya, ini cukup banyak.


Fungsionalitas pustaka pendukung saat ini jauh lebih luas dari ide aslinya. Misalnya, ada komponen yang diimplementasikan untuk menyederhanakan pengembangan antarmuka pengguna AppCompat, komponen untuk bekerja dengan database Kamar, komponen untuk tugas-tugas WorkManager latar belakang. Banyak dari pustaka-pustaka ini awalnya kompatibel dan terikat dengan Android API. Angka di nomor perpustakaan dukungan menunjukkan tingkat minimum API yang didukungnya. Misalnya, dukungan-v7 mendukung Android API versi 7 dan lebih tinggi. Namun, mulai dari versi 26.0.0, perpustakaan dukungan mendukung Android API 14 dan lebih tinggi. Rasa sakit yang terpisah adalah kebutuhan untuk secara bersamaan memperbarui semua perpustakaan dukungan. Semua ini menunjukkan bahwa perpustakaan pendukung telah menjadi usang dan perlu dipikirkan kembali.


Tim pengembangan menghabiskan beberapa tahun mengisolasi pustaka dukungan ke dalam proyek kecil terpisah yang dapat Anda gunakan menggunakan Android Studio dan Gradle. Pengembangan dipindahkan ke cabang terpisah, yang baru-baru ini menjadi publik. Perpustakaan yang diperbarui disebut AndroidX. Perbedaan penting lainnya antara perpustakaan baru adalah kemungkinan pembaruan independen. Google menjanjikan kompatibilitas biner dalam kerangka satu versi utama, yang akan memungkinkan penggunaan recyclerview versi 1.0 dan AppCompat versi 1.9 dalam proyek yang sama.


Menurut pendapat saya, ini adalah langkah yang tepat dan logis dalam pengembangan perpustakaan dukungan. Saya harus sangat menyesuaikan komponen dari perpustakaan dukungan beberapa kali, yang mengarah pada kebutuhan untuk membuat paket com.android.support dalam proyek saya ... untuk mengakses kelas-kelas / metode / bidang pribadi.


Sekarang saya mengusulkan untuk "meretas" beberapa perpustakaan dari keluarga AndroidX dengan saya. Sebagai tutorial, saya memilih CardView. Saya akan memengaruhi perilaku CardView tanpa membuat perubahan apa pun pada kode yang menggunakannya.


Kami membutuhkan: Komputer yang menjalankan Linux atau MacOS (Windows tidak didukung), Android SDK, opsional Android Studio (saya menggunakan versi 3.1.3)


Bagaimana dengan windows?

Untuk mengunduh sumber, disarankan untuk menggunakan utilitas repo , yang tidak tersedia untuk Windows. Sumber juga dapat diunduh menggunakan git, misalnya, seperti ini: git clone --single-branch -b androidx-master-dev https://android.googlesource.com/platform/frameworks/support Namun, dalam hal ini mereka tidak akan Utilitas dan dependensi yang dikompilasi diunduh. Saya tidak memeriksa betapa pentingnya membangun


Untuk memulai, saya menyiapkan contoh kecil menggunakan AndroidX.


Sorotan:


Menggunakan AndroidX


 def cardViewVer = '1.0.0-beta01' dependencies { implementation "androidx.cardview:cardview:$cardViewVer" } 

 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <androidx.cardview.widget.CardView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="32dp" android:layout_marginEnd="32dp" android:layout_marginLeft="32dp" android:layout_marginRight="32dp" android:layout_marginStart="32dp" android:layout_marginTop="32dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" /> </androidx.cardview.widget.CardView> </FrameLayout> 

 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } } 

Hasilnya, kami mendapatkan aplikasi berikut:


menggambar

Mari kita turun ke AndroidX


Pertama, Anda perlu menginstal utilitas repo, dibuat untuk menyederhanakan pekerjaan dengan git dalam konteks android.


Kami membuat folder yang berfungsi untuk manipulasi kami, meskipun Anda juga dapat menggunakan direktori home.


 mkdir androidX 

Instal utilitasnya


 d androidX mkdir bin curl https://storage.googleapis.com/git-repo-downloads/repo > ./bin/repo chmod a+x ./bin/repo PATH={some_path}/androidX/bin/:$PATH 

Izinkan saya menjelaskan apa yang baru saja kita lakukan:
Di folder androidX, kami membuat folder repo, tempat kami mengunduh file di https://storage.googleapis.com/git-repo-downloads/repo , menjadikan file tersebut dapat dieksekusi dan menambahkan folder bin ke PATH sebagai bagian dari sesi terminal saat ini.
Dalam kasus saya, perintah terakhir tampak seperti ini: PATH = ~ / Work / projects / androidX / bin /: $ PATH


Unduh sumber AndroidX:


Buat folder androidX / androidX-source dan buat sekarang


 mkdir androidX-source cd androidX-source 

Kami menginisialisasi repositori lokal. Ini mengunduh sekitar 16 megabita data tentang cabang yang ada di repositori.


 repo init -u https://android.googlesource.com/platform/manifest -b androidx-master-dev 

Dalam prosesnya, nama dan email pengguna akan ditarik dari konfigurasi pertunjukan global, dalam kasus saya, tampilannya seperti ini:


 Your identity is: Andrew <me@example.com> If you want to change this, please re-run 'repo init' with --config-name      ,      .          . Testing colorized output (for 'repo diff', 'repo status'): black red green yellow blue magenta cyan white bold dim ul reverse Enable color display in this user account (y/N)? 

Saya menjawab dengan tegas pada pertanyaan terakhir.
Pada akhirnya kami mendapat pesan


 repo has been initialized in /Users/{user}/Work/projects/androidX/androidX-source 

Selanjutnya, unduh sumbernya secara langsung (sekitar 3 gigabytes)


 repo sync -j8 -c 

Kami dapat membuka sumber yang diunduh di Android Studio atau editor lainnya. Folder root dari proyek gradle terletak di: androidX/androidX-source/frameworks/support/


Ada banyak modul dengan berbagai fitur dan beberapa aplikasi pengujian. Kami dapat merakit dan menginstalnya untuk memeriksa kinerja.


Buka kelas androidx.cardview.widget.RoundRectRrawDrawable di modul cardview
Tambahkan lelucon yang tidak berbahaya ke metode onDraw


 canvas.drawText(โ€œHacked!โ€, 100, 100, paint); 

Tambalan penuh


Untuk proyek, tugas createArchive gradle dijelaskan, yang akan mengumpulkan pustaka androidX dan menempatkannya di repositori pakar lokal. Alamat Repositori: androidX/androidX-source/out/host/gradle/frameworks/support/build/support_repo


Untuk menggunakannya, Anda harus menentukan path di file build root.


maven { url 'androidX/androidX-source/out/host/gradle/frameworks/support/build/support_repo' }


Harap dicatat bahwa versi rakitan mungkin lebih baru daripada di repositori Google. Pada saat penulisan ini, saya telah menyusun perpustakaan androidX versi 1.0.0-rc01. Anda dapat melihat versi perpustakaan yang dikompilasi di repositori maven lokal: androidX/androidX-source/out/host/gradle/frameworks/support/build/support_repo/androidx/cardview/cardview/maven-metadata.xml


Contoh yang diperbarui


Kami akan membangun kembali aplikasi kami dan melihat gambar berikut:


menggambar

AndroidX berhasil ditambal!


Apa artinya ini bagi kita:


  • Kami dapat memperbaiki masalah kritis tanpa menunggu pembaruan dari Google. Omong-omong, tim AndroidX menerima permintaan tarik.
  • Sesuaikan perpustakaan androidX dengan kuat.

Tautan terkait:
Dokumentasi Dukungan Perpustakaan
Posting Blog Pengembang
Panduan Kontribusi AndroidX
Pelacak Tugas AndroidX
Sumber AndroidX

Source: https://habr.com/ru/post/id418723/


All Articles