Google berkomitmen untuk memajukan ekuitas ras untuk komunitas kulit hitam. Lihat bagaimana.
Halaman ini diterjemahkan oleh Cloud Translation API.
Switch to English

Dukungan Sistem Bangun VNDK

Di Android 8.1 dan lebih tinggi, sistem build memiliki dukungan VNDK bawaan. Ketika dukungan VNDK diaktifkan, sistem build memeriksa dependensi antar modul, membangun varian khusus vendor untuk modul vendor, dan secara otomatis menginstal modul-modul tersebut ke direktori yang ditunjuk.

VNDK membangun contoh dukungan

Dalam contoh ini, definisi modul Android.bp mendefinisikan perpustakaan bernama libexample . Properti vendor_available menunjukkan modul kerangka kerja dan modul vendor mungkin bergantung pada libexample :

libexample vendor_available: true dan vndk.enabled: true

Gambar 1. Dukungan VNDK diaktifkan

Baik framework executable /system/bin/foo dan executable /vendor/bin/bar bergantung pada libexample dan memiliki libexample di properti shared_libs mereka.

Jika libexample digunakan oleh modul kerangka kerja dan modul vendor, dua varian libexample dibangun. Varian inti (dinamai setelah libexample ) digunakan oleh modul kerangka kerja dan varian vendor (dinamai setelah libexample.vendor ) digunakan oleh modul vendor. Dua varian diinstal ke direktori yang berbeda:

  • Varian inti diinstal ke /system/lib[64]/libexample.so .
  • Varian vendor diinstal ke /system/lib[64]/vndk/libexample.so karena vndk.enabled true .

Untuk detail lebih lanjut, lihat Definisi modul .

Mengonfigurasi dukungan build

Untuk mengaktifkan dukungan sistem pembangunan lengkap untuk perangkat produk, tambahkan BOARD_VNDK_VERSION ke BoardConfig.mk :

BOARD_VNDK_VERSION := current

Pengaturan ini memiliki efek global : Ketika didefinisikan dalam BoardConfig.mk , semua modul diperiksa. Karena tidak ada mekanisme untuk membuat daftar hitam atau membuat daftar putih modul yang melanggar, Anda harus membersihkan semua dependensi yang tidak perlu sebelum menambahkan BOARD_VNDK_VERSION . Anda dapat menguji dan menyusun modul dengan menetapkan BOARD_VNDK_VERSION dalam variabel lingkungan Anda:

$ BOARD_VNDK_VERSION=current m module_name.vendor

Ketika BOARD_VNDK_VERSION diaktifkan, beberapa jalur pencarian header global default dihapus . Ini termasuk:

  • frameworks/av/include
  • frameworks/native/include
  • frameworks/native/opengl/include
  • hardware/libhardware/include
  • hardware/libhardware_legacy/include
  • hardware/ril/include
  • libnativehelper/include
  • libnativehelper/include_deprecated
  • system/core/include
  • system/media/audio/include

Jika modul bergantung pada header dari direktori ini, Anda harus menentukan (secara eksplisit) dependensi dengan header_libs , static_libs , dan / atau shared_libs .

Definisi modul

Untuk membangun Android dengan BOARD_VNDK_VERSION , Anda harus merevisi definisi modul di Android.mk atau Android.bp . Bagian ini menjelaskan berbagai jenis definisi modul, beberapa properti modul terkait VNDK, dan pemeriksaan dependensi yang diterapkan dalam sistem build.

Modul vendor

Modul vendor adalah executable khusus vendor atau pustaka bersama yang harus diinstal ke dalam partisi vendor. Dalam file Android.bp , modul vendor harus mengatur vendor atau properti eksklusif menjadi true . Dalam file Android.mk , modul vendor harus menetapkan LOCAL_VENDOR_MODULE atau LOCAL_PROPRIETARY_MODULE menjadi true .

Jika BOARD_VNDK_VERSION didefinisikan, sistem build tidak mengizinkan dependensi antara modul vendor dan modul framework dan memancarkan kesalahan jika:

  • modul tanpa vendor:true tergantung pada modul dengan vendor:true , atau
  • modul dengan vendor:true tergantung pada modul non- llndk_library yang tidak memiliki vendor:true atau vendor_available:true .

Pemeriksaan dependensi berlaku untuk header_libs , static_libs , dan shared_libs di Android.bp , dan untuk LOCAL_HEADER_LIBRARIES , LOCAL_STATIC_LIBRARIES , dan LOCAL_SHARED_LIBRARIES di Android.mk .

