CLOUSD
Buka akun
Testing aplikasi

Tes aplikasi di berbagai versi Android

Versi demi versi, apa yang berubah bagi aplikasi Anda dari Android 12 sampai 17, cara mencoba perilaku yang bergantung pada target sebelum menaikkan targetSdkVersion, dan checklist untuk setiap rilis.

Android merilis versi besar setiap tahun, dan setiap rilis mengubah perilaku yang diandalkan aplikasi Anda. Menguji aplikasi di berbagai versi Android bukan soal menginstal APK yang sama di enam ponsel lalu mengecek apakah aplikasinya bisa dibuka. Intinya adalah mengetahui perubahan mana yang sampai ke aplikasi Anda di rilis mana, dan kenapa build yang sama bisa berperilaku berbeda di dua rilis.

Panduan ini memetakan Android 12 sampai 17 untuk developer aplikasi: apa yang berubah, cara menguji setiap perubahan dengan adb, dan cara mencoba perilaku yang bergantung pada target sebelum Anda menaikkan targetSdkVersion.

Dua sumbu, bukan satu

Setiap perubahan perilaku di Android termasuk salah satu dari dua kelompok. Perubahan untuk semua aplikasi berlaku begitu perangkat menjalankan rilis baru, apa pun target aplikasi Anda. Perubahan yang bergantung pada target hanya berlaku jika targetSdkVersion Anda setidaknya sama dengan level API rilis tersebut.

Itu memberi Anda dua sumbu. Versi perangkat menentukan kelompok pertama, target Anda menentukan kelompok kedua. Izin notifikasi di Android 13 menunjukkan kenapa keduanya penting. Aplikasi yang menargetkan API 32 atau lebih rendah mendapat permintaan izin dari sistem begitu punya channel notifikasi dan memulai sebuah activity. Aplikasi yang menargetkan 33 harus meminta izin itu sendiri, pada saat yang dipilihnya. Kodenya sama, tetapi alur saat aplikasi pertama kali dibuka berbeda.

Jadi matriksnya adalah versi yang dipakai pengguna Anda, dikali target Anda saat ini, ditambah satu kolom untuk target yang akan Anda tuju.

Sekilas Android 12 sampai 17

VersiLevel APIPerubahan yang paling sering merusak aplikasi
1231 (12L adalah 32)android:exported wajib eksplisit; flag mutabilitas PendingIntent; tidak boleh memulai foreground service dari latar belakang; lokasi perkiraan; splash screen sistem
1333izin POST_NOTIFICATIONS; izin media granular menggantikan baca penyimpanan; photo picker; bahasa per aplikasi
1434akses sebagian "Pilih foto"; tipe foreground service wajib; exact alarm mati secara default untuk instalasi baru; flag export untuk receiver runtime; target di bawah 23 tidak bisa diinstal
1535edge-to-edge diwajibkan; perangkat dengan halaman memori 16 KB; target di bawah 24 tidak bisa diinstal; animasi predictive back untuk aplikasi yang ikut serta
1636opt-out edge-to-edge diabaikan; predictive back aktif secara default, onBackPressed() tidak lagi dipanggil; batasan orientasi dan ukuran diabaikan di layar besar
1737Google sudah menyatakan opt-out sementara untuk layar besar dari versi 16 berakhir di rilis berikutnya; baca daftar lengkap perubahan perilaku sebelum menaikkan target

Notifikasi (Android 13)

Di 13 ke atas, notifikasi mati sampai pengguna mengizinkannya. Uji tiga jalur: izinkan, tolak, dan tolak dua kali, setelah itu sistem berhenti menampilkan dialog dan aplikasi Anda harus mengarahkan pengguna ke pengaturan. Lalu uji di 12, yang tidak punya permintaan izin, supaya onboarding tidak meminta izin yang tidak ada di sana.

Ganti status izin di antara percobaan:

adb shell pm revoke com.example.app android.permission.POST_NOTIFICATIONS
adb shell pm grant com.example.app android.permission.POST_NOTIFICATIONS
adb shell dumpsys package com.example.app | grep POST_NOTIFICATIONS

Mencabut izin tidak memunculkan lagi dialog awal jika pengguna sudah menolak dua kali. Untuk melihat alur yang dilihat pengguna baru, uninstall lalu instal ulang.

Foto dan media (Android 13 dan 14)

