Menerapkan antarmuka partisi produk

Android 11 mengurai paket partisi product sehingga terlepas dari partisi system dan vendor. Sebagai bagian dari perubahan ini, kini Anda dapat mengontrol akses partisi product ke native dan Java antarmuka (yang serupa dengan cara kerja penerapan antarmuka untuk vendor partisi).

Menerapkan antarmuka native

Untuk mengaktifkan penerapan antarmuka native, tetapkan PRODUCT_PRODUCT_VNDK_VERSION ke current. (Versi secara otomatis ditetapkan ke current saat pengiriman Level API untuk target lebih besar dari 29.) Penegakan memungkinkan:

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

Penerapan tidak mengizinkan link lain ke partisi selain product partisi.

Penerapan waktu build (Android.bp)

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

  • Modul native di partisi product ada dalam varian produk varian inti.

  • Modul dengan product_available: true dalam file Android.bp-nya adalah yang tersedia untuk varian produk.

  • Library atau biner yang menentukan product_specific: true dapat ditautkan ke library library yang menentukan product_specific: true atau product_available: true dalam file Android.bp-nya.

  • Library VNDK harus memiliki product_available: true dalam file Android.bp sehingga biner product dapat menautkan ke library VNDK.

Tabel berikut meringkas properti Android.bp yang digunakan untuk membuat gambar pada semua varian.

Properti di Android.bp Varian dibuat
Sebelum penerapan Setelah penegakan kebijakan
default (tak satu pun) bagian tengah tubuh
(termasuk /system, /system_ext, dan /product)
bagian tengah tubuh
(mencakup /system dan /system_ext, tetapi tidak /product)
system_ext_specific: true core core
product_specific: true core produk
vendor: true vendor vendor
vendor_available: true inti, vendor inti, vendor
product_available: true T/A inti, produk
vendor_available: true DAN product_available: true T/A inti, produk, vendor
system_ext_specific: true DAN vendor_available: true inti, vendor inti, vendor
product_specific: true DAN vendor_available: true inti, vendor produk, vendor

Penerapan waktu build (Android.mk)

Jika penerapan antarmuka native diaktifkan, modul native diinstal ke Partisi product memiliki jenis penautan native:product yang hanya dapat ditautkan ke modul native:product atau native:vndk lainnya. Mencoba menautkan ke salah satu selain modul ini, sistem build akan menghasilkan pemeriksaan jenis link {i>error<i}.

Penerapan runtime

Jika penerapan antarmuka native diaktifkan, konfigurasi penaut untuk penaut bionik tidak mengizinkan proses sistem menggunakan library product, membuat bagian product untuk proses product yang tidak dapat ditautkan ke library di luar partisi product (tetapi, proses tersebut dapat ditautkan ke library VNDK). Percobaan untuk melanggar konfigurasi link runtime akan menyebabkan gagal dan menghasilkan pesan error CANNOT LINK EXECUTABLE.

Menerapkan antarmuka Java

Untuk mengaktifkan penerapan antarmuka Java, setel PRODUCT_ENFORCE_PRODUCT_PARTITION_INTERFACE hingga true. (Nilainya adalah otomatis disetel ke true jika API level pengiriman untuk target adalah lebih besar dari 29.) Jika diaktifkan, penegakan akan mengizinkan atau melarang hal berikut akses:

API /system /system_ext /product /vendor /data
API Publik
@SystemApi
API @hide

Seperti dalam partisi vendor, aplikasi atau library Java di product partisi diizinkan untuk hanya menggunakan API publik dan sistem; menautkan ke perpustakaan yang menggunakan API tersembunyi tidak diizinkan. Pembatasan ini termasuk penautan pada build waktu dan refleksi dalam runtime.

Penerapan waktu build

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

Penerapan runtime

Runtime Android memverifikasi bahwa aplikasi di partisi product tidak digunakan API tersembunyi, termasuk refleksi. Untuk detailnya, lihat Batasan mengenai non-SDK antarmuka.

Aktifkan penerapan antarmuka produk

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

Langkah Tugas Wajib
1 Tentukan makefile sistem Anda sendiri yang menentukan paket untuk system, lalu tetapkan pemeriksaan persyaratan jalur artefak di device.mk (untuk mencegah penginstalan modul nonsistem ke partisi system). N
2 Bersihkan daftar yang diizinkan. N
3 Menerapkan antarmuka native dan mengidentifikasi kegagalan link runtime (dapat berjalan di paralel dengan penerapan Java). Y
4 Terapkan antarmuka Java dan verifikasi perilaku runtime (dapat berjalan secara paralel dengan penerapan native). Y
5 Periksa perilaku runtime. Y
6 Mengupdate device.mk dengan penerapan antarmuka produk. Y

Langkah 1: Buat makefile dan aktifkan pemeriksaan jalur artefak

