Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Menerapkan Antarmuka Partisi Produk

Android 11 menguraikan partisi product , membuatnya terpisah dari partisi system dan vendor . Sebagai bagian dari perubahan ini, Anda sekarang dapat mengontrol akses partisi product ke antarmuka asli dan Java (yang serupa dengan cara kerja penerapan antarmuka untuk partisi vendor ).

Menerapkan antarmuka asli

Untuk mengaktifkan penerapan antarmuka asli, setel PRODUCT_PRODUCT_VNDK_VERSION ke current . (Versi ini otomatis disetel ke current jika level API pengiriman untuk target lebih besar dari 29.) Penerapan memungkinkan:

  • Modul asli di partisi product untuk ditautkan:
    • Secara statis atau dinamis ke modul lain di partisi product yang menyertakan pustaka header, bersama, atau statis.
    • Secara dinamis ke pustaka VNDK di partisi system .
  • Library JNI dalam APK yang tidak dibundel di partisi product untuk ditautkan ke library di /product/lib atau /product/lib64 (ini selain library NDK).

Penerapan tidak mengizinkan tautan lain ke partisi selain partisi product .

Penegakan waktu build (Android.bp)

Di Android 11, modul sistem dapat membuat varian gambar produk selain varian gambar inti dan vendor. Jika penerapan antarmuka asli diaktifkan ( PRODUCT_PRODUCT_VNDK_VERSION disetel ke current ):

  • Modul asli di partisi product ada dalam varian produk, bukan varian inti.

  • Modul dengan vendor_available: true dalam file Android.bp -nya tersedia untuk varian produk dan varian vendor.

  • Pustaka atau biner yang menentukan product_specific: true bisa ditautkan ke pustaka lain yang menentukan product_specific: true atau vendor_available: true di file Android.bp mereka.

  • Library VNDK harus memiliki vendor_available: true di file Android.bp sehingga biner product dapat ditautkan ke library VNDK.

Tabel berikut merangkum properti Android.bp yang digunakan untuk membuat varian gambar.

Properti di Android.bp Varian dibuat
Sebelum penegakan Setelah penegakan
default (tidak ada) inti

(termasuk /system , /system_ext dan /product )

inti

(termasuk /system dan /system_ext tetapi tidak /product )

system_ext_specific: true inti inti
product_specific: true inti produk
vendor: true penjaja penjaja
vendor_available: true inti, vendor inti, produk, vendor
system_ext_specific: true AND vendor_available: true inti, vendor inti, produk, vendor
product_specific: true AND vendor_available: true inti, vendor produk, vendor

Membangun penegakan waktu (Android.mk)

Jika penerapan antarmuka asli diaktifkan, modul asli yang dipasang ke partisi product memiliki jenis tautan native:product yang hanya dapat ditautkan ke modul native:product atau native:vndk . Mencoba menautkan ke modul apa pun selain ini menyebabkan sistem build menghasilkan kesalahan pemeriksaan jenis tautan.

Penegakan waktu proses

Saat penerapan antarmuka asli diaktifkan, konfigurasi linker untuk linker bionik tidak mengizinkan proses sistem untuk menggunakan pustaka product , membuat bagian product untuk proses product yang tidak dapat ditautkan ke pustaka di luar partisi product (namun, proses tersebut dapat tautan ke perpustakaan VNDK). Upaya untuk melanggar konfigurasi tautan runtime menyebabkan proses gagal dan menghasilkan pesan kesalahan CANNOT LINK EXECUTABLE .

Menerapkan antarmuka Java

Untuk mengaktifkan penerapan antarmuka Java, setel PRODUCT_ENFORCE_PRODUCT_PARTITION_INTERFACE ke true . (Nilai secara otomatis disetel ke true saat level API pengiriman untuk target lebih besar dari 29.) Jika diaktifkan, penegakan mengizinkan / melarang akses berikut.

API /sistem / system_ext /produk /penjaja /data
API Publik
@Sistema
@ API @hide

Seperti di partisi vendor , aplikasi atau pustaka Java di partisi product hanya diizinkan untuk menggunakan API publik dan sistem; menautkan ke perpustakaan yang menggunakan API tersembunyi tidak diperbolehkan. Batasan ini mencakup penautan pada waktu pembuatan dan refleksi dalam waktu proses.

Bangun penegakan waktu

Pada waktu pembuatan, Make dan Soong memverifikasi bahwa modul Java di partisi product tidak menggunakan API tersembunyi dengan memeriksa bidang platform_apis dan sdk_version . sdk_version aplikasi di partisi product harus diisi dengan API versi current , system_current , atau numerik, dan bidang platform_apis harus kosong.

Penegakan waktu proses

Waktu proses Android memverifikasi bahwa aplikasi di partisi product tidak menggunakan API tersembunyi, termasuk refleksi. Untuk mengetahui detailnya, lihat Batasan pada antarmuka non-SDK .

Mengaktifkan penerapan antarmuka produk

Gunakan langkah-langkah di bagian ini untuk mengaktifkan penerapan antarmuka produk.

