Ketika Anda terlibat dalam Program Akses Awal, Anda tidak pernah tahu sebelumnya apa yang akan terjadi pada akhirnya. Tentu saja, Anda berharap bahwa teknologi akan lepas landas, dan aplikasi Anda akan maju dari pasar dan mendapatkan sebagian PR di Google I / O. Dan ini adalah motivasi yang baik untuk membaca kode sumber alih-alih dokumentasi pada tahap awal, yang, apalagi, harus diunduh dari arsip rahasia.
Di
AppsConf, Evgeny Saturov menunjukkan keikutsertaan apa dalam Early Access dengan mengembangkan aplikasi dengan peluncuran instan, menjelaskan semua fitur Google Play Instan di sepanjang jalan. Dalam menguraikan laporannya, kami akan mencari tahu dari mana Bundel Aplikasi Android berasal, dan apa kaitannya dengan Pengiriman Dinamis, berkenalan dengan plug-in Gradle baru, dan belajar bagaimana menghadapi kejutan yang telah disiapkan oleh para pengembang SDK untuk kami.
Tentang pembicara: Evgeny Saturov (
saturovv ) bekerja untuk Surf, sebuah perusahaan yang
berspesialisasi dalam pengembangan Android dan iOS khusus, dan baru-baru ini, pengembangan Flutter. Eugene Flutter adalah penggila dan pendiri FlutterDevPodcast.
Sebuah perjalanan singkat ke dalam sejarah
Dua tahun yang lalu, seorang pria yang luar biasa datang kepada kami di Surf dan berkata: “Kami memiliki teknologi yang sejauh ini hanya sedikit orang ketahui. Dan Anda memiliki pelanggan dan kasing yang menarik. Mari, kami akan memberi Anda teknologi kami, Anda mengintegrasikannya di suatu tempat, dan Anda mendapatkan simbiosis keren. Kami akan mempromosikan ini di Google I / O dan semua orang akan baik-baik saja. "
Bahkan,
bekerja dengan Program Akses Awal adalah babi di ladang . Anda harus bekerja dengan kode mentah, yang, tentu saja, tidak selalu berfungsi sebagaimana dimaksud dan dijelaskan. Dalam kasus kami:
- Semua artefak dikirim dalam bentuk arsip ZIP, yang harus diunduh setiap beberapa hari dari penyimpanan super rahasia dan diperbarui pada mesin lokal hanya secara manual.
- Anda hanya dapat bekerja di "kenari".
- Hampir tidak ada dokumentasi, hanya tersebar Google Docs tidak terstruktur, lebih sering mirip dengan aliran pemikiran pengembang.
- Menyebarkan dalam makanan, tentu saja, tidak mungkin - ini hanya mungkin setelah teknologi masuk ke rilis publik. Artinya, seluruh penyebaran hanya di jalur alpha.
- Kemungkinan setelah rilis publik, ternyata SDK telah sepenuhnya ditulis ulang tanpa dukungan kompatibilitas mundur. Anda mendapatkan antarmuka dan API yang sama sekali berbeda - Anda harus mengulang semuanya kembali.
Ini adalah ringkasan singkat tentang bagaimana kami berpartisipasi dalam Program Akses Awal.
Semua ini menjadi mungkin berkat mitra reguler kami - perusahaan Labyrinth - toko buku dan alat tulis online terbesar di Rusia. Mereka bergabung dengan proyek, bahkan tidak yakin apakah akan ada manfaat pada akhirnya. Dan fakta bahwa pada 2017 Surf, sebagai studio, adalah bagian dari Program Google Certified Agency. Sayangnya, program ini ditutup tahun ini.
Aplikasi Instan Android
Pada 2017, agar aplikasi dapat berjalan tanpa instalasi, itu harus digergaji ke dalam modul dengan benar.

