VNDK'yı etkinleştir

Tedarikçi Yerel Geliştirme Kiti (VNDK), tedarikçi ve sistem arasındaki endişeleri ayırmak için kod tabanınızda birkaç değişiklik yapılmasını gerektirir. VNDK'yı bir tedarikçi/OEM kod tabanında 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ürleri içerir.

Sistem kitaplıkları oluşturma

Şekil 1. Sistem kitaplıkları oluşturma

  • core kitaplıkları, sistem görüntüsü tarafından sistem görüntüsünde 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ı, tedarikçi firma resmi tarafından tedarikçi firma resminde kullanılır.
    cc_library {
        name: "libThatIsVendorOnly",
        proprietary: true,
        # or: vendor: true, # (for things in AOSP)
        ...
    }
  • vendor_available kitaplıkları, tedarikçi firma resminde tedarikçi firma tarafından kullanılır (core öğelerinin kopyalarını içerebilir).
    cc_library {
        name: "libThatIsVendorAvailable",
        vendor_available: true,
        ...
    }
  • vndk kitaplıkları, sistem görüntüsünde tedarikçi firma görüntüsü tarafından kullanılır.
    cc_library {
        name: "libThatIsVndk",
        vendor_available: true,
        vndk: {
            enabled: true,
        }
        ...
    }
  • vndk-sp kitaplıkları, tedarikçi firma resmi tarafından 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 tedarikçi firma 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 derlenir:

  • Platform için bir kez (ve dolayısıyla /system/lib'e 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 grubunu (liblog gibi) dışa aktarır. Bir hedefin tedarikçi varyantına özgü seçenekler, Android.bp dosyasında aşağıdakiler için 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'e ekleme yapabilir veya doğrudan BoardConfig.mk ile bileşen 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ı uygular.

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

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

  • Bağımlılık kaldırılabilir.
  • core bileşeninin sahibi vendor ise vendor_available veya vendor olarak işaretlenebilir.
  • Temel nesneyi vndk'ün bir parçası haline getiren bir değişiklik, Google'a aktarılabilir.

Ayrıca, bir core bileşeninin vendor bileşenine bağımlılıkları varsa vendor bileşeni core bileşeni haline getirilmeli 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 bir 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ı kaldırılmalıdır. Örneğin, utils/StrongPointer.h gibi libutils üstbilgilerine, üstbilgi kitaplığı libutils_headers kullanılarak yine erişilebilir.

Bazı üstbilgiler (unistd.h gibi) artık aktarmalı olarak dahil edilemez ancak yerel olarak dahil edilebilir.

Son olarak, private/android_filesystem_config.h hesabının herkese açık kısmı cutils/android_filesystem_config.h hesabına taşındı. Bu üstbilgileri yönetmek için aşağıdakilerden birini yapın:

  • Mümkünse tüm AID_* makrolarını getgrnam/getpwnam çağrılarıyla değiştirerek private/android_filesystem_config.h bağımlılığını kaldırın. Ö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 değerini ekleyin.