Arahan baru untuk pengembangan platform yang sudah akrab - selalu menarik. Di satu sisi, Anda memperluas basis klien, di sisi lain, Anda tidak berinvestasi dalam menciptakan perangkat lunak dari awal, tetapi menggunakan perkembangan yang ada. Tetapi jika arahnya benar-benar baru, dengan spesifiknya sendiri, maka tidak mungkin untuk mengelola dengan sangat sedikit darah. Pada pertemuan komunitas Mosdroid berikutnya di kantor kami, pengembang Arthur Vasilov
Arturka berbicara tentang adaptasi aplikasi Yandex ke sistem Android Go.
Rata-rata, jika Anda tidak menulis kalkulator, jam alarm, dll., Maka Anda sangat keren, dilakukan dengan baik dan melakukan semuanya dengan baik, atau aplikasi Anda membutuhkan 150-170 megabita.
- Nama saya Arthur, saya seorang pengembang Android, saya sedang mengerjakan aplikasi Yandex. Hari ini saya akan membagikan kepada Anda sebuah kisah tentang bagaimana kami beradaptasi dengan Android Go. Saya akan memberi tahu Anda jenis rake yang kami temui, apa yang tidak berhasil bagi kami dan bagaimana semuanya bekerja, mengapa itu diperlukan.
Penyimpangan kecil tentang semua ini. Android Go adalah versi khusus Android yang dirancang untuk perangkat berbiaya rendah. Harganya 60-100 dolar, dan karena itu mereka sangat lemah, lambat, melambat. Jadi Google memutuskan bagi mereka untuk membuat sistem mereka sendiri sehingga setidaknya mereka bekerja secara normal. Diumumkan di Google I / O pada 2017, yaitu, satu tahun dan beberapa bulan telah berlalu. Karena itu, ketika mitap diumumkan, pertanyaan logis muncul: "Apakah Anda masih hidup, atau apa?" Saya kemudian mengatakan bahwa semuanya baik-baik saja, semuanya baik-baik saja, saya akan katakan. Dan sekarang, sebagai pahlawan internet biasa, saya akan menjawab ex-post mengapa itu terjadi.

Apa yang sebenarnya terjadi? Google mengatakan: "Kami membuat sistem seperti itu." Lalu dia berkata: "Oke, kita perlu waktu untuk menyelesaikan" dan semua itu. Setelah itu, vendor selalu memiliki beberapa jenis penundaan dalam mengadaptasi versi ini untuk diri mereka sendiri. Dan versi baru bersama kami sudah dirilis tidak lebih awal dari setahun kemudian, jadi tidak ada yang mengejutkan di sini. Selain itu, mereka perlu memutuskan apakah akan melakukan hal seperti itu: mereka berbicara tentang perangkat murah dan tidak jelas apakah mereka akan mendapat untung dari mereka atau tidak. Selain itu, perangkat ini harus baru, harus dilakukan, belajar cara menjual, memahami cara kerjanya.
Smartphone pertama dengan Android Go muncul belum lama ini. Di suatu tempat di bulan April, penjualan mungkin dimulai, atau mungkin di bulan Mei. Ini adalah Nokia 1, dijual di mana-mana. Saya berbaring di sekitar sini. Sekarang, menurut saya, hanya ada sembilan smartphone seperti itu di pasaran, tetapi pada akhir tahun mereka menjanjikan lebih dari seratus. Dan pada prinsipnya, tidak ada pemain utama seperti Huawei, Samsung dan lainnya yang mengatakan kata-kata mereka, sehingga mereka akan menambahkan sesuatu yang lain, mereka tidak akan bisa menjauh dari pasar sebesar itu.
Sebelum laporan, saya pergi ke halaman Android Go dan melihat bahwa mereka membuat Android Pie Go Edition. Tetapi mereka tidak melakukan apa-apa di sana, mereka hanya mengurangi jumlah aplikasi yang terinstal dan berat mereka di muka. Mereka berkata: - "Anda sekarang memiliki dua kali lebih banyak ruang kosong." Dan alasan standar: perbaikan bug, peningkatan kinerja, semua hal. Tetapi setidaknya mereka memanggil, yang berarti mereka tidak lupa.
Apa keterbatasan perangkat ini, khususnya? Pertama, mereka memiliki 512 megabyte atau 1 gigabyte RAM, 8 atau 16 gigabytes penyimpanan. Jelas bahwa dalam kondisi seperti itu mereka sangat terhambat dan semua aplikasi normal pada mereka akan bekerja dengan cara yang kira-kira sama. Agar aplikasi dapat bekerja dengan kecukupan minimal, Google berkata, "Mari kenalkan persyaratan berikut." Mereka cukup logis, ikuti dari apa yang ada di slide sebelumnya.