Kami memiliki plugin Gradle baru yang menghasilkan artefak yang sesuai:
- Modul Aplikasi Instan - sebuah plugin aplikasi yang menghasilkan arsip ZIP dengan APK, satu untuk setiap modul fitur aplikasi;
- Installable App Module - Generated APK.
Hierarki dua tingkat dari modul fitur telah muncul. Selalu ada hanya satu modul fitur dasar dan berisi semua kode dasar yang tersedia untuk semua fitur, sumber daya, dependensi, dll. Modul Fitur tingkat atas berisi implementasi layar tertentu.
Tapi
itu panjang dan mahal karena sejumlah alasan:
- Struktur modular yang kaku per se adalah batasan besar. Sulit membayangkan bahwa perusahaan besar mana pun akan mengubah aplikasi yang sedang berkembang dan berfungsi sempurna menjadi setumpuk modul merokok selama bertahun-tahun hanya untuk mendukung teknologi baru yang masih belum diketahui apakah akan lepas landas atau tidak.
- Pembatasan ketat pada ukuran perakitan, yaitu, satu fitur tidak boleh melebihi 4 MB. Ini adalah batas yang obyektif kecil, dan kadang-kadang benar-benar tidak dapat dicapai, misalnya, karena ketergantungan berat atau sesuatu seperti itu.
- Pastikan untuk menggunakan AppLinks, karena ini adalah satu-satunya cara untuk masuk ke dalam Aplikasi Instan. Pengguna mengklik tautan dari mail, messenger, hasil pencarian dan sampai ke layar Anda melalui intersepsi tautan.
- Akhirnya, sejumlah besar keterbatasan teknis. Pada awalnya bahkan tidak mungkin menggunakan NDK. Anda tidak dapat mengirim pemberitahuan push, menerima data sensitif, mengubah pengaturan perangkat, dan memulai proses latar belakang. Layanan, Penerima Siaran, dan Penyedia Konten tidak dapat digunakan. Hanya Aktivitas.
Misi utama App Instan hanyalah demonstrasi dari UI dan tidak lebih. Refactoring sangat menyakitkan, dan karena itu kisah ini hampir tidak pernah ditemukan dalam produksi.
Namun secara adil, penerapan Aplikasi Instan di Labirin memberikan peningkatan pembelian 5% melalui klien seluler.
2019. Google Play Instan
Dua tahun telah berlalu, di halaman 2019 - Aplikasi Instan masih ada, tetapi bukan sebagai teknologi independen. Ini masih sangat jarang dalam produksi, saya belum sengaja mencarinya, tetapi saya hanya tahu beberapa contoh: Sports.ru, Vimeo. Tidak mungkin Google mengandalkan hasil seperti itu ketika mengumumkan teknologi ini.
Sekarang Aplikasi Instan disebut berbeda - Google Play Instan. Pergantian nama membantu menghilangkan dokumentasi yang tidak relevan. Jika Anda melihat Aplikasi Instan Android, segera jelas bahwa ini tidak lagi relevan.
Selain namanya, semuanya telah berubah, termasuk struktur modular.
Tuntutan menjadi lebih loyal . Teknologi ini terintegrasi dengan cara yang benar-benar berbeda ke dalam proyek dan tidak memerlukan refactoring yang menyakitkan, yang tentu saja baik.
Tetapi yang kurang jelas dan, menurut saya, jauh lebih penting adalah bahwa teknologi ini, yang masih sangat unik dan langka, telah menjadi nenek moyang dari seluruh keluarga teknologi, yang saat ini dipasoknya.
Awalnya, Google memposisikan Aplikasi Instan sebagai teknologi yang menarik orang ke bisnis, bukan aplikasi. Ada pedoman desain yang melarang aplikasi Landing dengan satu tombol “Unduh aplikasi lengkap”. Tetapi masalah mendasar lainnya diselesaikan secara sampingan, dan saya menduga ini terjadi secara tidak sengaja.
Pada bulan Februari tahun ini, perangkat luar biasa Samsung Galaxy S10 + dengan memori 1 TB terpasang. Coba pikirkan - satu terabyte! Mengapa Anda sangat membutuhkan ?!
Menurut statistik resmi Google, selama 7 tahun terakhir, ukuran rata-rata APK telah meningkat 5,5 kali.

Ukuran build sangat penting,
penelitian pada statistik ini menunjukkan:
- setiap tambahan 6 Mb unit mengurangi konversi dalam instalasi sebesar 1%;
- 70% pengguna memeriksa ukuran aplikasi sebelum mengunduh;
- 50% pengguna tertarik pada seberapa banyak ruang yang dibutuhkan aplikasi pada perangkat setelah instalasi.
Ini bahkan lebih penting jika audiens target Anda adalah orang-orang berusia lanjut, atau dengan pendapatan yang tidak terlalu tinggi, atau ini adalah pasar negara berkembang.
Yang terakhir ini semakin sulit untuk diabaikan, karena pada tahun 2018 India yang menunjukkan peningkatan instalasi yang luar biasa.

Harap dicatat bahwa ada sangat sedikit iOS, dan jumlah total pemasangan aplikasi Android melebihi gabungan di AS, Brasil, dan Indonesia.
Sekarang sudah jelas masalah apa yang bisa diselesaikan dengan Google Play Instan. Anda dapat pergi ke istilah yang tidak bisa dimengerti.
Bundel Aplikasi Android
Bundel Aplikasi Android - format baru untuk menerbitkan aplikasi di Google Play. Di dalam, semuanya tidak jauh berbeda dari APK: semua file dex, manifes, sumber daya, aset, dll. Yang sama dll. Tetapi ada Metadata, yang tidak sampai ke perangkat pengguna.