Langkah Tugas Yg dibutuhkan
1 Tentukan makefile sistem Anda sendiri yang menentukan paket untuk partisi system , kemudian setel pemeriksaan persyaratan jalur artefak di device.mk (untuk mencegah modul non- system menginstal ke partisi system ). N
2 Bersihkan daftar yang diizinkan. N
3 Menerapkan antarmuka asli dan mengidentifikasi kegagalan link waktu proses (dapat dijalankan secara paralel dengan penerapan Java). Y
4 Menerapkan antarmuka Java dan memverifikasi perilaku waktu proses (dapat berjalan secara paralel dengan penerapan asli). Y
5 Periksa perilaku runtime. Y
6 Perbarui device.mk dengan penerapan antarmuka produk. Y

Langkah 1: Buat makefile dan aktifkan pemeriksaan jalur artefak

Pada langkah ini, Anda menentukan makefile system .

  1. Buat makefile yang mendefinisikan paket-paket untuk partisi system . Misalnya, buat file oem_system.mk dengan berikut ini:

    $(call inherit-product, $(SRC_TARGET_DIR)/product/handheld_system.mk)
    $(call inherit-product, $(SRC_TARGET_DIR)/product/telephony_system.mk)
    
    # Applications
    PRODUCT_PACKAGES += \
        CommonSystemApp1 \
        CommonSystemApp2 \
        CommonSystemApp3 \
    
    # Binaries
    PRODUCT_PACKAGES += \
        CommonSystemBin1 \
        CommonSystemBin2 \
        CommonSystemBin3 \
    
    # Libraries
    PRODUCT_PACKAGES += \
        CommonSystemLib1 \
        CommonSystemLib2 \
        CommonSystemLib3 \
    
    PRODUCT_SYSTEM_NAME := oem_system
    PRODUCT_SYSTEM_BRAND := Android
    PRODUCT_SYSTEM_MANUFACTURER := Android
    PRODUCT_SYSTEM_MODEL := oem_system
    PRODUCT_SYSTEM_DEVICE := generic
    
    # For system-as-root devices, system.img should be mounted at /, so we
    # include ROOT here.
    _my_paths := \
     $(TARGET_COPY_OUT_ROOT)/ \
     $(TARGET_COPY_OUT_SYSTEM)/ \
    
    $(call require-artifacts-in-path, $(_my_paths),)
    
  2. Di file device.mk , mewarisi makefile umum untuk partisi system dan mengaktifkan pemeriksaan persyaratan jalur artefak. Sebagai contoh:

    $(call inherit-product, $(SRC_TARGET_DIR)/product/oem_system.mk)
    
    # Enable artifact path requirements checking
    PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := strict
    

Tentang persyaratan jalur artefak

Jika PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS disetel ke true atau strict , sistem build mencegah paket yang ditentukan di makefile lain agar tidak menginstal ke jalur yang ditentukan di require-artifacts-in-path dan mencegah paket yang ditentukan dalam makefile saat ini menginstal artefak di luar jalur yang ditentukan di require-artifacts-in-path .