LL-NDK

LL-NDK shared library adalah shared library dengan ABI yang stabil. Baik modul framework dan vendor berbagi implementasi yang sama dan yang terbaru. Untuk setiap pustaka bersama LL-NDK, Android.bp berisi definisi modul llndk_library :

llndk_library {
    name: "libvndksupport",
    symbol_file: "libvndksupport.map.txt",
}

Definisi modul ini menentukan nama modul dan file simbol yang menggambarkan simbol yang terlihat oleh modul vendor. Sebagai contoh:

LIBVNDKSUPPORT {
  global:
    android_load_sphal_library; # vndk
    android_unload_sphal_library; # vndk
  local:
    *;
};

Berdasarkan file simbol, sistem build menghasilkan pustaka bersama rintisan untuk modul vendor, yang terhubung dengan pustaka ini ketika BOARD_VNDK_VERSION diaktifkan. Simbol disertakan dalam pustaka bersama rintisan hanya jika:

  • Tidak didefinisikan di bagian akhir dengan _PRIVATE atau _PLATFORM ,
  • Tidak memiliki tag #platform-only , dan
  • Tidak memiliki tag #introduce* atau tag yang cocok dengan target.

VNDK

Dalam file Android.bp , cc_library , cc_library_static , cc_library_shared , dan definisi modul cc_library_headers mendukung tiga properti terkait vendor_available : vendor_available , vndk.enabled , dan vndk.support_system_process .

Jika vendor_available atau vndk.enabled true , dua varian ( inti dan vendor ) dapat dibangun. Varian inti harus diperlakukan sebagai modul kerangka kerja dan varian vendor harus diperlakukan sebagai modul vendor. Jika beberapa modul kerangka kerja tergantung pada modul ini, varian inti dibangun. Jika beberapa modul vendor bergantung pada modul ini, varian vendor dibuat. Sistem build memberlakukan pemeriksaan dependensi berikut:

  • Varian inti selalu hanya kerangka dan tidak dapat diakses oleh modul vendor.
  • Varian vendor selalu tidak dapat diakses untuk modul kerangka kerja.
  • Semua dependensi varian vendor, yang ditentukan dalam header_libs , static_libs , dan / atau shared_libs , harus berupa llndk_library atau modul dengan vendor_available atau vndk.enabled .
  • Jika vendor_available true , varian vendor dapat diakses oleh semua modul vendor.
  • Jika vendor_available false , varian vendor hanya dapat diakses oleh modul VNDK atau VNDK-SP lainnya (yaitu, modul dengan vendor:true tidak dapat menautkan vendor_available:false modul vendor_available:false ).

Jalur instalasi default untuk cc_library atau cc_library_shared ditentukan oleh aturan berikut:

  • Varian inti diinstal ke /system/lib[64] .
  • Jalur pemasangan varian vendor dapat bervariasi:
    • Jika vndk.enabled false , varian vendor diinstal ke /vendor/lib[64] .
    • Jika vndk.enabled true , vndk.support_system_process dapat true atau false . Jika:
      • false , varian vendor diinstal ke /system/lib[64]/vndk-${VER} .
      • true , varian vendor diinstal ke /system/lib[64]/vndk-sp-${VER} .

Tabel di bawah ini merangkum bagaimana sistem build menangani varian vendor:

vendor_available vndk
diaktifkan
vndk
proses support_same_
Deskripsi varian vendor
true false false Varian vendor adalah VND-ONLY . Pustaka bersama dipasang ke /vendor/lib[64] .
true Tidak Valid (Bangun galat)
true false Varian vendor adalah VNDK . Pustaka bersama dipasang ke /system/lib[64]/vndk-${VER} .
true Varian vendor adalah VNDK-SP . Pustaka bersama dipasang ke /system/lib[64]/vndk-sp-${VER} .

false

false

false

Tidak ada varian vendor. Modul ini HANYA FWK .

true Tidak Valid (Bangun galat)
true false Varian vendor adalah VNDK-Private . Pustaka bersama dipasang ke /system/lib[64]/vndk-${VER} . Ini tidak boleh langsung digunakan oleh modul vendor.
true Varian vendor adalah VNDK-SP-Private . Pustaka bersama dipasang ke /system/lib[64]/vndk-sp-${VER} . Ini tidak boleh langsung digunakan oleh modul vendor.