Metadata diwakili oleh tiga file: resources.pb, assets.pb, native.pb. Bahkan, ini adalah tabel korespondensi sumber daya yang ada di pengaturan perakitan dan konfigurasi perangkat.
Pengiriman Dinamis Android
Semua orang tahu tentang keberadaan Penandatanganan Aplikasi oleh Google Play. Tetapi tidak semua orang siap untuk menyimpan kunci rilis aplikasi mereka di Google Play, karena tidak akan ada jalan untuk kembali.
Keluar dari Aplikasi Menandatangani oleh Google Play tidak mungkin.Setelah pernah memberikan kunci rilis ke Google Play, maka Anda tidak pernah dapat menandatangani aplikasi Anda seperti sebelumnya, di sisi Anda. Tetapi sebagai gantinya, Anda dapat memanfaatkan sepenuhnya Bundel Aplikasi Android sebagai format. Dan proses penandatanganan perakitan sekarang akan terlihat sedikit berbeda.

Anda masih akan menandatangani rakitan sebelum rilis di Google Play, tetapi Anda akan menandatanganinya dengan kunci unggah, yang tidak unik. Itu dapat ditarik dari konsol, dirilis ulang jika dikompromikan atau hilang. Anda memberikan kunci rilis Anda ke konsol dan mengucapkan selamat tinggal padanya - Google sekarang akan menandatangani perakitan untuk Anda dan bersumpah bahwa itu akan menjaga kunci Anda aman.
Namun, jika Anda tidak memberikan kunci rilis ke Google Play, maka Anda tidak akan dapat menggunakan apa pun dalam proyek Anda yang akan dibahas lebih lanjut. Google mengencangkan sekrup, dan bahkan Aplikasi Instan, tanpa memberikan kunci, sekarang akan gagal untuk digunakan.
Faktanya, ini sama sekali tidak lucu, karena orang-orang yang membeli promosi Aplikasi Instan dan masuk ke keseluruhan cerita mem-refactored aplikasi mereka, tetapi untuk beberapa alasan mereka tidak dapat memberikan kunci mereka ke Google Play (atau departemen keamanan pasti menentang atau karena alasan obyektif lainnya) menemukan diri mereka dalam situasi di mana mereka tidak dapat lagi mendukung keputusan ini. Ratusan jam kerja sebenarnya dibuang ke tempat sampah.
2014. Split APK Dukungan Muncul di Android Lollipop
Karena kami bernostalgia hari ini, kami akan kembali lebih awal ke masa lalu - pada tahun 2014.
Saya masih ingat bagaimana pada NEXUS 5 saya, ponsel terbaik di dunia, perakitan Android Lollipop terbang dengan desain material yang luar biasa yang tampak seperti bom. Tetapi ada perubahan yang tidak diperhatikan oleh banyak orang - ini adalah dukungan untuk APK Split.
Split APK - mekanisme yang memungkinkan Anda untuk membagi aplikasi menjadi APK kecil dan, menginstal pada satu perangkat, membuatnya berperilaku sebagai satu aplikasi.
Ingat ini, dan lanjutkan.
Android Dynamic Delivery adalah format distribusi aplikasi baru di Google Play.

Kami dulu memiliki APK, sekarang Bundel Aplikasi Android muncul, sejauh alternatif. AAB bertindak sebagai generator inkubator APK yang sangat terpisah ini. AAB meluncurkan roti APK, yang kemudian dapat digunakan sebagai aplikasi biasa dengan menginstalnya secara paralel.
Mari kita lihat seperti apa APK itu.

