Mengaktifkan VNDK

VNDK memerlukan beberapa perubahan pada basis kode untuk memisahkan masalah antara vendor dan sistem. Gunakan panduan berikut untuk mengaktifkan VNDK di basis kode vendor/OEM.

Bangun perpustakaan sistem

Sistem pembangunan berisi beberapa jenis objek termasuk perpustakaan (bersama, statis, atau header) dan binari.

Bangun perpustakaan sistem
Gambar 1. Membangun perpustakaan sistem
  • pustaka core digunakan oleh citra sistem, pada citra sistem. Pustaka ini tidak dapat digunakan oleh pustaka vendor , vendor_available , vndk , atau vndk-sp .
    cc_library {
        name: "libThatIsCore",
        ...
    }
    
  • pustaka vendor-only (atau proprietary ) digunakan oleh citra vendor, pada citra vendor.
    cc_library {
        name: "libThatIsVendorOnly",
        proprietary: true,
        # or: vendor: true, # (for things in AOSP)
        ...
    }
    
  • pustaka vendor_available digunakan oleh citra vendor, pada citra vendor (mungkin berisi duplikat core ).
    cc_library {
        name: "libThatIsVendorAvailable",
        vendor_available: true,
        ...
    }
    
  • Pustaka vndk digunakan oleh gambar vendor, pada gambar sistem.
    cc_library {
        name: "libThatIsVndk",
        vendor_available: true,
        vndk: {
            enabled: true,
        }
        ...
    }
    
  • vndk-sp digunakan oleh gambar vendor, dan juga oleh gambar sistem secara tidak langsung.
    cc_library {
        name: "libThatIsVndkSp",
        vendor_available: true,
        vndk: {
            enabled: true,
            support_system_process: true,
        }
        ...
    }
    
  • Pustaka llndk digunakan oleh gambar sistem dan vendor.
    llndk_library {
        name: "libThatIsLlndk",
    }
    

Ketika lib ditandai sebagai vendor_available:true , itu dibangun dua kali:

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

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

target: { vendor: { … } }

Mengaktifkan VNDK untuk basis kode

Untuk mengaktifkan VNDK untuk basis kode:

  1. Tentukan kelayakan dengan menghitung ukuran partisi vendor.img dan system.img yang diperlukan.
  2. Aktifkan BOARD_VNDK_VERSION=current . Anda dapat menambahkan ke BoardConfig.mk atau membangun 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:

  • Ketergantungan dapat dihilangkan.
  • Jika komponen core dimiliki oleh vendor , dapat ditandai sebagai vendor_available atau vendor .
  • Perubahan yang membuat objek inti menjadi bagian dari vndk dapat di-upstream ke Google.

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

Mengelola header

Dependensi tajuk global harus dihapus agar sistem pembangunan dapat mengetahui apakah akan membuat tajuk dengan atau tanpa -D__ANDROID_VNDK__ . Misalnya, header libutils seperti utils/StrongPointer.h masih dapat diakses menggunakan pustaka 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 header ini, lakukan salah satu hal berikut:

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