Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

Perubahan perilaku: semua aplikasi

Platform Android Q mencakup perubahan perilaku yang dapat memengaruhi aplikasi Anda. Perubahan perilaku berikut berlaku untuk semua aplikasi ketika dijalankan pada Android Q, terlepas dari targetSdkVersion. Sebaiknya Anda menguji aplikasi, lalu memodifikasinya sesuai yang diperlukan untuk mendukung perubahan ini dengan tepat, jika memungkinkan.

Pastikan untuk juga meninjau daftar perubahan perilaku yang hanya memengaruhi aplikasi yang menargetkan Android Q.

Pembatasan antarmuka non-SDK

Untuk membantu memastikan stabilitas dan kompatibilitas aplikasi, platform akan mulai membatasi antarmuka non-SDK yang dapat digunakan aplikasi Anda pada Android 9 (API level 28). Android Q mencakup daftar terbaru antarmuka non-SDK yang dibatasi berdasarkan kolaborasi dengan developer Android dan pengujian internal terbaru. Tujuan kami adalah memastikan bahwa alternatif publik tersedia sebelum kami membatasi antarmuka non-SDK.

Jika Anda tidak menargetkan Android Q, beberapa perubahan ini mungkin tidak langsung memengaruhi Anda. Namun, selagi Anda menggunakan antarmuka non-SDK yang merupakan bagian dari greylist (bergantung pada API level target aplikasi Anda), penggunaan metode atau kolom non-SDK selalu memiliki risiko tinggi yang dapat merusak aplikasi Anda.

Jika tidak yakin apakah aplikasi Anda menggunakan antarmuka non-SDK atau tidak, Anda dapat menjalankan pengujian aplikasi untuk mencari tahu. Jika aplikasi Anda mengandalkan antarmuka non-SDK, sebaiknya Anda mulai merencanakan migrasi ke SDK alternatif. Namun demikian, kami memahami bahwa beberapa aplikasi memiliki kasus penggunaan yang valid untuk menggunakan antarmuka non-SDK. Jika Anda tidak dapat menemukan alternatif selain menggunakan antarmuka non-SDK untuk fitur dalam aplikasi Anda, sebaiknya mintalah API publik baru.

Untuk mempelajari lebih lanjut, lihat Update pada pembatasan antarmuka non-SDK di Android Q dan lihat Pembatasan pada antarmuka non-SDK.

Navigasi Gestur

Mulai dari Android Q, pengguna dapat mengaktifkan navigasi gestur di seluruh perangkat. Jika pengguna mengaktifkan navigasi gestur, tindakan ini akan memengaruhi semua aplikasi di perangkat, terlepas apakah aplikasi menargetkan Android Q atau tidak. Misalnya, jika pengguna menggeser ke dalam dari tepi layar, sistem akan menginterpretasikan gestur tersebut sebagai navigasi Kembali, kecuali jika aplikasi secara khusus menggantikan gestur tersebut untuk sebagian layar.

Agar aplikasi Anda kompatibel dengan navigasi gestur, Anda dapat memperluas konten aplikasi dari tepi ke tepi layar, dan menangani gestur yang bermasalah dengan benar. Untuk mengetahui informasinya, lihat dokumentasi Navigasi gestur.

NDK

Android Q menyertakan perubahan NDK berikut.

Objek bersama tidak boleh berisi relokasi teks

Android 6.0 (API level 23) melarang penggunaan relokasi teks dalam objek bersama. Kode harus dimuat apa adanya, dan tidak boleh dimodifikasi. Perubahan ini akan menyempurnakan waktu muat aplikasi dan keamanan.

Pada Android Q Beta 1 dan 2, SELinux memberlakukan pembatasan ini pada aplikasi yang menargetkan Android 8.0 (API level 26) dan yang lebih tinggi. Mulai di Android Q Beta 3, pembatasan diberlakukan pada aplikasi yang menargetkan Android Q (API level 29) dan lebih tinggi. Jika terus menggunakan objek bersama yang berisi relokasi teks, aplikasi tersebut berisiko tinggi mengalami kerusakan.

Perubahan terhadap library Bionic dan jalur penghubung dinamis

Dimulai pada Android Q, beberapa jalur bukan lagi file reguler melainkan link simbolis. Aplikasi yang bergantung pada jalur yang merupakan file reguler mungkin akan rusak:

  • /system/lib/libc.so -> /apex/com.android.runtime/lib/bionic/libc.so
  • /system/lib/libm.so -> /apex/com.android.runtime/lib/bionic/libm.so
  • /system/lib/libdl.so -> /apex/com.android.runtime/lib/bionic/libdl.so
  • /system/bin/linker -> /apex/com.android.runtime/bin/linker

