Mengaktifkan VNDK

Vendor Native Development Kit (VNDK) memerlukan beberapa perubahan pada codebase untuk memisahkan kekhawatiran antara vendor dan sistem. Gunakan panduan berikut untuk mengaktifkan VNDK di vendor/OEM saat ini.

Membangun library sistem

Sistem build berisi beberapa jenis objek termasuk library (bersama, statis, atau header) dan biner.

Membangun library sistem

Gambar 1. Bangun library sistem.

  • Library core digunakan oleh image sistem, pada image sistem. Ini library tidak dapat digunakan oleh vendor, vendor_available, vndk, atau vndk-sp library.
    cc_library {
        name: "libThatIsCore",
        ...
    }
    
  • Library vendor-only (atau proprietary) digunakan oleh gambar vendor, pada gambar vendor.
    cc_library {
        name: "libThatIsVendorOnly",
        proprietary: true,
        # or: vendor: true, # (for things in AOSP)
        ...
    }
    
  • Library vendor_available digunakan oleh image vendor, di vendor gambar (mungkin berisi duplikat dari core).
    cc_library {
        name: "libThatIsVendorAvailable",
        vendor_available: true,
        ...
    }
    
  • Library vndk digunakan oleh image vendor, di image sistem.
    cc_library {
        name: "libThatIsVndk",
        vendor_available: true,
        vndk: {
            enabled: true,
        }
        ...
    }
    
  • Library vndk-sp digunakan oleh image vendor, dan juga oleh image sistem secara tidak langsung.
    cc_library {
        name: "libThatIsVndkSp",
        vendor_available: true,
        vndk: {
            enabled: true,
            support_system_process: true,
        }
        ...
    }
    
  • Library llndk digunakan oleh image sistem dan vendor.
    cc_library {
        name: "libThatIsLlndk",
        llndk: {
            symbol_file: "libthatisllndk.map.txt"
        }
        ...
    }
    

Jika library ditandai sebagai vendor_available:true, library tersebut telah dibuat dua kali:

  • Sekali untuk platform (dan diinstal ke /system/lib)
  • Sekali untuk vendor (dan dengan demikian diinstal ke /vendor/lib atau VNDK APEX)

Versi vendor library dibuat dengan -D__ANDROID_VNDK__. Komponen sistem pribadi yang mungkin berubah secara signifikan dalam versi mendatang Android dinonaktifkan dengan tanda ini. Selain itu, pustaka yang berbeda mengekspor kumpulan header yang berbeda (seperti liblog). Opsi khusus untuk varian vendor dari target dapat ditentukan dalam file Android.bp dalam:

target: { vendor: { … } }

Mengaktifkan VNDK untuk codebase

Untuk mengaktifkan VNDK untuk codebase:

  1. Tentukan kelayakan dengan menghitung ukuran yang diperlukan Partisi vendor.img dan system.img.
  2. Aktifkan BOARD_VNDK_VERSION=current. Anda dapat menambahkan ke BoardConfig.mk atau buat komponen dengannya secara langsung (misalnya, m -j BOARD_VNDK_VERSION=current MY-LIB).

Setelah mengaktifkan BOARD_VNDK_VERSION=current, sistem build memberlakukan persyaratan dependensi dan header berikut.

Mengelola dependensi

Objek vendor yang bergantung pada komponen core yang tidak ada di vndk atau sebagai objek vendor harus diselesaikan menggunakan salah satu opsi berikut:

  • Dependensi dapat dihapus.
  • Jika komponen core dimiliki oleh vendor, komponen tersebut dapat ditandai sebagai vendor_available atau vendor.
  • Perubahan yang menjadikan objek inti sebagai bagian dari vndk mungkin di-upstream ke Google.

Selain itu, jika komponen core memiliki dependensi pada Komponen vendor, komponen vendor harus dibuat ke dalam komponen core atau dependensi harus dihapus dengan cara lain (misalnya, dengan menghapus dependensi atau dengan memindahkan dependensi ke dalam komponen vendor).

Kelola header

Dependensi header global harus dihapus agar sistem build mengetahuinya apakah akan membuat header dengan atau tanpa -D__ANDROID_VNDK__. Misalnya, header libutils seperti utils/StrongPointer.h dapat masih dapat diakses menggunakan library header libutils_headers.

Beberapa header (seperti unistd.h) tidak dapat lagi disertakan secara transitif tetapi dapat disertakan secara lokal.

Terakhir, bagian publik dari private/android_filesystem_config.h telah dipindahkan ke cutils/android_filesystem_config.h. Untuk mengelola {i>header<i} ini, lakukan salah satu hal berikut:

  • Hapus dependensi untuk private/android_filesystem_config.h dengan mengganti semua AID_* makro dengan getgrnam/ Panggilan getpwnam jika memungkinkan. Contoh:
    • (uid_t)AID_WIFI menjadi getpwnam("wifi")->pw_uid.
    • (gid_t)AID_SDCARD_R menjadi getgrnam("sdcard_r")->gr_gid.
    Untuk mengetahui detailnya, lihat private/android_filesystem_config.h.
  • Untuk AIS hard code, sertakan cutils/android_filesystem_config.h.