Paling tidak, ini adalah APK dasar, yang memainkan peran yang sama seperti di Aplikasi Instan: ini adalah kode dasar, sumber daya dasar, dan logika bisnis yang digeledah di antara semua fitur.
Juga muncul:
- APKs, yang namanya mirip dengan awalan pengubah sumber daya grafis (baris teratas dalam diagram).
- Keluarga APK lainnya mengingatkan kita pada arsitektur prosesor.
- APK Pelokalan.
Sekitar dua tahun yang lalu, ketika grafik vektor tidak begitu luas, banyak aplikasi yang mengandung sebagian besar sumber daya raster, yang dipotong dengan kerapatan piksel yang berbeda pada layar. Perakitan bisa menjadi sangat berat. Pengguna mengunduh semua sumber daya ini, dan sebagian besar disimpan di perangkat dengan bobot mati.
Sekarang mekanisme semacam itu memungkinkan pengguna untuk hanya menerima serangkaian sumber daya yang diperlukan khusus untuk perangkatnya. Seseorang datang ke Google Play, memilih aplikasi, Google Play memahami karakteristik perangkat pengguna, dan memberikan set APK APK yang diperlukan - satu APK dari setiap kategori.
Jenis Pengiriman Dinamis APK:
- Satu dan hanya satu Base APK.
- Configuration APK adalah maksimal tiga jenis: res * x, aset * y, lib * z. Di sini: x adalah jumlah pengubah sumber daya yang digunakan; y adalah jumlah jenis arsitektur yang digunakan; z adalah jumlah lokalisasi bahasa. Jika, misalnya, proyek tidak menggunakan kode asli dan pustaka asli, maka tidak akan ada kategori yang terkait dengan kode asli, dan dua APK akan tetap.
- Fitur Dinamis Tanpa Batas APK.
Fitur Dinamis APK akan dibahas lebih terinci di bawah ini. Tapi pertama-tama, kami akan mengucapkan selamat tinggal pada blok Split.
Selamat tinggal Split
Anda dapat berargumen bahwa sebelumnya dimungkinkan untuk melakukan sesuatu yang serupa, secara manual menghasilkan banyak APK dengan sumber daya yang tepat, kemudian semuanya dikerahkan secara manual ke Google Play.
android { splits { density { enable true exclude "ldpi", "xxhdpi", "xxxhdpi" compatibleScreens 'small', 'normal', 'large', 'xlarge' } } }
Usaha ini sendiri agak diragukan, dan sekarang semua ini diabaikan begitu saja. Jika Anda membangun Bundel Aplikasi Android, sebuah blok Bundel muncul, yang memungkinkan Anda untuk menonaktifkan pemisahan proyek secara manual menjadi salah satu kategori.
android { bundle { language { enableSplit = false } density { enableSplit = true } abi { enableSplit = true } } }
Anda dapat menentukan bahwa aplikasi mendukung, misalnya, hanya Rusia atau hanya Inggris, dan lewati langkah ini selama perakitan.
Yang paling penuh perhatian, mungkin, sekarang berpikir tentang apa yang harus dilakukan dengan preLollipop. Hanya di Android 5 muncul dukungan untuk APK Split. Kita perlu entah bagaimana keluar dari situasi ini, karena Min SDK tidak berarti yang ke-21.
Untuk preLollipop, situasinya cukup canggung, tetapi hanya mungkin. Google Play mengumpulkan Multi-APK untuk preLollipop, yang mencakup semua jenis kombinasi APK konfigurasi. Hanya ada satu APK, tetapi ada banyak opsi.
Bundel Aplikasi Android Mengubah Kehidupan Kita
Dan sangat signifikan. Pertama, mungkin akan jauh lebih mudah untuk membangun sebuah proyek, terutama jika Anda terbiasa membangun APK Split. Tetapi menurut pengamatan saya tidak banyak orang seperti itu.
Kedua, Anda tidak lagi berisiko kehilangan atau membahayakan kunci rilis. Tidak akan ada tragedi besar, jika Anda kehilangan Kunci Unggah Anda, Anda dapat mengingat dan menerbitkannya kembali.
Kami tidak akan menunjuk jari - di bagian atas Google Play Rusia ada aplikasi yang memiliki kunci rilis untuk waktu yang lama di w3bsit3-dns.com, semua majelis kustom ditandatangani dengan kunci rilis, dan tidak ada yang bisa dilakukan dengan ini dalam lima tahun ke depan. Masih menunggu transisi ke Signing V3, yang muncul dengan hanya 28 API.
Keuntungan yang tidak diragukan dari Bundel Aplikasi Android: pengguna berhenti menghabiskan lalu lintas dan ruang disk pada sumber daya yang tidak mereka butuhkan. Ini sangat meningkatkan retensi aplikasi.
Tetapi jika Anda memiliki semua grafik dalam vektor, dua pelokalan dan tidak ada perpustakaan asli, maka manfaatnya akan mikroskopis.
Modul Fitur Dinamis
Modul Fitur Dinamis adalah modul fungsional yang tidak disediakan saat memasang aplikasi, tetapi diunduh dari Google Play dan diinstal hanya berdasarkan permintaan.
Modul semacam itu setara dengan APK dasar.