Pertama-tama, itu adalah kinerja yang baik abstrak. Aplikasi Anda harus berjalan dengan baik dan cepat pada perangkat seperti itu. Kami adalah: βHebat. Kami sedang bekerja. "
Selanjutnya, ada nomor tertentu yang harus dipenuhi. Ruang yang ditempati setelah membongkar dan menginstal APK tidak lebih dari 40 megabita. Terkadang ini merupakan masalah karena seseorang dan APK memiliki semua 80 megabita. Itu akan menyakitkan. Selain itu, ini tidak dapat diambil dan diukur secara memadai. Artinya, Anda tidak bisa mengatakan: "Saya tahu bahwa APK saya sangat berbobot, jadi setelah instalasi aplikasi akan sangat banyak." Semua ini sangat tergantung pada vendor, versi perangkat, Android, dll. Tetapi jika APK Anda membutuhkan 10 megabita, maka, pada prinsipnya, semuanya baik-baik saja dan Anda tidak akan pernah melebihi angka ini.
Dan sekarang persyaratan yang paling menyenangkan dan keren: RAM yang dikonsumsi saat bekerja dengan aplikasi tidak boleh melebihi 50 megabyte.
Siapa yang tahu berapa banyak RAM yang dibutuhkan aplikasinya selama operasi? Siapa yang pernah bertanya-tanya tentang masalah ini? Apakah ada orang dengan kurang dari 100 megabita? Tampan Tapi mungkin Anda bohong. Secara umum, rata-rata, jika Anda tidak menulis kalkulator, jam alarm, dll, maka Anda sangat keren, dilakukan dengan baik dan melakukan semuanya dengan baik, atau aplikasi Anda membutuhkan 150-170 megabita. Memasukkannya ke dalam 50 megabita sangat sulit. Oleh karena itu, sisa waktu kita akan membicarakannya, kita akan membahas bagaimana cara membuat globe menjadi burung hantu, dll.

Apa yang termasuk dalam percakapan memori kita? Secara langsung diperlukan untuk memahami apa yang sebenarnya kita ukur, lalu apa cara terbaik untuk mengukurnya. Juga untuk perangkat Android Go ada kekhususan yang perlu dipertimbangkan, dan kami juga akan membicarakannya. Dan saya juga akan memberi tahu Anda beberapa hal umum, kiat umum yang mungkin tidak Anda duga, tetapi mereka benar-benar dapat memakan banyak memori dari Anda.
Pada tahun 2018, setelah Google I / O melanjutkan, Anda harus memulai cerita tentang memori dengan mengacu pada
laporan ini . Siapa yang menontonnya?
Bagus Semua 180 orang yang tersisa tahu apa yang harus dilakukan dalam waktu dekat. Menurut pendapat saya, ini adalah salah satu laporan terbaik di Google I / O. Bung mengatakan hal-hal yang sangat keren. Dia menceritakan semuanya di rak, baik, dan dengan banyak detail mendalam. Mereka yang menonton dan mengingatnya dengan baik mungkin akan memperhatikan bahwa saya menyalin beberapa hal dari sana, karena tidak mungkin sebaliknya, dia mengatakan semuanya, jadi saya akan mengulanginya.
Apa yang kita ukur? Ada yang namanya PSS (Proportional Set Size). Artinya, RAM di Android diwakili oleh sekitar 40 kilobyte blok, dan blok-blok ini dapat sepenuhnya menjadi milik aplikasi, atau menggeledah antara proses dan aplikasi.
Dan pertanyaannya adalah: bagaimana tepatnya memahami aplikasi mana yang menghubungkan memori bersama ini? Ada beberapa pendekatan, mereka cukup logis. PSS mengatakan bahwa jika memori meraba-raba antara proses N, maka kami akan menganggap bahwa aplikasi Anda memiliki 1 / N dari memori itu. Dan dengan cara yang persis sama ada Ukuran Set Hunian dan Ukuran Set Unik, yang mengatakan bahwa "Tidak ada memori bersama yang menjadi milik saya" dan "Semuanya milik". Pada prinsipnya, PSS adalah yang paling logis di sini.
Bagaimana tepatnya Anda bisa mengukur memori yang dikonsumsi? Semuanya sederhana di sini. Entah itu profiler di Android Studio, atau dumpsys. Tentu saja ada alat-alat lain. Mereka dapat memberi Anda hasil yang lebih rinci, sesuatu yang lebih rumit, tetapi masalahnya adalah untuk memahami hasil mereka, menggunakannya semua ini sangat, sangat sulit. Seringkali Anda membutuhkan root atau custom build Android. Dan pada umumnya Anda tidak membutuhkannya, dua alat pertama sudah cukup.