Perubahan ini juga berlaku untuk varian file 64-bit, dengan lib/ diganti dengan lib64/.

Untuk kompatibilitas, symlink baru disediakan di jalur lama, misalnya /system/lib/libc.so sekarang menjadi symlink untuk /apex/com.android.runtime/lib/bionic/libc.so, dan seterusnya. Jadi dlopen(“/system/lib/libc.so”) akan terus berfungsi, tetapi aplikasi akan menemukan perbedaan ketika aplikasi tersebut benar-benar mencoba untuk memeriksa library yang dimuat dengan membaca /proc/self/maps atau yang serupa, yang tidak biasa, tetapi kami telah menemukan bahwa beberapa aplikasi melakukannya sebagai bagian dari proses anti-peretasan. Jika demikian, jalur /apex/… harus ditambahkan sebagai jalur yang valid untuk file Bionic.

Biner/library sistem dipetakan ke memori execute-only

Mulai pada Android Q, segmen executable pada biner dan library sistem dipetakan ke memori execute-only (tidak dapat dibaca) sebagai teknik hardening terhadap serangan penggunaan kembali kode. Pembacaan sengaja dan tidak disengaja ke segmen memori yang ditandai execute-only akan menampilkan SIGSEGV - entah dari bug, kerentanan, atau introspeksi memori yang disengaja.

Anda dapat mengidentifikasi apakah sebuah error disebabkan oleh perubahan ini atau penyebab lainnya dengan memeriksa file tombstone terkait di /data/tombstones/. Error terkait execute-only akan memuat pesan pembatalan berikut:

    Cause: execute-only (no-read) memory access error; likely due to data in .text.
    

Untuk mengatasi masalah ini, developer dapat menandai segmen execute-only sebagai read+ execute dengan memanggil mprotect(), misalnya untuk menjalankan inspeksi memori. Namun, jika operasi tersebut selesai dilakukan, sebaiknya kembalikan segmen ke execute-only, untuk memberikan perlindungan yang lebih baik kepada aplikasi dan pengguna Anda.

Panggilan ke ptrace tidak terpengaruh, jadi proses debug ptrace tidak terdampak.

Keamanan

Android Q mencakup perubahan keamanan berikut.

Izin eksekusi dihapus untuk direktori utama aplikasi

Aplikasi tidak tepercaya yang menargetkan Android Q tidak dapat lagi memanggil exec() pada file dalam direktori utama aplikasi tersebut. Eksekusi file dari direktori utama aplikasi yang dapat ditulis ini merupakan pelanggaran W ^ X. Aplikasi hanya boleh memuat kode biner yang tersemat dalam file APK aplikasi.

Selain itu, aplikasi yang menargetkan Android Q tidak dapat melakukan modifikasi pada memori kode yang dapat dijalankan dari file yang telah di-dlopen(). Ini termasuk file objek bersama (.so) yang berisi relokasi teks.

Siaran Wi-Fi Langsung

Pada Android Q, siaran yang terkait dengan Wi-Fi Langsung tidak lagi melekat.

Jika aplikasi Anda mengandalkan penerimaan siaran ini pada saat pendaftaran karena sifatnya yang melekat, gunakan metode get() yang sesuai saat melakukan inisialisasi untuk mendapatkan informasi tersebut.

Kemampuan Wi-Fi Aware

Android Q menambahkan dukungan untuk memudahkan pembuatan Soket TCP/UDP menggunakan jalur data Wi-Fi Aware. Untuk membuat soket TCP/UDP yang terhubung ke ServerSocket, perangkat klien harus mengetahui alamat IPv6 dan port server. Ini perlu dikomunikasikan di luar band sebelumnya, seperti dengan menggunakan pesan lapisan 2 BT atau Wi-Fi Aware, atau ditemukan di-band menggunakan protokol lain, seperti mDNS. Dengan Android Q, informasi dapat dikomunikasikan sebagai bagian dari penyiapan jaringan.

Server dapat melakukan salah satu hal berikut:

  • Memulai ServerSocket serta menyetel atau mendapatkan port yang akan digunakan.
  • Menentukan informasi port sebagai bagian dari permintaan jaringan Wi-Fi Aware.

Contoh kode berikut menunjukkan cara menentukan informasi port sebagai bagian dari permintaan jaringan:

Kotlin

    val ss = ServerSocket()
    val ns = WifiAwareNetworkSpecifier.Builder(discoverySession, peerHandle)
      .setPskPassphrase("some-password")
      .setPort(ss.localPort)
      .build()

    val myNetworkRequest = NetworkRequest.Builder()
      .addTransportType(NetworkCapabilities.TRANSPORT_WIFI_AWARE)
      .setNetworkSpecifier(ns)
      .build()
    