Ekstensi VNDK

Ekstensi VNDK adalah pustaka bersama VNDK dengan API tambahan. Ekstensi diinstal ke /vendor/lib[64]/vndk[-sp] (tanpa akhiran versi) dan menimpa pustaka bersama VNDK asli saat runtime.

Menentukan ekstensi VNDK

Di Android 9 dan lebih tinggi, Android.bp secara alami mendukung ekstensi VNDK. Untuk membangun ekstensi VNDK, tentukan modul lain dengan vendor:true dan properti extends :

cc_library {
    name: "libvndk",
    vendor_available: true,
    vndk: {
        enabled: true,
    },
}

cc_library {
    name: "libvndk_ext",
    vendor: true,
    vndk: {
        enabled: true,
        extends: "libvndk",
    },
}

Modul dengan vendor:true , vndk.enabled:true , dan extends properties mendefinisikan ekstensi VNDK:

  • Properti extends harus menentukan nama pustaka bersama VNDK dasar (atau nama pustaka bersama VNDK-SP).
  • Ekstensi VNDK (atau ekstensi VNDK-SP) dinamai berdasarkan nama modul dasar dari mana mereka memperluas. Sebagai contoh, biner keluaran libvndk_ext adalah libvndk.so bukan libvndk_ext.so .
  • Ekstensi VNDK diinstal ke /vendor/lib[64]/vndk .
  • Ekstensi VNDK-SP diinstal ke /vendor/lib[64]/vndk-sp .
  • Pustaka bersama dasar harus memiliki vndk.enabled:true dan vendor_available:true .

Ekstensi VNDK-SP harus diperluas dari pustaka bersama VNDK-SP ( vndk.support_system_process harus sama):

cc_library {
    name: "libvndk_sp",
    vendor_available: true,
    vndk: {
        enabled: true,
        support_system_process: true,
    },
}

cc_library {
    name: "libvndk_sp_ext",
    vendor: true,
    vndk: {
        enabled: true,
        extends: "libvndk_sp",
        support_system_process: true,
    },
}

Ekstensi VNDK (atau ekstensi VNDK-SP) dapat bergantung pada pustaka bersama vendor lainnya:

cc_library {
    name: "libvndk",
    vendor_available: true,
    vndk: {
        enabled: true,
    },
}

cc_library {
    name: "libvndk_ext",
    vendor: true,
    vndk: {
        enabled: true,
        extends: "libvndk",
    },
    shared_libs: [
        "libvendor",
    ],
}

cc_library {
    name: "libvendor",
    vendor: true,
}

Menggunakan ekstensi VNDK

Jika modul vendor bergantung pada API tambahan yang ditentukan oleh ekstensi VNDK, modul harus menentukan nama ekstensi VNDK di properti shared_libs :

// A vendor shared library example
cc_library {
    name: "libvendor",
    vendor: true,
    shared_libs: [
        "libvndk_ext",
    ],
}

// A vendor executable example
cc_binary {
    name: "vendor-example",
    vendor: true,
    shared_libs: [
        "libvndk_ext",
    ],
}

Jika modul vendor tergantung pada ekstensi VNDK, ekstensi VNDK tersebut diinstal ke /vendor/lib[64]/vndk[-sp] secara otomatis. Jika modul tidak lagi bergantung pada ekstensi VNDK, tambahkan langkah bersih ke CleanSpec.mk untuk menghapus perpustakaan bersama. Sebagai contoh:

$(call add-clean-step, rm -rf $(TARGET_OUT_VENDOR)/lib/libvndk.so)

Kompilasi bersyarat

Bagian ini menjelaskan cara menangani perbedaan halus (misalnya menambah atau menghapus fitur dari salah satu varian) antara tiga pustaka bersama VNDK berikut:

  • Varian inti (mis. /system/lib[64]/libexample.so )
  • Varian vendor (mis. /system/lib[64]/vndk[-sp]-${VER}/libexample.so )
  • Ekstensi VNDK (misalnya /vendor/lib[64]/vndk[-sp]/libexample.so )

Bendera kompiler kondisional

Sistem Android build mendefinisikan __ANDROID_VNDK__ untuk varian vendor dan ekstensi VNDK secara default. Anda dapat menjaga kode dengan penjaga preprosesor C:

void all() { }

#if !defined(__ANDROID_VNDK__)
void framework_only() { }
#endif

#if defined(__ANDROID_VNDK__)
void vndk_only() { }
#endif