Saya tidak akan berbicara tentang profiler di Android Studio, saya pikir banyak orang yang menggunakannya. Siapa yang belum pernah menggunakan, pastikan untuk menyodok. Secara khusus, saya memberikan tautan di bawah ini - hanya artikel bagus dari dokumentasi dengan video, cara menggunakannya, dengan demo. Dan, pada prinsipnya, semuanya jelas. Ini menunjukkan ke mana memori Anda pergi, menunjukkannya secara real time. Satu-satunya hal yang perlu diingat adalah bahwa hal itu membebankan kesalahan tertentu yang timbul dari kenyataan bahwa kita terus-menerus mengukur memori ini. Tetapi mereka berada dalam batas yang dapat diterima.

Dumpsys adalah konsol sederhana yang tidak memerlukan apa pun dari Anda, hanya telepon dan adb yang terhubung. Dan Anda dapat menjalankan perintah ini: panggil dumpsys meminfo, berikan paket itu, dan itu akan mengembalikan sesuatu seperti ini kepada Anda. Dan jika kita tertarik pada seberapa banyak konsumsi aplikasi kita, maka kita dapat melihat secara khusus pada TOTAL, yang mengatakan bahwa "aplikasi Anda memakan sekitar 168 megabyte." Banyak, tetapi apa yang harus dilakukan?

Ini juga menunjukkan Anda rincian persis berapa banyak memori yang dibutuhkan dalam memori ini dikonsumsi. Ada berbagai bagian di sini, mereka kompleks, kita akan membicarakannya lebih lanjut, tetapi untuk sekarang kita dapat melihat hal utama - ini adalah Java Heap, objek Java kita, dan semuanya lebih rumit.
Apa lagi yang penting? Memori adalah hal yang sangat sensitif untuk semua jenis pengujian dan semua jenis kondisi eksternal. Artinya, semua tes Anda harus melakukan sebanyak mungkin dalam kondisi yang sama. Jelas bahwa ini idealnya harus menjadi satu perangkat, karena memori tergantung pada versi Android. Cukuplah mengingat perbedaan antara merangkak dan balita. Itu tergantung pada ukuran atau resolusi layar, karena semakin besar ukuran layar, semakin banyak konten yang terpecah, semakin banyak memori yang Anda butuhkan untuk menggambar semuanya. Semakin besar resolusinya, semakin banyak piksel yang ditempati bitmap Anda, dan semakin banyak memori yang diperlukan untuk menyimpannya.
Skenario aplikasi juga memengaruhi tes. Anda dapat membaca teks atau menggulir galeri dengan banyak gambar. Dan jelas di mana akan ada lebih banyak memori.
Hal penting lainnya adalah beban pada perangkat. Yaitu, Anda dapat memiliki semuanya sama, tetapi dalam satu kasus aplikasi Anda adalah satu-satunya yang berfungsi untuk Anda, dan dalam kasus lain Anda memiliki banyak aplikasi yang melakukan sesuatu di latar belakang, mengunduh sesuatu, menghapusnya, bekerja di latar depan , dan pada saat yang sama memori Anda hanya diperas, karena Anda perlu memberikannya ke aplikasi lain. Karena itu, idealnya, lebih baik untuk mengambil dan pertama-tama membunuh semua aplikasi lain yang berfungsi, bukan milik Anda. Semua yang bisa Anda raih, lalu bunuh. Hanya dalam kasus ini, dan PSS pasti akan berterima kasih, karena tidak akan perlu mencari-cari memori antara proses.