Adalah penting bahwa masing-masing modul fitur itu sendiri juga mengandung satu set konfigurasi APK Split. Dengan demikian, jumlah APK dapat meningkat melebihi batas. Tapi ini sama sekali bukan urusanmu, Google Play melakukan ini.
Aplikasi untuk Modul Fitur Dinamis:
Fitur yang digunakan oleh persentase yang sangat kecil dari audiens , tetapi tetap penting untuk produk Anda. Misalnya, ini adalah aplikasi hiburan konten, dan 95% penggunanya mengonsumsi konten. Tetapi ada sedikit sekali editor yang menghasilkan konten. Bagi mereka ada editor video keren yang benar-benar berat, bekerja sangat keren. Maka tidak masuk akal untuk mempertimbangkan perakitan untuk semua orang dan semua orang, Anda dapat memasukkan fitur ini ke Modul Fitur Dinamis, dan menyediakannya hanya untuk mereka yang membutuhkannya, mengunduhnya nanti.
Fitur berat yang tidak terkait dengan skenario penggunaan aplikasi utama. Misalnya, navigasi AR di layanan peta. Setiap fitur AR adalah yang paling banyak dimasukkan ke Modul Fitur Dinamis.
Fitur yang harus tersedia bagi pengguna tanpa menginstal aplikasi itu sendiri (misalnya, memilih produk dalam katalog dan melakukan pemesanan). Benar, ini adalah sesuatu yang sangat mencurigakan mengingatkan segalanya.
Android Instant Apps sekarang menjadi Modul Fitur Dinamis Diaktifkan Instan.
Dengan demikian, ternyata ada dua jenis Modul Fitur Dinamis:
- Modul Fitur Dinamik Umum adalah modul fungsi yang diunduh dan diinstal pada perangkat secara terpisah dari aplikasi utama. Mereka tinggal di sana selama aplikasi itu sendiri hidup. Sampai Anda menghapusnya, Modul Fitur Dinamis akan menjadi.
- Instant-Diaktifkan Dynamic Feature Module - modul fungsi yang tersedia untuk dijalankan tanpa menginstal pada perangkat. Modul ini hidup untuk waktu yang terbatas.
Jenis aplikasi kedua di Google Play dapat dibedakan dengan keberadaan tombol Coba. Ketika Anda mengkliknya, URL default diganti dan Anda dapat melihat bagaimana aplikasi terlihat setidaknya sebagai contoh dari satu fitur utama.
Ini sering ditemukan di bagian permainan. Ini nyaman dan bahkan lebih dapat diterapkan daripada aplikasi, karena Anda dapat mengunduh sebagian kecil permainan sebagai demo dan melihat apa itu semua, apakah layak untuk menghabiskan lalu lintas dan waktu Anda.
Struktur modular
Saya sudah mengatakan bahwa struktur modular telah disederhanakan. Mari kita lihat caranya.
Awalnya, kami memiliki struktur yang cukup mengerikan. Antara lain, ia memiliki modul kosong, misalnya, Modul Aplikasi Instan selalu kosong, tidak memiliki kode, tidak ada sumber daya, tetapi hanya file build.gradle dan hanya itu.
Para pengembang berpikir, mengapa kemudian menghasilkan modul tambahan hanya untuk mengumpulkan artefak dari jenis tertentu. Dan mereka menggergaji itu, dan fungsinya dipindahkan ke Modul Aplikasi.
Tetapi kemudian mereka melangkah lebih jauh dan berpikir - mengapa kita membutuhkan Modul Fitur Dasar? Ada beberapa masalah darinya, karena kami menginisialisasi semuanya di sana, dan ID Aplikasi-nya berbeda. Kruk berasal dari sini, misalnya, mentransfer ID Aplikasi dari Modul Aplikasi ke Modul Fitur Dasar, dan menggantinya sebagai ID Aplikasi nyata dari aplikasi sehingga semuanya melacak dalam Crashlytics, dll.
Hasilnya, ternyata begini.

Mereka meninggalkan Modul Aplikasi, terpasang di atasnya Modul Fitur - dan hanya itu!
Jangan sampaikan emosi saya ketika saya mengetahui hal ini. Orang-orang dari panggung besar mengatakan bahwa mereka memiliki teknologi keren: "Mari kita semua memotong aplikasi ke struktur ini!" Tetapi ini tidak bekerja selama 5 menit, tetapi bekerja dengan konsekuensi besar.
Pada 2017, memiliki aplikasi monolitik belum memalukan. Labirin itu hanya seperti itu, maka itu bahkan belum mencapai rilis publik, tetapi dalam versi beta. Pada saat kami terlibat dalam Program Akses Awal, sudah ada sekitar 90 layar di sana. Kami menghabiskan dua bulan tambahan untuk refactor, menguji dan memastikan bahwa semuanya benar-benar berfungsi.
Dan setelah itu mereka berkata:
"Kami terlalu pintar, itu bisa dilakukan dengan lebih mudah .
"Tapi kembali ke prosa.
Konfigurasi Gradle
Untuk mendukung konfigurasi baru, pertama-tama kita harus mendaftar semua Modul Fitur Dinamis dalam file build.gradle dari modul aplikasi di blok Android:
Setelah itu, dalam file build.gradle dari masing-masing Modul Fitur Dinamis, tulis ketergantungan pada modul aplikasi:
Pada prinsipnya, tidak ada yang rumit. Tetapi ada juga konfigurasi manifes.
Konfigurasi manifes
Dalam manifes modul aplikasi, kita dapat mengatur flag sebenarnya untuk menunjukkan bahwa setidaknya ada satu Fitur yang Diaktifkan Instan dalam aplikasi ini:
Jika bendera ini tidak ada, tidak mungkin untuk menyematkan dirinya di trek yang sesuai di Google Play.
Selain itu, ada juga konfigurasi manifes untuk setiap Modul Fitur Dinamis secara terpisah, di mana terdapat lebih banyak pengaturan:
Dua flag pertama sedikit saling eksklusif, karena
onDemand
adalah fitur dasar yang biasa, dan
instant
adalah fitur Installable yang sama.
Judul - nama teknis dari modul tersebut, yang menurut yang kemudian, setelah dikodekan dalam aplikasi kami, kami akan memompa modul ini dari Google Play.
Parameter
include
adalah parameter untuk preLollipop. Jika Anda mengaturnya ke false, maka pengguna preLollipops tidak akan pernah melihat fitur ini dan tidak akan dapat menggunakannya.
Konfigurasi proyek gradle
Kehidupan plugin instantapp dan plugin fitur cukup singkat tetapi bersemangat. Mereka bertahan kurang dari dua tahun. Sejak Maret tahun ini, mereka tidak lagi didukung.
Sekarang hanya ada satu Modul Fitur Dinamis yang kami gunakan:
apply plugin: 'com.android.dynamic-feature'
Konfigurasi proyek dalam modul aplikasi saja
Poin penting: semua pengaturan tentang tanda tangan (konfigurasi penandatanganan), perakitan (konfigurasi ProGuard), versionCode dan versionName hanya perlu dilakukan dalam modul aplikasi build.gradle.
Kalau tidak, mereka akan diabaikan. Hindari menentukan salah satu dari blok konfigurasi ini di file build.gradle dari modul fitur dinamis.
Google play instan
Sekarang kita memiliki yang berikut ini.
Persyaratan untuk struktur modular telah disederhanakan sebanyak mungkin. Ini benar-benar kabar baik bagi mereka yang belum terlibat. Sekarang Anda dapat mencoba, bahkan jika Anda memiliki aplikasi dengan strukturnya sendiri. Ini tidak akan memengaruhi Anda sama sekali, Anda hanya dapat memasang modul di atas, dan semuanya akan berfungsi dengan baik.
Pembatasan ukuran perakitan menjadi lebih loyal. Jika sebelumnya 4 MB, sekarang:
- Modul Fitur Dinamis pada umumnya tidak terbatas ukurannya;
- Modul Fitur Dinamis Diaktifkan Instan dapat memakan waktu hingga 10 MB.
Tetapi sekarang ada skala progresif.