Java

    ServerSocket ss = new ServerSocket();
    WifiAwareNetworkSpecifier ns = new WifiAwareNetworkSpecifier
      .Builder(discoverySession, peerHandle)
      .setPskPassphrase(“some-password”)
      .setPort(ss.getLocalPort())
      .build();

    NetworkRequest myNetworkRequest = new NetworkRequest.Builder()
      .addTransportType(NetworkCapabilities.TRANSPORT_WIFI_AWARE)
      .setNetworkSpecifier(ns)
      .build();
    

Klien kemudian melakukan permintaan jaringan Wi-Fi Aware untuk mendapatkan IPv6 dan port yang disediakan oleh server:

Kotlin


    val callback = object : ConnectivityManager.NetworkCallback() {
      override fun onAvailable(network: Network) {
        ...
      }

      override fun onLinkPropertiesChanged(network: Network,
          linkProperties: LinkProperties) {
        ...
      }

      override fun onCapabilitiesChanged(network: Network,
          networkCapabilities: NetworkCapabilities) {
        ...
        val ti = networkCapabilities.transportInfo
        if (ti is WifiAwareNetworkInfo) {
           val peerAddress = ti.peerIpv6Addr
           val peerPort = ti.port
        }
      }
      override fun onLost(network: Network) {
        ...
      }
    };

    connMgr.requestNetwork(networkRequest, callback)
    

Java

    callback = new ConnectivityManager.NetworkCallback() {
      @Override
      public void onAvailable(Network network) {
        ...
      }
      @Override
      public void onLinkPropertiesChanged(Network network,
          LinkProperties linkProperties) {
        ...
      }
      @Override
      Public void onCapabilitiesChanged(Network network,
          NetworkCapabilities networkCapabilities) {
        ...
        TransportInfo ti = networkCapabilities.getTransportInfo();
        if (ti instanceof WifiAwareNetworkInfo) {
           WifiAwareNetworkInfo info = (WifiAwareNetworkInfo) ti;
           Inet6Address peerAddress = info.getPeerIpv6Addr();
           int peerPort = info.getPort();
        }
      }
      @Override
      public void onLost(Network network) {
        ...
      }
    };

    connMgr.requestNetwork(networkRequest, callback);
    

SYSTEM_ALERT_WINDOW pada perangkat Go

Aplikasi yang berjalan di perangkat Android Q (edisi Go) tidak boleh menerima izin SYSTEM_ALERT_WINDOW. Hal ini karena jendela overlay gambar menggunakan memori berlebih, yang sangat membahayakan performa perangkat Android bermemori rendah.

Jika aplikasi yang berjalan pada perangkat edisi Go dan menjalankan Android 9 atau versi lebih rendah menerima izin SYSTEM_ALERT_WINDOW, aplikasi tersebut akan mempertahankan izin ini sekalipun perangkat diupgrade ke Android Q. Namun, aplikasi yang belum memiliki izin tersebut tidak dapat diberi izin setelah perangkat diupgrade.

Jika aplikasi pada perangkat Go mengirimkan intent dengan tindakan ACTION_MANAGE_OVERLAY_PERMISSION, sistem akan otomatis menolak permintaan tersebut, dan mengarahkan pengguna ke layar Setelan yang menyatakan bahwa izin tidak diperbolehkan karena dapat memperlambat perangkat. Jika aplikasi di perangkat Go memanggil Settings.canDrawOverlays(), metode ini akan selalu menampilkan nilai false. Sekali lagi, pembatasan ini tidak berlaku untuk aplikasi yang menerima izin SYSTEM_ALERT_WINDOW sebelum perangkat diupgrade ke Android Q.

Peringatan untuk aplikasi yang menargetkan Android versi lama

Pada Android Q, platform akan memperingatkan pengguna saat mereka pertama kali menjalankan aplikasi yang menargetkan versi platform di bawah Android 6.0 (API level 23). Jika aplikasi tersebut mengharuskan pengguna untuk memberikan izin, pengguna juga akan diberi kesempatan untuk menyesuaikan izin aplikasi sebelum aplikasi diizinkan berjalan untuk pertama kalinya.

Karena persyaratan API target Google Play, pengguna hanya akan melihat peringatan ini jika mereka menjalankan aplikasi yang belum diupdate baru-baru ini. Untuk aplikasi yang didistribusikan melalui app store lain, persyaratan API target serupa juga diperkenalkan pada tahun 2019. Untuk informasi lebih lanjut tentang persyaratan ini, lihat Memperluas persyaratan level API target pada tahun 2019.