Anda dapat, misalnya, mengambil dan melihat informasi saat ini di memori bebas, pada memori yang ditempati. Dia akan membawa Anda sesuatu seperti tanda yang mengatakan, "Di sini saya memiliki begitu banyak memori bebas, begitu banyak memori yang tersimpan, begitu banyak memori yang tersimpan." Dan jika Anda memiliki memori bebas 200-250 megabita untuk kekasih Anda di sana, maka ini bagus, kemungkinan besar, maka tidak ada yang akan mempengaruhi tes Anda.
Mungkin seseorang sekarang memiliki pertanyaan, "Mengapa saya membutuhkan semua ini?" Ini adalah pemutus di mana saya juga akan mengatakan motivasi untuk semua ini.
Pertama, bahkan jika Anda tidak akan melakukan apa pun di Android Go sekarang dan berpikir bahwa itu sudah mati, itu mungkin berkembang, datang kepada Anda, dan pada titik tertentu Anda harus berurusan dengan semua ini.
Hal kedua yang saya anggap sangat penting adalah Anda hanya bisa melakukan tes regresi dari memori. Artinya, Anda cukup menulis skrip yang akan menjalankan aplikasi, melakukan dumpsys, melakukan pengukuran seperti itu, dan menonton bagaimana indikator ini berubah di antara rilis. Skrip semacam itu dapat ditulis dalam beberapa jam, infrastrukturnya dapat diatur lebih lama, tetapi menurut saya ini adalah hal yang baik.
Jika kita berbicara tentang spesifikasi Android Go - poin ketiga kita dalam pertarungan melawan memori - maka ada kabar baik. Pertama, tidak ada yang benar-benar mengharuskan Anda untuk mengikuti batasan ini. Artinya, Anda dapat menggunakan aplikasi apa adanya, meletakkannya di perangkat dengan Android Go, dan semuanya baik-baik saja. Masalahnya adalah bahwa pengguna sangat mungkin untuk menghapus Anda karena Anda mengambil banyak ruang. Aplikasi Anda juga dapat berjalan lambat dan memiliki banyak memori, ya. Namun sejauh ini belum ada yang melarangnya, karena jika tidak maka tidak akan ada aplikasi selain aplikasi Google di Android Go. Tetapi jika hal ini berkembang lebih lanjut, banyak yang akan beradaptasi dengan kondisi seperti itu, maka, pada akhirnya, aplikasi Anda dapat dengan mudah diturunkan dalam penerbitan Android Go, atau Anda dapat menunjukkan Lansiran bagaimana pengguna menginstal aplikasi pada smartphone Android Go mereka. : "Sobat, aplikasi ini tidak bekerja dengan baik dengan Android Go. Mungkin Anda tidak akan mengatakannya? "
Ada hal lain - Anda dapat secara manual mengecualikan perangkat Android Go dari Google Play, yaitu, mengatakan bahwa aplikasi tidak dapat diinstal pada perangkat Android Go. Itu muncul belum lama ini.
Dan Google juga cukup pintar, dan 50 megabita yang terdengar dalam judul laporan itu bukan angka yang tetap, itu tergantung pada resolusi perangkat, pada ukuran layar, dan, terlebih lagi, pada jenis aplikasi. Sebagai contoh, game dialokasikan lebih banyak, menurut saya, 115 megabyte. Pada prinsipnya, ini bisa dimengerti.