Jika fitur Anda:
- lebih dari 10 MB, maka saya minta maaf;
- dari 4 hingga 10 Mb - dapat diakses oleh tombol "Coba" dari Google Play dan hanya itu;
- kurang dari 4 MB - semua cara untuk menarik pengguna ke modul Diaktifkan Instan tersedia (diluncurkan dari iklan, dengan tautan, dari pesan, dll.).
Muncul mekanisme untuk memuat modul - Play Core API. Hanya sedikit orang yang tahu bahwa Aplikasi Instan dulu diinstal melalui Chrome.
@Override public boolean maybeLaunchInstantApp(Tab tab, String url, String referrerUrl, boolean isIncomingRedirect) { if (tab == null || tab.getWebContents() == null) return false; InstantAppsHandler handler = InstantAppsHandler.getInstance(); Intent intent = tab.getTabRedirectHandler() != null ? tab.getTabRedirectHandler().getInitialIntent() : null; if (isIncomingRedirect && intent != null && intent.getAction() == Intent.ACTION_VIEW) { Intent resolvedIntent = new Intent(intent); resolvedIntent.setData(Uri.parse(url)); return handler.handleIncomingIntent(getAvailableContext(), resolvedIntent, ChromeLauncherActivity.isCustomTabIntent(resolvedIntent)); } else { ... } return false; }
Ini adalah kode nyata dari Chrome untuk Android, yang mencegat tautan ke Aplikasi Instan Anda, pergi ke Google Play dan menggantikan Aplikasi Instan dari sana. Jika Aplikasi Instan terdeteksi, entah bagaimana itu membuka aktivitas, dari mana Aplikasi Instan kemudian diluncurkan.
Karenanya ada masalah besar dengan menggulirkan fitur ini. Dengan Samsung, ini adalah cerita yang sama sekali berbeda, saya curiga bahwa browser bawaan mereka memiliki sedikit lebih banyak keistimewaan daripada Chrome. Aplikasi Instan tidak berfungsi di sana hingga yang terakhir.
Play Core Library memungkinkan Anda melupakan masalah pengiriman. Anda cukup mencolokkannya sebagai sebuah paket:
implementation 'com.google.android.play:core:1.4.0'
Dan unduh modul fitur yang Anda butuhkan dari Google Play.
Perpustakaan memiliki sintaks yang cukup fungsional yang memungkinkan Anda mengunduh modul satu per satu:
val splitInstallManager = SplitInstallManagerFactory.create(context)
Atau segera bungkus beberapa:
val request = SplitInstallRequest .newBuilder() .addModule("feature1") .addModule("feature2") .build()
Pendengar terputus:
splitInstallManager .startInstall(request) .addOnSuccessListener { sessionId -> ... } .addOnFailureListener { exception -> ... }
Perlihatkan ini di UI dan bereaksi terhadap fakta bahwa modul telah diinstal.
Play Core Library adalah awal yang baik:
- Akhirnya, Anda bisa berhenti berharap mungkin di hadapan Google Chrome.
- Anda dapat menunjukkan pemuatan modul pada UI seperti yang Anda inginkan.
- Dimungkinkan untuk memuat modul fitur dalam batch.
- Ada cara untuk secara fleksibel menangani kesalahan yang terjadi saat mengunduh dan memasang modul fitur.
- Anda bahkan tidak perlu me-restart aplikasi setelah fitur diinstal, karena ada
SplitCompat.install()
- panggil dan Anda dapat langsung mengakses kelas dari fitur yang baru diinstal langsung dengan cepat.
Tetapi saya akan menipu Anda jika saya mengatakan bahwa Play Core Library tidak akan membuat Anda menderita:
- Kode ini dikaburkan dan tidak didokumentasikan dengan cara apa pun.
- Acara dari semua sesi pemuatan aktif datang ke satu
SplitInstallStateUpdatedListener
- Anda perlu mengurutkannya secara manual. Diperlukan untuk menyimpan ID sesi di suatu tempat sebelumnya, yang akhirnya menghasilkan kode yang tidak terlalu indah. - Manajemen negara yang kikuk, redundan, dan penanganan kesalahan: 9 kemungkinan kondisi, 10 kemungkinan kesalahan. Kombinasi dari kesalahan dan status ini dapat diartikan berbeda, semua status dan kesalahan dikembalikan sebagai int.
- Tidak ada kemungkinan pengujian normal mengunduh dan memasang fitur pada perangkat lokal - ini tidak mungkin.
Satu-satunya opsi adalah menyematkan bangunan Anda di Google Play ke Saluran Pengujian Internal dan mencoba apa yang terjadi. Jika Anda menemukan beberapa jenis bug, kemudian mulai seluruh proses dari awal lagi, gunakan pembaruan dan coba lebih lanjut. Jika Anda ingin memeriksa cara kerjanya tanpa membangun, Anda mendapatkan kesalahan "-2" dan Anda hanya bisa menebak artinya. Ini adalah masalah paling umum di repositori dengan sampel resmi dari Google Dynamic Features.
Tidak ada praktik yang baik untuk menavigasi antara modul fitur. Dalam contoh resmi, yang menunjukkan bagaimana interaksi antara modul fitur terjadi, mereka menyarankan agar situasi diselesaikan dengan cukup sederhana: nyalakan ketergantungan dari satu modul ke modul lainnya. Setiap arah memiliki ketergantungannya sendiri, mengapa kembali?