Paket penyandian SHA-2 CBC dihapus

Paket penyandian SHA-2 CBC berikut telah dihapus dari platform:

  • TLS_RSA_WITH_AES_128_CBC_SHA256
  • TLS_RSA_WITH_AES_256_CBC_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384

Paket penyandian di atas kurang aman dibandingkan paket penyandian serupa yang menggunakan GCM. Sebagian besar server mendukung varian GCM dan CBC dari paket penyandian tersebut, atau tidak mendukung keduanya.

Penggunaan aplikasi

Android Q memperkenalkan perubahan perilaku berikut yang terkait dengan penggunaan aplikasi:

  • Penyempurnaan penggunaan aplikasi UsageStats - Android Q sekarang melacak penggunaan aplikasi secara akurat menggunakan UsageStats ketika aplikasi digunakan dalam mode layar terpisah atau picture-in-picture. Selain itu, Android Q sekarang juga dapat melacak penggunaan aplikasi instan.

  • Hitam putih per aplikasi - Sekarang Android Q dapat mengatur aplikasi ke mode tampilan hitam putih.

  • Status gangguan per aplikasi - Sekarang Android Q dapat secara selektif menetapkan aplikasi ke "status gangguan" ketika notifikasinya disembunyikan dan aplikasi tersebut tidak muncul sebagai aplikasi yang disarankan.

  • Penangguhan dan pemutaran - Pada Android Q, aplikasi yang ditangguhkan tidak dapat lagi memutar audio.

Perubahan koneksi HTTPS

Jika aplikasi yang menjalankan Android Q meneruskan null ke setSSLSocketFactory(), sekarang IllegalArgumentException akan terjadi. Pada versi sebelumnya, meneruskan null ke setSSLSocketFactory() memiliki efek yang sama dengan meneruskan nilai default pabrik yang aktif.

Library android.preference tidak digunakan lagi

Library android.preference tidak digunakan lagi. Sebagai gantinya, developer dianjurkan menggunakan library preferensi AndroidX, yang merupakan bagian dari Android Jetpack. Sebagai referensi bantuan tambahan untuk melakukan migrasi dan pengembangan, pelajari Panduan Setelan yang telah diperbarui beserta aplikasi sampel publik dan dokumentasi referensi kami.

Perubahan library utilitas file ZIP

Android Q memperkenalkan perubahan berikut untuk class dalam paket java.util.zip, yang menangani file ZIP. Perubahan ini membuat perilaku library menjadi lebih konsisten antara Android dan platform lain yang menggunakan java.util.zip.

Inflater

Pada versi Android sebelumnya, beberapa metode dalam class Inflater akan menampilkan IllegalStateException jika dipanggil setelah panggilan ke end(). Di Android Q, metode tersebut akan menampilkan NullPointerException.

ZipFile

Konstruktor untuk ZipFile yang mengambil argumen jenis File, int, dan Charset tidak lagi menampilkan ZipException jika file ZIP yang disediakan tidak berisi file apa pun.

ZipOutputStream

Metode finish() di ZipOutputStream tidak lagi menampilkan ZipException jika metode tersebut mencoba menulis stream output untuk file ZIP yang tidak berisi file apa pun.

Perubahan kamera

Banyak aplikasi yang menggunakan kamera menganggap bahwa jika perangkat berada dalam konfigurasi potret, perangkat fisik juga berada dalam orientasi potret, seperti yang dijelaskan dalam Orientasi kamera. Dulu asumsi ini memang benar, tetapi sekarang sudah tidak berlaku lagi karena faktor bentuk baru, seperti perangkat yang dapat dilipat. Jika asumsi tersebut digunakan pada perangkat semacam ini, tampilan jendela bidik kamera bisa salah diputar atau diskalakan (atau keduanya).

Aplikasi yang menargetkan API level 24 atau versi lebih tinggi harus secara eksplisit menyetel android:resizeableActivity dan menyediakan fungsionalitas yang diperlukan untuk menangani operasi multi-aplikasi.

Pelacakan penggunaan baterai

Mulai dari Android Q, SystemHealthManager menyetel ulang statistik penggunaan baterai setiap kali perangkat dicabut dari pengisi daya setelah aktivitas pengisian daya utama. Secara umum, aktivitas pengisian daya utama adalah: Perangkat telah terisi penuh, atau perangkat berubah dari baterai hampir habis menjadi baterai hampir penuh.

Sebelum Android Q, statistik penggunaan baterai disetel ulang setiap kali perangkat dicabut dari pengisi daya, sekecil apa pun perubahan yang terjadi pada level baterai.