Bagaimana jika kita berbicara langsung tentang tes ini? Ada satu hal lagi, yang secara khusus sangat memprihatinkan kita - bekerja dengan preset. Ketika vendor membuat ponsel baru, mereka sering meletakkan di sana beberapa set aplikasi yang sudah diinstal sebelumnya. Secara khusus, kami sangat terlibat dalam hal ini, dan masalahnya adalah mereka menjalankan hal-hal seperti Compatibility Test Suite. Ini adalah tes google, mereka menjalankannya. Dan di sana, jika aplikasi Anda tidak sesuai dengan 50 megabyte ini, maka semuanya buruk, dan aplikasi Anda tidak dapat diinstal sebelumnya pada perangkat tersebut.
Sayangnya, tes yang dilakukan Google bukan dari open source, saya tidak bisa memberi tahu mereka, mereka berada di bawah NDA, tetapi pengembang yang baik dari Google menulis artikel seperti itu tentang Android Go, dan di sana, pada prinsipnya, ada rekomendasi yang cukup baik
Artinya, semuanya basi. Kami meluncurkan aplikasi. Kami menunggu 5 detik untuk semuanya dimuat. Kami melakukan dumpsys, menulis nilai TOTAL, mengeksekusi beberapa kali, kami mendapatkan hasilnya. Semuanya sangat sederhana dan biasa.

Satu-satunya hal adalah, mereka tidak memperhitungkan fitur sekecil itu di artikel mereka, atau, mungkin, tidak membicarakannya - ada yang namanya bekerja di proses lain, dan mereka sering melakukannya untuk bertarung termasuk konsumsi memori.
Siapa yang percaya ini bagus untuk Android Go? Dan siapa yang berpikir ini buruk? Dengan berani.

Masalahnya adalah, ya, ini buruk, karena pada akhirnya, memori aplikasi Anda yang dikonsumsi dihitung di semua proses. Jika kita membuat proses kosong tanpa apa-apa dan mengambil dumpsys dari proses khusus ini, kita akan melihat bahwa dibutuhkan 7 megabita. 5-8 megabita - ini merupakan overhead dari proses penciptaan. Karena itu, ketika kita berjuang untuk setiap megabyte untuk memeras semuanya menjadi 50, maka hal seperti itu diberikan kepada kita dengan sangat buruk. Secara khusus, katakanlah Yandex memiliki perpustakaan Yandex.Metrica paling populer, ia juga bekerja dalam proses yang berbeda, dan ini juga dapat memberi kita rasa sakit.

Karena itu, jika beberapa perpustakaan eksternal mendatangi Anda, misalnya, Anda dapat dengan mudah mengatakan: "Bung, silakan bekerja dalam proses utama. Saya setuju bahwa ini mungkin lebih lambat, tetapi itu tidak akan memakan memori yang tidak perlu. " Jadi ini juga merupakan titik yang halus.

Jika kita berbicara tentang konsumsi memori, maka mari kita beralih ke piring ini, yang ada di sana. Kami mengambil proyek kosong, dan menjalankan dumpsys ini, memulai bisnis ini, dan kami melihat bahwa 23 megabyte dari 50 sudah diambil. Kosong "Halo, dunia!" tanpa apa-apa, cukup aktifkan dengan teks. Sudah mulai sedih. Itu menjadi lebih menyedihkan ketika kita menyadari bahwa kita dapat secara langsung mempengaruhi parameter seperti Java Heap, yaitu, ini adalah objek Java kita secara langsung, yang dapat kita lacak secara eksplisit, yang dapat kita hapus, kurangi, dan setidaknya berinteraksi dengan suatu cara.
Dan sulit untuk berinteraksi secara normal dengan semua ini, karena ini adalah kode kerangka kerja apa pun dan langsung dari Jawa Anda tidak memiliki alat normal untuk memahami bagaimana semua ini digunakan. Tetapi kabar baiknya adalah bahwa kita dapat mempengaruhi semua ini secara tidak langsung, jadi mari kita bicara tentang apa yang ada di sana.