Aplikasi yang menargetkan 33 tidak bisa lagi membaca media dengan READ_EXTERNAL_STORAGE. Sebagai gantinya, aplikasi meminta READ_MEDIA_IMAGES, READ_MEDIA_VIDEO, atau READ_MEDIA_AUDIO. Android 14 menambahkan jawaban ketiga pada permintaan akses foto dan video: pengguna bisa membagikan hanya item yang dipilihnya. Aplikasi lalu mendapat izin READ_MEDIA_VISUAL_USER_SELECTED, hanya melihat file-file itu, dan sebaiknya menawarkan cara untuk mengubah pilihan, bukan menganggap punya akses ke seluruh galeri.

Jalur yang lebih bersih adalah photo picker, yang sama sekali tidak butuh izin. ActivityResultContracts.PickVisualMedia membuka picker sistem jika tersedia dan beralih ke ACTION_OPEN_DOCUMENT jika tidak. Di Android 11 dan 12, picker datang lewat update sistem Google Play, jadi sebuah ponsel bisa punya salah satu dari kedua jalur. Catat isPhotoPickerAvailable() di setiap ponsel dan pastikan alurnya berfungsi di kedua jalur.

Isi galeri sebelum menguji, karena picker yang kosong menyembunyikan bug tata letak:

adb push sample-photos/ /sdcard/Pictures/

File yang di-push ke penyimpanan bersama biasanya muncul di MediaStore dalam hitungan detik. Jika tidak, buka ulang picker-nya.

Pekerjaan latar belakang (Android 12, 14, dan 15)

Tiga perubahan membuat bug latar belakang muncul di versi yang berbeda-beda. Sejak 12, aplikasi di latar belakang tidak bisa lagi memulai foreground service di luar daftar pengecualian yang pendek; panggilannya melempar ForegroundServiceStartNotAllowedException. Sejak 14, aplikasi yang menargetkan 34 wajib mendeklarasikan foregroundServiceType untuk setiap foreground service, ditambah izin yang sesuai seperti FOREGROUND_SERVICE_DATA_SYNC, atau start-nya gagal. Sejak 15, foreground service dataSync di aplikasi yang menargetkan 35 mendapat sekitar enam jam per hari, lalu callback timeout.

Exact alarm juga berubah. SCHEDULE_EXACT_ALARM muncul di 12, dan di 14 izin ini tidak lagi diberikan secara default ke aplikasi yang baru diinstal dan menargetkan 13 ke atas. Panggil canScheduleExactAlarms() dan tangani hasil false.

Paksa kondisinya alih-alih menunggunya. Tiga baris pertama memasukkan ponsel ke mode doze dan aplikasi Anda ke standby bucket yang rendah; jalankan skenarionya, lalu pulihkan dengan dua baris terakhir:

adb shell dumpsys battery unplug
adb shell dumpsys deviceidle force-idle
adb shell am set-standby-bucket com.example.app rare
adb shell dumpsys deviceidle unforce
adb shell dumpsys battery reset

Edge-to-edge dan navigasi kembali (Android 15 dan 16)

Aplikasi yang menargetkan 35 menggambar di belakang status bar dan navigation bar di Android 15, entah memintanya atau tidak. Inset yang tidak ditangani menaruh toolbar di bawah status bar, tombol di bawah bar gestur, dan teks di bawah cutout. Android 15 masih menghormati atribut opt-out. Di 16, aplikasi yang menargetkan 36 kehilangan opsi itu.

Uji setiap layar dengan kedua mode navigasi, karena navigasi tiga tombol menyisakan bar yang lebih tinggi sehingga butuh padding lebih besar. Di build berbasis AOSP, Anda bisa mengubahnya dari adb; di build lain, gunakan Setelan, Sistem, Gestur:

adb shell cmd overlay enable-exclusive --category com.android.internal.systemui.navbar.threebutton
adb shell cmd overlay enable-exclusive --category com.android.internal.systemui.navbar.gestural

Predictive back mengambil jalur serupa. Di 13 dan 14 fitur ini ada di balik opsi developer. Di 15 animasi sistemnya berjalan untuk aplikasi yang ikut serta dengan android:enableOnBackInvokedCallback. Di 16, aplikasi yang menargetkan 36 mendapatkannya secara default dan onBackPressed() tidak lagi dipanggil. Telusuri kode Anda sebelum menaikkan target:

grep -rn "onBackPressed\|KEYCODE_BACK" app/src/main

Pindahkan setiap temuan ke OnBackPressedCallback, lalu uji gestur kembali dari setiap layar, termasuk dialog dan bottom sheet.

