Android 11, product
bölümünü ayrıştırarak system
ve vendor
bölümlerinden bağımsız olmasını sağlar. Bu değişikliklerin bir parçası olarak, artık product
bölümünün yerel ve Java arayüzlerine erişimini denetleyebilirsiniz (bu, vendor
bölümleri için arayüz uygulamasının nasıl çalıştığına benzer).
Yerel arayüzleri zorunlu kılma
Yerel arayüz uygulamasını etkinleştirmek için PRODUCT_PRODUCT_VNDK_VERSION
current
olarak ayarlayın. (Hedef için gönderim API düzeyi 29'dan büyük olduğunda sürüm otomatik olarak current
şekilde ayarlanır.) Yaptırım şunları sağlar:
- Bağlanacak
product
bölümündeki yerel modüller:-
product
bölümündeki statik, paylaşılan veya başlık kitaplıkları içeren diğer modüllere statik veya dinamik olarak. -
system
bölümündeki VNDK kitaplıklarına dinamik olarak.
-
-
/product/lib
veya/product/lib64
içindeki kitaplıklara bağlanmak içinproduct
bölümündeki ayrıştırılmış APK'lardaki JNI kitaplıkları (bu, NDK kitaplıklarına ektir).
Uygulama, product
bölümü dışındaki bölümlere başka bağlantılara izin vermez.
Derleme zamanı uygulaması (Android.bp)
Android 11'de sistem modülleri, çekirdek ve satıcı görseli çeşitlerine ek olarak bir ürün görseli çeşidi de oluşturabilir. Yerel arayüz uygulaması etkinleştirildiğinde ( PRODUCT_PRODUCT_VNDK_VERSION
current
olarak ayarlanmıştır):
product
bölümündeki yerel modüller, çekirdek varyant yerine ürün varyantında bulunur.Android.bp
dosyalarındaproduct_available: true
bulunan modüller, ürün çeşidi için mevcuttur.product_specific: true
belirten kitaplıklar veya ikili dosyalar,Android.bp
dosyalarındaproduct_specific: true
veyaproduct_available: true
belirten diğer kitaplıklara bağlantı verebilir.product
ikili dosyalarının VNDK kitaplıklarına bağlanabilmesi için VNDK kitaplıklarınınAndroid.bp
dosyalarındaproduct_available: true
olması gerekir.
Aşağıdaki tablo, görüntü çeşitleri oluşturmak için kullanılan Android.bp
özelliklerini özetlemektedir.
Android.bp'deki özellikler | Varyantlar oluşturuldu | |
---|---|---|
Yürürlükten önce | Yürürlükten sonra | |
varsayılan (yok) | çekirdek ( | çekirdek ( |
system_ext_specific: true | çekirdek | çekirdek |
product_specific: true | çekirdek | ürün |
vendor: true | SATICI | SATICI |
vendor_available: true | çekirdek, satıcı | çekirdek, satıcı |
product_available: true | Yok | çekirdek, ürün |
vendor_available: true VE product_available: true | Yok | çekirdek, ürün, satıcı |
system_ext_specific: true VE vendor_available: true | çekirdek, satıcı | çekirdek, satıcı |
product_specific: true VE vendor_available: true | çekirdek, satıcı | ürün, satıcı |
Derleme zamanı uygulaması (Android.mk)
Yerel arayüz uygulaması etkinleştirildiğinde, product
bölümüne yüklenen yerel modüller, yalnızca diğer native:product
veya native:vndk
modüllerine bağlanabilen bir native:product
bağlantı türüne sahiptir. Bunların dışındaki herhangi bir modüle bağlanmaya çalışmak, derleme sisteminin bağlantı türü kontrol hatası oluşturmasına neden olur.
Çalışma zamanı yaptırımı
Yerel arayüz uygulaması etkinleştirildiğinde, biyonik bağlayıcıya yönelik bağlayıcı yapılandırması, sistem işlemlerinin product
kitaplıklarını kullanmasına izin vermez ve product
bölümü dışındaki kitaplıklara bağlanamayan product
işlemleri için bir product
bölümü oluşturur (ancak bu tür işlemler, VNDK kütüphanelerine bağlantı). Çalışma zamanı bağlantı yapılandırmasını ihlal etme girişimleri, işlemin başarısız olmasına ve CANNOT LINK EXECUTABLE
hata mesajının oluşturulmasına neden olur.
Java arayüzlerini zorlama
Java arayüzü zorlamasını etkinleştirmek için PRODUCT_ENFORCE_PRODUCT_PARTITION_INTERFACE
öğesini true
olarak ayarlayın. (Hedef için gönderim API düzeyi 29'dan büyük olduğunda değer otomatik olarak true
olarak ayarlanır.) Etkinleştirildiğinde, uygulama aşağıdaki erişime izin verir/izin vermez.
API'si | /sistem | /system_ext | /ürün | /SATICI | /veri |
---|---|---|---|---|---|
Genel API | |||||
@SystemApi | |||||
@hide API'si |
vendor
bölümünde olduğu gibi, product
bölümündeki bir uygulamanın veya Java kitaplığının yalnızca genel ve sistem API'lerini kullanmasına izin verilir; Gizli API'leri kullanan bir kitaplığa bağlantı verilmesine izin verilmez. Bu kısıtlama, derleme zamanındaki bağlantıyı ve çalışma zamanındaki yansımayı içerir.
Zaman yaptırımı oluşturma
Derleme sırasında Make ve Soong, platform_apis
ve sdk_version
alanlarını kontrol ederek product
bölümündeki Java modüllerinin gizli API'leri kullanmadığını doğrular. product
bölümündeki uygulamaların sdk_version
API'nin current
, system_current
veya sayısal sürümüyle doldurulmalı ve platform_apis
alanı boş olmalıdır.
Çalışma zamanı yaptırımı
Android çalışma zamanı, product
bölümündeki uygulamaların yansıma da dahil olmak üzere gizli API'leri kullanmadığını doğrular. Ayrıntılar için SDK olmayan arayüzlerdeki kısıtlamalar konusuna bakın.
Ürün arayüzü yaptırımını etkinleştirme
Ürün arayüzü uygulamasını etkinleştirmek için bu bölümdeki adımları kullanın.
Adım | Görev | Gerekli |
---|---|---|
1 | system bölümü için paketleri belirten kendi sistem makefile dosyanızı tanımlayın, ardından device.mk yapıt yolu gereksinim kontrolünü ayarlayın (sistem dışı modüllerin system bölümüne yüklenmesini önlemek için). | N |
2 | İzin verilenler listesini temizleyin. | N |
3 | Yerel arayüzleri zorunlu kılın ve çalışma zamanı bağlantı hatalarını tanımlayın (Java uygulamasıyla paralel olarak çalışabilir). | e |
4 | Java arayüzlerini zorunlu kılın ve çalışma zamanı davranışını doğrulayın (yerel uygulamayla paralel olarak çalışabilir). | e |
5 | Çalışma zamanı davranışlarını kontrol edin. | e |
6 | device.mk dosyasını ürün arayüzü uygulamasıyla güncelleyin. | e |
Adım 1: Makefile oluşturun ve yapı yolu denetimini etkinleştirin
Bu adımda system
makefile'ını tanımlarsınız.
system
bölümü için paketleri tanımlayan bir makefile oluşturun. Örneğin aşağıdakileri içeren biroem_system.mk
dosyası oluşturun:$(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),)
device.mk
dosyasında,system
bölümü için ortak makefile dosyasını devralın ve yapı yolu gereksinimleri kontrolünü etkinleştirin. Örneğin:$(call inherit-product, $(SRC_TARGET_DIR)/product/oem_system.mk) # Enable artifact path requirements checking PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := strict
Yapıt yolu gereksinimleri hakkında
PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS
true
veya strict
olarak ayarlandığında, derleme sistemi, diğer makefile dosyalarında tanımlanan paketlerin require-artifacts-in-path
tanımlanan yollara kurulmasını engeller ve geçerli makefile dosyasında tanımlanan paketlerin, require-artifacts-in-path
-'de tanımlanan yolların dışındaki yapıları kurmasını engeller. require-artifacts-in-path
.
Yukarıdaki örnekte, PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS
strict
olarak ayarlandığında, oem_system.mk
dışındaki makefile dosyaları root
veya system
bölümüne yüklenen modülleri içeremez. Bu modülleri dahil etmek için bunları oem_system.mk
dosyasının kendisinde veya dahil edilen bir makefile içinde tanımlamanız gerekir. İzin verilmeyen yollara modül yükleme girişimleri derleme kesintilerine neden olur. Kesintileri düzeltmek için aşağıdakilerden birini yapın:
Seçenek 1: Sistem modülünü
oem_system.mk
dosyasındaki makefile dosyalarına ekleyin. Bu, yapay yol gereksiniminin karşılanmasını sağlar (modüller artık dahil edilen bir makefile içinde mevcut olduğundan) ve böylece 'yolda-yapıları-gerektir' içindeki yol kümesine kurulum yapılmasına izin verir.Seçenek 2: Modülleri
system_ext
veyaproduct
bölümüne yükleyin (ve modüllerisystem
bölümüne kurmayın).3. Seçenek:
PRODUCT_ARTIFACT_PATH_REQUIREMENT_ALLOWED_LIST
modüller ekleyin. Bu, kurulmasına izin verilen modülleri listeler.
2. Adım: İzin verilenler listesini boşaltın
Bu adımda, oem_system.mk
paylaşan tüm cihazların aynı zamanda tek bir system
görüntüsünü de paylaşabilmesi için PRODUCT_ARTIFACT_PATH_REQUIREMENT_ALLOWED_LIST
boş bırakırsınız. İzin verilenler listesini boşaltmak için listedeki tüm modülleri system_ext
veya product
bölümüne taşıyın veya bunları system
yapım dosyalarına ekleyin. Ürün arayüzü uygulamasını etkinleştirmek için ortak bir system
görüntüsünün tanımlanması gerekmediğinden bu adım isteğe bağlıdır. Ancak izin verilenler listesinin boşaltılması, system
sınırını system_ext
ile tanımlamak için faydalıdır.
3. Adım: Yerel arayüzleri zorunlu kılın
Bu adımda PRODUCT_PRODUCT_VNDK_VERSION := current
ayarını yapar, ardından derleme ve çalışma zamanı hatalarını arar ve bunları çözersiniz. Cihaz önyüklemesini ve günlüklerini kontrol etmek ve çalışma zamanı bağlantı hatalarını bulup düzeltmek için:
PRODUCT_PRODUCT_VNDK_VERSION := current
ayarlayın.Cihazı oluşturun ve derleme hatalarını arayın. Eksik ürün çeşitleri veya temel çeşitler için birkaç derleme molası görmeniz muhtemeldir. Ortak molalar şunları içerir:
-
product_specific: true
sahip herhangi birhidl_interface
modülü, sistem modülleri için kullanılamaz. Düzeltmek için,product_specific: true
system_ext_specfic: true
ile değiştirin. - Modüllerde, ürün modülleri için gereken ürün çeşidi eksik olabilir. Düzeltmek için,
product_available: true
ayarını yaparak bu modülüproduct
bölümünde kullanılabilir hale getirin veyaproduct_specific: true
ayarını yaparak modülüproduct
bölümüne taşıyın.
-
Derleme hatalarını çözün ve cihazın başarıyla oluşturulduğundan emin olun.
Görüntüyü flaşlayın ve cihazın önyüklemesinde ve günlüklerinde çalışma zamanı hatalarını arayın.
- Test senaryosu günlüğündeki
linker
etiketiCANNOT LINK EXECUTABLE
iletisini gösteriyorsa, make dosyasında bir bağımlılık eksiktir (ve derleme sırasında yakalanmamıştır). - Derleme sisteminden kontrol etmek için gerekli kitaplığı
shared_libs:
veyarequired:
alanına ekleyin.
- Test senaryosu günlüğündeki
Yukarıda verilen kılavuzu kullanarak eksik bağımlılıkları çözün.
4. Adım: Java arayüzlerini zorunlu kılın
Bu adımda PRODUCT_ENFORCE_PRODUCT_PARTITION_INTERFACE := true
ayarını yaparsınız, ardından ortaya çıkan derleme hatalarını bulup düzeltirsiniz. İki spesifik hata türünü arayın:
Bağlantı türü hataları. Bu hata, bir uygulamanın daha geniş bir
sdk_version
sahip Java modüllerine bağlandığını gösterir. Düzeltmek için uygulamanınsdk_version
genişletebilir veya kitaplığınsdk_version
kısıtlayabilirsiniz. Örnek hata: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.
Sembol hataları. Bu hata, bir sembolün gizli bir API'de olması nedeniyle bulunamadığını gösterir. Düzeltmek için görünür (gizli olmayan) bir API kullanın veya bir alternatif bulun. Örnek hata:
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
5. Adım: Çalışma zamanı davranışlarını kontrol edin
Bu adımda çalışma zamanı davranışlarının beklendiği gibi olduğunu doğrularsınız. Hata ayıklaması yapılabilen uygulamalar için, StrictMode.detectNonSdkApiUsage
(uygulama gizli bir API kullandığında bir günlük oluşturur) kullanarak gizli API kullanımını günlük yoluyla izleyebilirsiniz. Alternatif olarak, kullanım türünü (bağlantı veya yansıma), kısıtlama düzeyini ve çağrı yığınını öğrenmek için veridex statik analiz aracını kullanabilirsiniz.
Veridex sözdizimi:
./art/tools/veridex/appcompat.sh --dex-file={apk file}
Örnek veridex sonucu:
#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;
Veridex kullanımına ilişkin ayrıntılar için Veridex aracını kullanarak test etme bölümüne bakın.
Adım 6: Device.mk'yi güncelleyin
Tüm derleme ve çalışma zamanı hatalarını düzelttikten ve çalışma zamanı davranışlarının beklendiği gibi olduğunu doğruladıktan sonra, device.mk
dosyasında aşağıdakileri ayarlayın:
-
PRODUCT_PRODUCT_VNDK_VERSION := current
-
PRODUCT_ENFORCE_PRODUCT_PARTITION_INTERFACE := true