Selain __ANDROID_VNDK__ , berbeda cflags atau cppflags dapat ditentukan dalam Android.bp . The cflags atau cppflags ditentukan dalam target.vendor khusus untuk vendor varian.

Misalnya, Android.bp berikut mendefinisikan libexample dan libexample_ext :

cc_library {
    name: "libexample",
    srcs: ["src/example.c"],
    vendor_available: true,
    vndk: {
        enabled: true,
    },
    target: {
        vendor: {
            cflags: ["-DLIBEXAMPLE_ENABLE_VNDK=1"],
        },
    },
}

cc_library {
    name: "libexample_ext",
    srcs: ["src/example.c"],
    vendor: true,
    vndk: {
        enabled: true,
        extends: "libexample",
    },
    cflags: [
        "-DLIBEXAMPLE_ENABLE_VNDK=1",
        "-DLIBEXAMPLE_ENABLE_VNDK_EXT=1",
    ],
}

Dan ini adalah daftar kode src/example.c :

void all() { }

#if !defined(LIBEXAMPLE_ENABLE_VNDK)
void framework_only() { }
#endif

#if defined(LIBEXAMPLE_ENABLE_VNDK)
void vndk() { }
#endif

#if defined(LIBEXAMPLE_ENABLE_VNDK_EXT)
void vndk_ext() { }
#endif

Menurut dua file ini, sistem build menghasilkan perpustakaan bersama dengan simbol yang diekspor berikut:

Jalur pemasangan Simbol yang diekspor
/system/lib[64]/libexample.so all , framework_only
/system/lib[64]/vndk-${VER}/libexample.so all , vndk
/vendor/lib[64]/vndk/libexample.so all , vndk , vndk_ext

Persyaratan pada simbol yang diekspor

VNDK ABI checker membandingkan ABI dari varian vendor VNDK dan ekstensi VNDK dengan referensi ABI dumps di bawah prebuilts/abi-dumps/vndk .

  • Simbol yang diekspor oleh varian vendor VNDK (mis. /system/lib[64]/vndk-${VER}/libexample.so ) harus identik dengan (bukan superset dari) simbol yang didefinisikan dalam ABI dumps.
  • Simbol yang diekspor oleh ekstensi VNDK (misalnya /vendor/lib[64]/vndk/libexample.so ) harus berupa superset dari simbol yang didefinisikan dalam dump ABI.

Jika varian vendor VNDK atau ekstensi VNDK gagal mengikuti persyaratan di atas, VNDK ABI checker memancarkan kesalahan build dan menghentikan build.

Tidak termasuk file sumber atau pustaka bersama dari varian vendor

Untuk mengecualikan file sumber dari varian vendor, tambahkan ke properti exclude_srcs . Demikian pula, untuk memastikan pustaka bersama tidak ditautkan dengan varian vendor, tambahkan pustaka tersebut ke properti exclude_shared_libs . Sebagai contoh:

cc_library {
    name: "libexample_cond_exclude",
    srcs: ["fwk.c", "both.c"],
    shared_libs: ["libfwk_only", "libboth"],
    target: {
        vendor: {
            exclude_srcs: ["fwk.c"],
            exclude_shared_libs: ["libfwk_only"],
        },
    },
}

Dalam contoh ini, varian inti libexample_cond_exclude menyertakan kode dari fwk.c dan both.c dan tergantung pada pustaka bersama libfwk_only dan libboth . Varian vendor libexample_cond_exclude hanya menyertakan kode dari both.c karena fwk.c dikecualikan oleh properti exclude_srcs . Demikian pula, libexample_cond_exclude hanya bergantung pada libboth perpustakaan bersama karena libfwk_only dikecualikan oleh properti exclude_shared_libs .

Ekspor header dari ekstensi VNDK

Ekstensi VNDK dapat menambahkan kelas baru atau fungsi baru ke pustaka bersama VNDK. Disarankan untuk menyimpan deklarasi tersebut di header independen dan menghindari mengubah header yang ada.

Misalnya, file header baru include-ext/example/ext/feature_name.h dibuat untuk ekstensi libexample_ext :

  • Android.bp
  • termasuk-ext / example / ext / feature_name.h
  • termasuk / example / example.h
  • src / example.c
  • src / ext / feature_name.c

Di Android.bp berikut, ekspor libexample hanya include , sedangkan ekspor libexample_ext keduanya include dan include-ext . Ini memastikan feature_name.h tidak akan salah dimasukkan oleh pengguna libexample :