Android 16 juga mengubah perilaku di layar besar. Di layar dengan lebar terkecil 600 dp atau lebih, aplikasi yang menargetkan 36 kehilangan kunci orientasinya dan resizeableActivity="false". Android 16 menawarkan opt-out sementara, dan Google sudah menyatakan opt-out itu berakhir di rilis berikutnya, jadi bersiaplah opsi itu hilang begitu Anda menargetkan 37. Jika aplikasi Anda mengunci orientasi potret, uji di layar besar sebelum menaikkan target.

Halaman memori 16 KB (Android 15)

Android 15 menambahkan dukungan untuk perangkat yang memakai halaman memori 16 KB, bukan 4 KB. Aplikasi dengan kode native harus menyelaraskan library-nya untuk itu, dan sejak November 2025 Google Play mewajibkan dukungan 16 KB untuk aplikasi baru dan update yang menargetkan Android 15 ke atas. Cek ukuran halaman sebuah ponsel dan build Anda:

adb shell getconf PAGE_SIZE
zipalign -c -P 16 -v 4 app-release.apk
llvm-objdump -p lib/arm64-v8a/libfoo.so | grep LOAD

Segmen LOAD seharusnya menampilkan align 2**14. Android Gradle Plugin 8.5.1 ke atas menyelaraskan library yang tidak dikompresi di dalam APK, dan NDK r28 ke atas mengompilasi dengan penyelarasan 16 KB secara default, jadi biang masalahnya biasanya library pihak ketiga yang sudah jadi. Ponsel yang melaporkan 4096 tidak memberi tahu apa pun tentang perilaku 16 KB; jalankan pengecekan itu di system image emulator 16 KB.

Coba perubahan yang bergantung pada target sebelum menaikkan targetSdk

Anda tidak perlu menaikkan targetSdkVersion untuk melihat sebagian besar perilaku yang bergantung pada target. Framework kompatibilitas Android memungkinkan Anda mengaktifkan perubahan satu per satu untuk build yang bisa di-debug:

adb shell dumpsys platform_compat | grep -i edge
adb shell am compat enable CHANGE_NAME com.example.app
adb shell am compat reset CHANGE_NAME com.example.app

Sakelar yang sama ada di Opsi developer, di bagian Perubahan Kompatibilitas Aplikasi. Aktifkan satu perubahan dalam satu waktu dan jalankan smoke test Anda. Setelah daftarnya bersih, naikkan target di sebuah branch dan jalankan matriks lengkap.

Di mana menjalankan matriksnya

Sebagian besar tim memakai tiga jenis perangkat. System image emulator tersedia untuk setiap level API dan gratis, sehingga tepat untuk instrumentation test dan pengujian di semua level API di CI. Cloud phone memberi Anda setiap rilis di model ponsel asli dan menyimpan status di antara sesi: Clousd menjalankan Android 12 sampai 17 di 150+ model, dan ponsel bisa di-reset ke kondisi baru di antara run. Ponsel fisik tetap menjadi acuan untuk kamera, sensor, grafis, dan perilaku khas vendor.

Daftar model menunjukkan model apa saja yang berjalan di cloud, dan halaman testing aplikasi menunjukkan cara menyambungkan matriks ke CI. Baru mengenal ponsel jarak jauh? Mulailah dengan tes aplikasi Android online, dan baca penjelasan emulator Android cloud untuk perbandingan image emulator dengan model asli.

Checklist untuk setiap rilis

  • Instal build saat ini di rilis baru dengan target saat ini: bisa terpasang, bisa dibuka, dan bertahan saat proses dimatikan.
  • Baca halaman "behavior changes for all apps" dan uji setiap poin yang menyentuh fitur Anda.
  • Pertama kali dibuka tanpa izin apa pun, lalu tolak setiap izin bergantian.
  • Notifikasi: waktu permintaan izin, penolakan, dan tautan ke pengaturan.
  • Media: photo picker, akses sebagian, galeri kosong.
  • Latar belakang: foreground service, exact alarm, doze, dan standby bucket.
  • Tata letak: inset di kedua mode navigasi, cutout layar, skala font 1.3, mode gelap.
  • Kembali: gestur kembali dari setiap layar, dialog, dan bottom sheet.
  • Kode native: penyelarasan 16 KB untuk setiap library.
  • Naikkan target di sebuah branch, baca "behavior changes for apps targeting" level baru, lalu ulangi.

Siap menjalankan
cloud phone pertama Anda?

Coba gratis 30 menit

Tanpa kartu