Apa itu Java Heap bisa dimengerti. Apa itu Native Heap juga cukup logis untuk diasumsikan. Ini adalah alokasi yang sama, hanya yang positif. Mereka berasal dari kerangka kerja dan dari perpustakaan asli Anda, file .so, dan banyak lagi.
Kode secara langsung terkait dengan penyimpanan kode. Ini adalah ukuran .dex Anda, ini .so Anda, ini adalah sumber daya, file mmap dan semua itu. Artinya, semakin sedikit kode, semakin baik. Kebenaran paling sederhana yang bekerja secara umum tentang segalanya.
Stack adalah tumpukan thread Java / C ++. Artinya, setiap utas memiliki tumpukan panggilannya sendiri, sehingga setiap utas menciptakan area memori spesifik untuk menyimpan semua ini.
Grafik adalah rendering UI. Ada bitmap tersimpan sebagian yang ditarik, dan apa yang terhubung dengannya.
Pribadi lainnya, Sistem - ini adalah sesuatu yang tidak dapat kita pengaruhi sama sekali, dan, pada kenyataannya, segala sesuatu yang tidak terlalu dikategorikan.

Jika kita berbicara tentang perpustakaan asli, maka, katakanlah Anda dapat mengambil aplikasi kosong ... Anda dapat mengambil aplikasi yang biasa kita miliki dan mengambil dumpsys dari itu, memastikan bahwa dibutuhkan 146 megabita. Dan jika Anda pergi dan memotong sesuatu ... khususnya, saya mengambil dan menggergaji dua perpustakaan asli terbesar, yang kami miliki total 15 megabyte, dan mengambil dumpsys setelah itu, Anda dapat dengan mudah melihat bahwa kami telah kehilangan konsumsi dari Native Heap dan dari kode. Yaitu, dengan gerakan sederhana seperti itu, kami menyelamatkan diri sekitar 35 megabita. Tidak cukup buruk.

Streaming. Mari kita lakukan tes termudah. , , , new Thread(), sleep , . , . , , Java-. Java- , .

, , , . . systrace, id , ps , .
ThreadFactory, , , , , , 100 .
? : , , , , , . Bagus
, , , . , , , -, APK, .dex, .so, , .
. , , , . , ? β β , . , , . . β .

dumpsys, , , . , , View, WebView, Assets, .

, , , , , SharedPreference SQLite - , , , .

, , Assets. , , β . 1,5 . -, , . .

β WebView. , WebView, , dumpsys, 100 , . , , - , , 300 β . , WebView , . -.

Google . . WebView, Google, - . WebView. .

Google Go, Android Go-. , - layout , . , , , Chrome Tabs, Chrome . .
Android Go, ? , Android Go, .

Ada beberapa cara. -, , , Android Go . , , . , , , - build , - , , - . APK, , β uses-feature Β«low-memoryΒ», APK.
, , Android Go. Google. , , Go- .
, ? , , - , : Β«, - . Β». . , , , , , - , , - . , , , , Google, Google , . , , , Android Go , , .
, , , -. .

, Google I/O: , - . , , , , , - , . , Β« , . Β». . , . , .
? , . β , , 98% . , , , . . - Android Go-. , YouTube Go . YouTube , , , . Saya tidak tahu. , Android Go , , , β . β Facebook Lite, Twitter Lite, . Lite, - . -, , . Facebook, . , , . , β , Android Go.
?
Stack Overflow, 1000 . . , , , . , , β dumpsys.
, Android , 512 , Android 4.4.
API , .
, . , . β , .
, : Β« Β». : «». . β , . - 170 . . - . ? , , , , - . - β . 105 . .

. build- -. densitySplit, , resConfig, . , , β . ProGuard . , ProGuard , , , , , stacktraces.
. , , Android Go- .
- 64 . : Β«, Β». 14 , 4 , 60 . , . . , . β , , , , . , , , Android Go, . 10 , APK , , . , , .
Jadi solusi terbaik adalah aplikasi kedua. Namun, beberapa orang akan menghabiskan sumber daya untuk itu, sementara keuntungan nyata tidak jelas. Mungkin ceritamu tidak akan begitu sedih, karena aku masih memiliki sedikit usaha, aku akan mendaki, tetapi aku sudah tak tertahankan. Tapi cerita seperti itu. Pada nada yang relatif positif ini, Anda mungkin dapat menyelesaikannya. Terima kasih semuanya.