Dalam contoh di atas, dengan PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS disetel ke strict , makefiles di luar oem_system.mk tidak dapat menyertakan modul yang dipasang ke root atau partisi system . Untuk menyertakan modul ini, Anda harus menentukannya di file oem_system.mk itu sendiri atau di makefile yang disertakan. Upaya untuk memasang modul ke jalur yang tidak diizinkan menyebabkan kerusakan versi. Untuk memperbaiki jeda, lakukan salah satu hal berikut ini:

  • Opsi 1: Sertakan modul sistem dalam makefiles yang disertakan dalam oem_system.mk . Ini membuatnya jadi persyaratan jalur artefak terpenuhi (karena modul sekarang ada dalam makefile yang disertakan) dan dengan demikian memungkinkan pemasangan ke kumpulan jalur di `require-artifacts-in-path.

  • Opsi 2: Instal modul ke system_ext atau partisi product (dan jangan instal modul ke partisi system ).

  • Opsi 3: Tambahkan modul ke PRODUCT_ARTIFACT_PATH_REQUIREMENT_ALLOWED_LIST . Daftar ini memungkinkan modul untuk dipasang.

Langkah 2: Kosongkan daftar yang diizinkan

Pada langkah ini, Anda mengosongkan PRODUCT_ARTIFACT_PATH_REQUIREMENT_ALLOWED_LIST sehingga semua perangkat yang berbagi oem_system.mk juga dapat berbagi satu citra system . Untuk mengosongkan daftar yang diizinkan, pindahkan modul apa pun dalam daftar ke system_ext atau partisi product atau tambahkan ke file system make. Langkah ini opsional karena menentukan image system umum tidak diperlukan untuk mengaktifkan penerapan antarmuka produk. Namun, mengosongkan daftar yang diizinkan berguna untuk menentukan batas system dengan system_ext .

Langkah 3: Terapkan antarmuka asli

Pada langkah ini, Anda menyetel PRODUCT_PRODUCT_VNDK_VERSION := current , lalu cari kesalahan build dan runtime dan mengatasinya. Untuk memeriksa boot dan log perangkat serta menemukan dan memperbaiki kegagalan link runtime:

  1. Setel PRODUCT_PRODUCT_VNDK_VERSION := current .

  2. Bangun perangkat dan cari kesalahan versi. Anda mungkin melihat beberapa jeda versi untuk varian produk atau varian inti yang tidak ada. Istirahat umum meliputi:

    • Modul hidl_interface apa hidl_interface yang memiliki product_specific: true tidak akan tersedia untuk modul sistem. Untuk memperbaikinya, ganti product_specific: true dengan system_ext_specfic: true .
    • Modul mungkin tidak memiliki varian produk yang diperlukan untuk modul produk. Untuk memperbaikinya, buat modul tersebut tersedia untuk partisi product dengan mengatur vendor_available: true atau pindahkan modul ke partisi product dengan mengatur product_specific: true .
  3. Selesaikan error build dan pastikan perangkat berhasil dibangun.

  4. Flash gambar dan cari error runtime di boot dan log perangkat.

    • Jika tag linker dari test case log menunjukkan pesan CANNOT LINK EXECUTABLE , file make tidak memiliki dependensi (dan tidak direkam pada waktu pembuatan).
    • Untuk memeriksanya dari sistem build, tambahkan pustaka yang diperlukan ke kolom shared_libs: atau required:
  5. Selesaikan ketergantungan yang hilang menggunakan panduan yang diberikan di atas.

Langkah 4: Terapkan antarmuka Java

Pada langkah ini, Anda menyetel PRODUCT_ENFORCE_PRODUCT_PARTITION_INTERFACE := true , lalu temukan dan perbaiki kesalahan versi yang dihasilkan. Cari dua jenis kesalahan tertentu:

  • Kesalahan jenis tautan. Kesalahan ini menunjukkan bahwa aplikasi menautkan ke modul Java yang memiliki sdk_version lebih luas. Untuk memperbaikinya, Anda dapat memperluas sdk_version aplikasi atau membatasi sdk_version perpustakaan. Contoh kesalahan:

    error: frameworks/base/packages/SystemUI/Android.bp:138:1: module "SystemUI" variant "android_common": compiles against system API, but dependency "telephony-common" is compiling against private API.Adjust sdk_version: property of the source or target module so that target module is built with the same or smaller API set than the source.
    
  • Kesalahan simbol. Kesalahan ini menunjukkan bahwa simbol tidak dapat ditemukan karena berada dalam API tersembunyi. Untuk memperbaikinya, gunakan API yang terlihat (tidak tersembunyi) atau temukan alternatif. Contoh kesalahan:

    frameworks/opt/net/voip/src/java/com/android/server/sip/SipSessionGroup.java:1051: error: cannot find symbol
                ProxyAuthenticate proxyAuth = (ProxyAuthenticate)response.getHeader(
                                               ^
      symbol:   class ProxyAuthenticate
      location: class SipSessionGroup.SipSessionImpl
    

Langkah 5: Periksa perilaku runtime

Pada langkah ini, Anda memverifikasi perilaku waktu proses seperti yang diharapkan. Untuk aplikasi yang dapat di-debug, Anda bisa memantau penggunaan API tersembunyi dengan log menggunakan StrictMode.detectNonSdkApiUsage (yang menghasilkan log saat aplikasi menggunakan API tersembunyi). Atau, Anda dapat menggunakan alat analisis statis veridex untuk mendapatkan jenis penggunaan (penautan atau refleksi), tingkat pembatasan, dan tumpukan panggilan.

  • Sintaks Veridex:

    ./art/tools/veridex/appcompat.sh --dex-file={apk file}
    
  • Contoh hasil veridex:

    #1: Linking greylist-max-o Landroid/animation/AnimationHandler;-><init>()V use(s):
           Lcom/android/systemui/pip/phone/PipMotionHelper;-><init>(Landroid/content/Context;Landroid/app/IActivityManager;Landroid/app/IActivityTaskManager;Lcom/android/systemui/pip/phone/PipMenuActivityController;Lcom/android/internal/policy/PipSnapAlgorithm;Lcom/android/systemui/statusbar/FlingAnimationUtils;)V
    
    #1332: Reflection greylist Landroid/app/Activity;->mMainThread use(s):
           Landroidx/core/app/ActivityRecreator;->getMainThreadField()Ljava/lang/reflect/Field;
    

Untuk detail tentang penggunaan veridex, lihat Menguji menggunakan alat veridex .

Langkah 6: Perbarui device.mk

Setelah memperbaiki semua kegagalan build dan runtime, serta memverifikasi bahwa perilaku waktu proses sesuai dengan yang diharapkan, setel hal berikut di device.mk :

  • PRODUCT_PRODUCT_VNDK_VERSION := current
  • PRODUCT_ENFORCE_PRODUCT_PARTITION_INTERFACE := true