cc_library {
    name: "libexample",
    srcs: ["src/example.c"],
    export_include_dirs: ["include"],
    vendor_available: true,
    vndk: {
        enabled: true,
    },
}

cc_library {
    name: "libexample_ext",
    srcs: [
        "src/example.c",
        "src/ext/feature_name.c",
    ],
    export_include_dirs: [
        "include",
        "include-ext",
    ],
    vendor: true,
    vndk: {
        enabled: true,
        extends: "libexample",
    },
}

Jika memisahkan ekstensi ke file header independen tidak memungkinkan, alternatifnya adalah menambahkan #ifdef penjaga. Namun, pastikan bahwa semua pengguna ekstensi VNDK menambahkan flag define. Anda dapat mendefinisikan cc_defaults untuk menambahkan flag define ke cflags dan menautkan pustaka bersama dengan shared_libs .

Misalnya, untuk menambahkan fungsi anggota baru Example2::get_b() ke ekstensi libexample2_ext , Anda harus memodifikasi file header yang ada dan menambahkan #ifdef guard:

#ifndef LIBEXAMPLE2_EXAMPLE_H_
#define LIBEXAMPLE2_EXAMPLE_H_

class Example2 {
 public:
  Example2();

  void get_a();

#ifdef LIBEXAMPLE2_ENABLE_VNDK_EXT
  void get_b();
#endif

 private:
  void *impl_;
};

#endif  // LIBEXAMPLE2_EXAMPLE_H_

cc_defaults bernama libexample2_ext_defaults didefinisikan untuk pengguna libexample2_ext :

cc_library {
    name: "libexample2",
    srcs: ["src/example2.cpp"],
    export_include_dirs: ["include"],
    vendor_available: true,
    vndk: {
        enabled: true,
    },
}

cc_library {
    name: "libexample2_ext",
    srcs: ["src/example2.cpp"],
    export_include_dirs: ["include"],
    vendor: true,
    vndk: {
        enabled: true,
        extends: "libexample2",
    },
    cflags: [
        "-DLIBEXAMPLE2_ENABLE_VNDK_EXT=1",
    ],
}

cc_defaults {
    name: "libexample2_ext_defaults",
    shared_libs: [
        "libexample2_ext",
    ],
    cflags: [
        "-DLIBEXAMPLE2_ENABLE_VNDK_EXT=1",
    ],
}

Para pengguna libexample2_ext dapat dengan mudah memasukkan libexample2_ext_defaults di properti defaults mereka:

cc_binary {
    name: "example2_user_executable",
    defaults: ["libexample2_ext_defaults"],
    vendor: true,
}

Paket produk

Dalam sistem Android build, variabel PRODUCT_PACKAGES menentukan executable, shared library, atau paket yang harus diinstal ke dalam perangkat. Ketergantungan transitif dari modul yang ditentukan juga secara implisit diinstal ke dalam perangkat.

Jika BOARD_VNDK_VERSION diaktifkan, modul dengan vendor_available atau vndk.enabled mendapatkan perlakuan khusus. Jika modul kerangka kerja bergantung pada modul dengan vendor_available atau vndk.enabled , varian inti disertakan dalam set instalasi transitif. Demikian pula, jika modul vendor tergantung pada modul dengan vendor_available atau vndk.enabled , varian vendor termasuk dalam set instalasi transitif.

Ketika dependensi tidak terlihat oleh sistem build (mis. Perpustakaan bersama yang dapat dibuka dengan dlopen() dalam runtime), Anda harus menentukan nama modul di PRODUCT_PACKAGES untuk menginstal modul-modul itu secara eksplisit.

Jika modul memiliki vendor_available atau vndk.enabled , nama modul adalah singkatan dari varian intinya. Untuk secara spesifik menentukan varian vendor di PRODUCT_PACKAGES , tambahkan akhiran .vendor ke nama modul. Sebagai contoh:

cc_library {
    name: "libexample",
    srcs: ["example.c"],
    vendor_available: true,
}

Dalam contoh ini, libexample adalah singkatan dari /system/lib[64]/libexample.so dan libexample.vendor adalah singkatan dari /vendor/lib[64]/libexample.so . Untuk menginstal /vendor/lib[64]/libexample.so , tambahkan libexample.vendor ke PRODUCT_PACKAGES :

PRODUCT_PACKAGES += libexample.vendor