Pada langkah ini, Anda akan menentukan makefile system.

  1. Buat makefile yang menentukan paket untuk partisi system. Sebagai buat contoh file oem_system.mk berikut:

    $(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. Dalam file device.mk, warisi makefile umum untuk system membuat partisi dan mengaktifkan pemeriksaan persyaratan jalur artefak. 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 ditetapkan ke true atau strict, sistem pembangunan mencegah paket yang ditentukan dalam makefile lain agar tidak diinstal ke jalur yang ditentukan di require-artifacts-in-path dan mencegah paket yang ditentukan dalam makefile saat ini dari menginstal artefak di luar jalur ditentukan dalam require-artifacts-in-path.

Pada contoh di atas, dengan PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS ditetapkan ke strict, makefile di luar oem_system.mk tidak dapat menyertakan modul yang diinstal ke partisi root atau system. Untuk menyertakan modul ini, Anda harus tentukan file tersebut dalam file oem_system.mk itu sendiri atau dalam makefile yang disertakan. Upaya menginstal modul ke jalur yang tidak diizinkan akan menyebabkan jeda build. Untuk memperbaiki rusak, lakukan salah satu hal berikut:

  • Opsi 1: Sertakan modul sistem dalam makefile yang disertakan dalam oem_system.mk. Hal ini membuat persyaratan jalur artefak terpenuhi (karena modul sekarang ada di makefile yang disertakan) dan dengan demikian memungkinkan instalasi ke sekumpulan jalur dalam `require-artifacts-in-path.

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

  • Opsi 3: Tambahkan modul ke PRODUCT_ARTIFACT_PATH_REQUIREMENT_ALLOWED_LIST. Ini mencantumkan modul yang diizinkan yang akan diinstal.

Langkah 2: Kosongkan daftar yang diizinkan

Pada langkah ini, Anda akan membuat PRODUCT_ARTIFACT_PATH_REQUIREMENT_ALLOWED_LIST kosong sehingga semua perangkat yang berbagi oem_system.mk juga dapat berbagi satu system gambar. Untuk mengosongkan daftar yang diizinkan, pindahkan modul dalam daftar ke Partisi system_ext atau product atau tambahkan ke system buat file. Ini bersifat opsional karena menentukan gambar system umum tidak diperlukan untuk mengaktifkan penerapan antarmuka produk. Tetapi, mengosongkan daftar yang diperbolehkan adalah berguna untuk menentukan batas system dengan system_ext.

Langkah 3: Terapkan antarmuka native

Pada langkah ini, Anda menetapkan PRODUCT_PRODUCT_VNDK_VERSION := current, lalu melihat untuk error build dan runtime, serta mengatasinya. Untuk memeriksa booting dan log perangkat serta menemukan dan memperbaiki kegagalan link runtime:

  1. Setel PRODUCT_PRODUCT_VNDK_VERSION := current.

  2. Bangun perangkat dan cari error build. Anda mungkin akan melihat beberapa jeda untuk varian produk atau varian inti yang hilang. Jeda yang umum termasuk:

    • Modul hidl_interface apa pun yang memiliki product_specific: true tidak akan yang tersedia untuk modul sistem. Untuk memperbaiki, ganti product_specific: true dengan system_ext_specific: true.
    • Modul mungkin tidak memiliki varian produk yang diperlukan untuk produk modul. Untuk memperbaikinya, sediakan modul tersebut untuk partisi product dengan menyetel product_available: true atau memindahkan modul ke product partisi dengan menyetel product_specific: true.
  3. Atasi error build dan pastikan perangkat berhasil dibuat.

  4. Lakukan flash image dan cari error runtime di log dan booting perangkat.

    • Jika tag linker dari log kasus pengujian menampilkan CANNOT LINK EXECUTABLE pesan, file make tidak memiliki dependensi (dan tidak direkam di waktu build).
    • Untuk memeriksanya dari sistem build, tambahkan library yang diperlukan ke Kolom shared_libs: atau required:.
  5. Selesaikan dependensi yang hilang menggunakan panduan yang diberikan di atas.

Langkah 4: Terapkan antarmuka Java

Pada langkah ini, Anda akan menetapkan PRODUCT_ENFORCE_PRODUCT_PARTITION_INTERFACE := true, kemudian menemukan dan memperbaiki error build yang dihasilkan. Cari dua jenis kesalahan spesifik:

  • Error jenis link. Error ini menunjukkan bahwa aplikasi ditautkan ke modul Java yang memiliki sdk_version lebih luas. Untuk memperbaikinya, Anda dapat memperluas sdk_version atau membatasi sdk_version library. Contoh error:

    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.
    
  • Error simbol. Pesan {i>error <i}ini menunjukkan bahwa sebuah simbol tidak dapat ditemukan karena dalam API tersembunyi. Untuk memperbaikinya, gunakan API yang terlihat (tidak tersembunyi) atau temukan alternatif. Contoh error:

    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 akan memverifikasi bahwa perilaku runtime sudah sesuai dengan yang diharapkan. Untuk aplikasi yang dapat di-debug, Anda dapat memantau penggunaan API tersembunyi dengan menggunakan StrictMode.detectNonSdkApiUsage (yang menghasilkan log saat aplikasi menggunakan API tersembunyi). Atau, Anda dapat menggunakan veridex alat analisis statis untuk mendapatkan jenis penggunaan (penautan atau refleksi), tingkat pembatasan, dan stack panggilan.

  • Sintaksis 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 mengetahui detail tentang penggunaan veridex, lihat Menguji menggunakan veridex alat.

Langkah 6: Update device.mk

Setelah memperbaiki semua kegagalan build dan runtime, dan memverifikasi runtime tersebut memiliki perilaku yang sesuai dengan yang diharapkan, tetapkan hal berikut di device.mk:

  • PRODUCT_PRODUCT_VNDK_VERSION := current
  • PRODUCT_ENFORCE_PRODUCT_PARTITION_INTERFACE := true