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
.
- Secara statis atau dinamis ke modul lain di partisi
- 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 fileAndroid.bp
-nya adalah yang tersedia untuk varian produk.Library atau biner yang menentukan
product_specific: true
dapat ditautkan ke library library yang menentukanproduct_specific: true
atauproduct_available: true
dalam fileAndroid.bp
-nya.Library VNDK harus memiliki
product_available: true
dalam fileAndroid.bp
sehingga binerproduct
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
.
Buat makefile yang menentukan paket untuk partisi
system
. Sebagai buat contoh fileoem_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),)
Dalam file
device.mk
, warisi makefile umum untuksystem
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
atauproduct
(dan jangan menginstal modul ke partisisystem
).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:
Setel
PRODUCT_PRODUCT_VNDK_VERSION := current
.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 memilikiproduct_specific: true
tidak akan yang tersedia untuk modul sistem. Untuk memperbaiki, gantiproduct_specific: true
dengansystem_ext_specific: true
. - Modul mungkin tidak memiliki varian produk yang diperlukan untuk produk
modul. Untuk memperbaikinya, sediakan modul tersebut untuk partisi
product
dengan menyetelproduct_available: true
atau memindahkan modul keproduct
partisi dengan menyetelproduct_specific: true
.
- Modul
Atasi error build dan pastikan perangkat berhasil dibuat.
Lakukan flash image dan cari error runtime di log dan booting perangkat.
- Jika tag
linker
dari log kasus pengujian menampilkanCANNOT 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:
ataurequired:
.
- Jika tag
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 memperluassdk_version
atau membatasisdk_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