Tetapi kemudian semua manfaat pemisahan menjadi modul hilang. Kami beralih ke modul jauh sebelum kebutuhan muncul untuk menyelesaikan masalah tersebut. Dan mereka melakukan ini sebagian karena menyederhanakan pekerjaan dengan basis kode untuk pengembang yang tidak berpengalaman yang, karena tidak berpengalaman, dapat menggunakan aktivitas penandatanganan dengan aktivitas dasar - kemudian mencarinya untuk tinjauan kode.
Jika Anda menghubungkan semua modul dengan dependensi ke atas dan ke bawah, maka hanya Google yang akan bagus dalam hal ini, yang tidak perlu memikirkan apa pun tentang navigasi.
Kami sudah lama berpikir apa yang harus dilakukan dengan ini, dan pada akhirnya kami menentukan solusi yang masih membuat saya menggigil. Ini disebut
Class.forName
- instantiating kelas menggunakan
ClassPath
penuh, yang dipecah oleh setiap nama kelas dari paket apa pun dari jalurnya, dll.
abstract class ActivityCrossFeatureRoute { override fun prepareIntent(context: Context): Intent? { try { return Intent(context, Class.forName(targetClassPath())) } catch (e: ClassNotFoundException) { Logger.e("Activity with the following classpath was not found in the current " + "application: ${targetClassPath()}. If this activity is the part of Dynamic Feature, " + "please check if this Dynamic Feature is downloaded and installed on the device" + "successfully.") } return null } }
Saya malu untuk memberitahu siapa pun tentang hal ini sampai saya pergi ke repositori aplikasi
Plaid dan melihat bahwa mereka telah menyelesaikan masalah navigasi dengan cara yang sama dan menyarankan semua orang untuk melakukannya di Stack Overflow.
Plaid adalah salah satu case show paling keren, dengan mereka Google mencoba semua tren terbaru, animasi keren, trik desain, komponen UI terbaru dan, khususnya, modularitas.
Banyak, benar-benar banyak bug, rekayasa, kekasaran. Anda tidak harus mencari bug untuk waktu yang lama.
- Akses ke sumber daya dari modul aplikasi hanya dimungkinkan di sepanjang jalur lengkap.
Alih-alih menulis seperti ini:
R.string.primaryColor
, Anda harus menulis seperti ini setiap kali dalam kode:
ru.appname.package.R.string.primaryColor
. Dengan cara yang berbeda, build tidak akan berfungsi, dan ini adalah
tautan ke pelacak isu resmi.
- Masalah dengan menjalankan JobScheduler di perangkat O +. Solusi resmi adalah untuk meluncurkan secara manual
TestJobSchedulerService
:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { Intent serviceIntent = new Intent(this, TestJobSchedulerService.class); startService(serviceIntent); }
- Kesalahan pembekuan manifes saat menghubungkan pustaka pihak ketiga, misalnya, Firebase, Fabric, paket AndroidX, dll.
Semuanya menggunakan ID aplikasi placeholder dalam manifes. ID Aplikasi salah dimasukkan di sana, karena manifes tidak membeku, Android Studio tidak dapat menemukan aktivitas default, dan Anda mencari masalah untuk waktu yang lama sampai Anda menemukan
saran di pelacak masalah resmi - mendefinisikan kembali semua penyedia dan menentukan ID Aplikasi Anda di sana.
<provider android:name="com.crashlytics.android.CrashlyticsInitProvider" android:authorities="ru.app.name.crashlyticsinitprovider" tools:replace="android:authorities" /> <provider android:name="com.google.firebase.provider.FirebaseInitProvider" android:authorities="ru.app.name.firebaseinitprovider" tools:replace="android:authorities" /> <provider android:name="androidx.core.content.FileProvider" android:authorities="ru.app.name.fileprovide" tools:replace="android:authorities" />
- Ketidakmungkinan beberapa dependensi pada paket pihak ketiga adalah salah satu poin favorit saya.
Misalkan dua modul fitur tergantung pada satu perpustakaan pihak ketiga. Tetapi Anda tidak dapat membuat ketergantungan langsung karena Anda mendapatkan:
org.gradle.api.GradleException: [:feature1, :feature2] all package the same library [com.lib.Name:VeryGoodLib]
.
Jawaban resmi : bagaimana jika dalam modul-modul ini berbagai versi perpustakaan ditunjukkan.
Pengembang menyarankan: menambahkan modul fitur ke hierarki, di mana tidak ada yang lain selain ketergantungan pada perpustakaan pihak ketiga, dan membuatnya bergantung pada dua modul fitur sumber.
- Cache panggilan InstantApps.isInstantApp (konteks) di attachBaseContext ().
Contoh kode dari dokumentasi untuk Pengembang Android
attachBaseContext()
, hanya karena mereka menawarkan
attachBaseContext()
untuk mengakses konteks melalui
this
, dan jika
context==null
, Anda bahkan tidak dapat memeriksa apakah InstantApps sedang berjalan atau tidak.
override fun attachBaseContext(base: Context) { super.attachBaseContext(base) if (!InstantApps.isInstantApp(this)) { SplitCompat.install(this) } }
ConstraintLayout
menampilkan ConstraintLayout
saat menggunakan Groups
dan Barriers
.
Bayangkan Anda telah melalui semua hal: merakit unit, menduga bahwa itu harus tertanam di saluran uji di Google Play, Google Play tidak menampilkan dialog merah. Dengan tangan gemetar, Anda memasang unit ini di perangkat, menginstal fitur, pergi ke layar - dan Anda melihat bahwa seluruh tata letak telah berkumpul di tumpukan di sudut kiri atas. Ini karena jika Anda menggunakan
Groups
dan
Barriers
, ada metode
getPackageName
luar
getPackageName
, yang karena beberapa alasan salah. Akibatnya, semua tampilan Anda tidak diposisikan. Semua kendala melayang, dan semuanya terletak di layar dengan sembarangan.
Akhirnya, setelah Anda mengatasi ini, Anda akan menemukan bahwa ...
Fitur Dinamis masih dalam Beta! Anda tidak bisa terjebak dalam produksi - Anda telah menjadi penguji gratis untuk Google selama ini!

Tapi tidak menurut Google. Jika Anda ingin menjadi satu, Anda dapat mengisi
Formulir Bunga dan mungkin Anda akan beruntung dan Anda akan diberikan akses untuk dikunci dalam produksi.
Dipercaya bahwa Aplikasi Instan kehilangan pertempuran ini. Tidak mungkin bahwa ini akan diumumkan di tahun-tahun mendatang, tetapi peningkatan aktivitas informasi di sekitar AMP secara diam-diam menegaskan hal ini.
Pikiran bahwa saya ingin mengingatkan Anda dan saya sendiri -
menulis untuk orang-orang . Berpikir tiga kali sebelum mengambil keputusan, terutama jika Anda mengembangkan alat yang akan digunakan pengembang lain. Setiap keputusan dan tindakan Anda akan memengaruhi seseorang dan, mungkin, memanjakannya sedikit darah.
Saya tidak ingin menyebabkan gangguan bagi seseorang.Tautan yang bermanfaat
Kami membuat program Saint AppsConf , yang sudah 21-22 Oktober di St. Petersburg, bahkan lebih penting dan beragam daripada di musim semi. Lihat itu!
Atau berlangganan buletin , telegram , fb - di sana kita berbicara tentang laporan individu dan persiapan untuk konferensi.