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.

Membangun perpustakaan sistem

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

Membangun perpustakaan sistem
Gambar 1. Membangun perpustakaan sistem
  • perpustakaan 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",
        ...
    }
    
  • perpustakaan vendor-only (atau proprietary ) digunakan oleh gambar vendor, pada gambar vendor.
    cc_library {
        name: "libThatIsVendorOnly",
        proprietary: true,
        # or: vendor: true, # (for things in AOSP)
        ...
    }
    
  • pustaka vendor_available digunakan oleh image vendor, pada image vendor (mungkin berisi duplikat core ).
    cc_library {
        name: "libThatIsVendorAvailable",
        vendor_available: true,
        ...
    }
    
  • Pustaka vndk digunakan oleh image vendor, pada image sistem.
    cc_library {
        name: "libThatIsVndk",
        vendor_available: true,
        vndk: {
            enabled: true,
        }
        ...
    }
    
  • Pustaka 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,
        }
        ...
    }
    
  • Pustaka llndk digunakan oleh image sistem dan vendor.
    cc_library {
        name: "libThatIsLlndk",
        llndk: {
            symbol_file: "libthatisllndk.map.txt"
        }
        ...
    }
    

Saat lib ditandai sebagai vendor_available:true , lib tersebut dibuat dua kali:

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

Lib versi vendor 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 membuat komponen secara langsung (misalnya, m -j BOARD_VNDK_VERSION=current MY-LIB ).

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

Mengelola ketergantungan

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

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

Selain itu, jika komponen core mempunyai ketergantungan pada komponen vendor , maka komponen vendor tersebut harus dijadikan komponen core atau ketergantungan tersebut harus dihilangkan dengan cara lain (misalnya dengan menghilangkan ketergantungan atau dengan memindahkan ketergantungan tersebut ke dalam komponen vendor . ).

Mengelola header

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

Beberapa header (seperti unistd.h ) tidak lagi dapat disertakan secara transitif namun 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 pada private/android_filesystem_config.h dengan mengganti semua makro AID_* dengan panggilan getgrnam / getpwnam jika memungkinkan. Misalnya:
    • (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 dengan kode keras, sertakan cutils/android_filesystem_config.h .