VNDK'yı etkinleştirme

Tedarikçi Yerel Geliştirme Kiti (VNDK), tedarikçi ve sistem arasındaki endişeleri ayırmak için kod tabanında çeşitli değişiklikler yapılmasını gerektirir. Tedarikçi/OEM kod tabanında VNDK'yı etkinleştirmek için aşağıdaki kılavuzu kullanın.

Sistem kitaplıkları oluşturma

Derleme sistemi, kitaplıklar (paylaşılan, statik veya başlık) ve ikili dosyalar dahil olmak üzere çeşitli nesne türlerini içerir.

Sistem kitaplıkları oluşturma

1. şekil. Sistem kitaplıkları oluşturun.

  • core kitaplıkları, sistem görüntüsünde sistem görüntüsü tarafından kullanılır. Bu kitaplıklar vendor, vendor_available, vndk veya vndk-sp kitaplıkları tarafından kullanılamaz.
    cc_library {
        name: "libThatIsCore",
        ...
    }
  • vendor-only (veya proprietary) kitaplıkları, satıcı resminde satıcı resmi tarafından kullanılır.
    cc_library {
        name: "libThatIsVendorOnly",
        proprietary: true,
        # or: vendor: true, # (for things in AOSP)
        ...
    }
  • vendor_available kitaplıkları, tedarikçi resminde ve tedarikçi resminde (core öğesinin kopyalarını içerebilir) kullanılıyor.
    cc_library {
        name: "libThatIsVendorAvailable",
        vendor_available: true,
        ...
    }
  • vndk kitaplıkları, sistem görüntüsünde satıcı görüntüsü tarafından kullanılır.
    cc_library {
        name: "libThatIsVndk",
        vendor_available: true,
        vndk: {
            enabled: true,
        }
        ...
    }
  • vndk-sp kitaplıkları, satıcı resmi ve dolaylı olarak sistem resmi tarafından kullanılır.
    cc_library {
        name: "libThatIsVndkSp",
        vendor_available: true,
        vndk: {
            enabled: true,
            support_system_process: true,
        }
        ...
    }
  • llndk kitaplıkları hem sistem hem de satıcı resimleri tarafından kullanılır.
    cc_library {
        name: "libThatIsLlndk",
        llndk: {
            symbol_file: "libthatisllndk.map.txt"
        }
        ...
    }

Bir kitaplık vendor_available:true olarak işaretlendiğinde iki kez oluşturulur:

  • Platform için bir kez (bu nedenle /system/lib'ya yüklenir)
  • Tedarikçi için bir kez (ve bu nedenle /vendor/lib veya VNDK APEX'e yüklenir)

Kitaplıkların tedarikçi sürümleri -D__ANDROID_VNDK__ ile oluşturulur. Android'in gelecekteki sürümlerinde önemli ölçüde değişebilecek özel sistem bileşenleri bu işaretle devre dışı bırakılır. Ayrıca, farklı kitaplıklar farklı bir üstbilgi grubu (ör. liblog) dışa aktarır. Bir hedefin satıcı varyantına özgü seçenekler, Android.bp dosyasında belirtilebilir:

target: { vendor: { … } }

Bir kod tabanı için VNDK'yı etkinleştirme

Bir kod tabanı için VNDK'yı etkinleştirmek üzere:

  1. vendor.img ve system.img bölümlerinin gerekli boyutlarını hesaplayarak uygunluğu belirleyin.
  2. BOARD_VNDK_VERSION=current özelliğini etkinleştirin. BoardConfig.mk öğesine ekleyebilir veya doğrudan bileşenler oluşturabilirsiniz (örneğin, m -j BOARD_VNDK_VERSION=current MY-LIB).

BOARD_VNDK_VERSION=current etkinleştirildikten sonra derleme sistemi aşağıdaki bağımlılık ve başlık koşullarını zorunlu kılar.

Bağımlılıkları yönetme

vndk'de veya vendor nesnesi olarak bulunmayan bir core bileşenine bağlı olan bir vendor nesnesi, aşağıdaki seçeneklerden biri kullanılarak çözülmelidir:

  • Bağımlılık kaldırılabilir.
  • core bileşeni vendor'ye aitse vendor_available veya vendor olarak işaretlenebilir.
  • Temel nesneyi vndk'nın parçası haline getiren bir değişiklik Google'a gönderilebilir.

Ayrıca, bir core bileşeninin bir vendor bileşenine bağımlılıkları varsa vendor bileşeni core bileşenine dönüştürülmeli veya bağımlılık başka bir şekilde kaldırılmalıdır (örneğin, bağımlılık kaldırılarak veya bağımlılık vendor bileşenine taşınarak).

Üstbilgileri yönetme

Derleme sisteminin, başlıkları -D__ANDROID_VNDK__ ile mi yoksa -D__ANDROID_VNDK__ olmadan mı derleyeceğini bilmesi için genel başlık bağımlılıklarının kaldırılması gerekir. Örneğin, utils/StrongPointer.h gibi libutils üstbilgilerine, üstbilgi kitaplığı libutils_headers kullanılarak erişilebilir.

Bazı başlıklar (ör. unistd.h) artık geçişli olarak dahil edilemez ancak yerel olarak dahil edilebilir.

Son olarak, private/android_filesystem_config.h adresinin herkese açık kısmı cutils/android_filesystem_config.h adresine taşındı. Bu başlıkları yönetmek için aşağıdakilerden birini yapın:

  • Mümkünse tüm private/android_filesystem_config.h makrolarını getgrnam/getpwnam çağrılarıyla değiştirerek private/android_filesystem_config.h bağımlılığını kaldırın.AID_* Örneğin:
    • (uid_t)AID_WIFI, getpwnam("wifi")->pw_uid olur.
    • (gid_t)AID_SDCARD_R, getgrnam("sdcard_r")->gr_gid olur.
    Ayrıntılı bilgi için private/android_filesystem_config.h başlıklı makaleyi inceleyin.
  • Sabit kodlu AIS için cutils/android_filesystem_config.h öğesini ekleyin.