Bật VNDK

Vendor Native Development Kit (VNDK) yêu cầu một số thay đổi đối với cơ sở mã để tách các mối lo ngại giữa nhà cung cấp và hệ thống. Hãy làm theo hướng dẫn sau để bật VNDK trong cơ sở mã của nhà cung cấp/OEM.

Thư viện hệ thống xây dựng

Hệ thống xây dựng chứa nhiều loại đối tượng, bao gồm cả thư viện (dùng chung, tĩnh hoặc tiêu đề) và tệp nhị phân.

Thư viện hệ thống xây dựng

Hình 1. Xây dựng các thư viện hệ thống.

  • Các thư viện core được dùng bởi hình ảnh hệ thống, trên hình ảnh hệ thống. vendor, vendor_available, vndk hoặc vndk-sp không thể dùng các thư viện này.
    cc_library {
        name: "libThatIsCore",
        ...
    }
  • Thư viện vendor-only (hoặc proprietary) được hình ảnh nhà cung cấp sử dụng, trên hình ảnh nhà cung cấp.
    cc_library {
        name: "libThatIsVendorOnly",
        proprietary: true,
        # or: vendor: true, # (for things in AOSP)
        ...
    }
  • Nhà cung cấp sử dụng thư viện vendor_available trên hình ảnh nhà cung cấp (có thể chứa bản sao của core).
    cc_library {
        name: "libThatIsVendorAvailable",
        vendor_available: true,
        ...
    }
  • Thư viện vndk được hình ảnh nhà cung cấp sử dụng trên hình ảnh hệ thống.
    cc_library {
        name: "libThatIsVndk",
        vendor_available: true,
        vndk: {
            enabled: true,
        }
        ...
    }
  • Hình ảnh nhà cung cấp và hình ảnh hệ thống đều sử dụng các thư viện vndk-sp một cách gián tiếp.
    cc_library {
        name: "libThatIsVndkSp",
        vendor_available: true,
        vndk: {
            enabled: true,
            support_system_process: true,
        }
        ...
    }
  • Cả hình ảnh hệ thống và hình ảnh nhà cung cấp đều sử dụng các thư viện llndk.
    cc_library {
        name: "libThatIsLlndk",
        llndk: {
            symbol_file: "libthatisllndk.map.txt"
        }
        ...
    }

Khi một thư viện được đánh dấu là vendor_available:true, thư viện đó sẽ được tạo hai lần:

  • Một lần cho nền tảng (và do đó được cài đặt vào /system/lib)
  • Một lần cho nhà cung cấp (và do đó được cài đặt vào /vendor/lib hoặc VNDK APEX)

Các phiên bản nhà cung cấp của lib được tạo bằng -D__ANDROID_VNDK__. Các thành phần hệ thống riêng tư có thể thay đổi đáng kể trong các phiên bản Android trong tương lai sẽ bị vô hiệu hoá bằng cờ này. Ngoài ra, các thư viện khác nhau sẽ xuất một nhóm tiêu đề khác (chẳng hạn như liblog). Bạn có thể chỉ định các lựa chọn dành riêng cho một biến thể của nhà cung cấp của mục tiêu trong tệp Android.bp trong:

target: { vendor: { … } }

Bật VNDK cho cơ sở mã

Cách bật VNDK cho một cơ sở mã:

  1. Xác định điều kiện bằng cách tính toán kích thước cần thiết của các phân vùng vendor.imgsystem.img.
  2. Bật BOARD_VNDK_VERSION=current. Bạn có thể thêm vào BoardConfig.mk hoặc tạo các thành phần bằng BoardConfig.mk (ví dụ: m -j BOARD_VNDK_VERSION=current MY-LIB).

Sau khi bật BOARD_VNDK_VERSION=current, hệ thống xây dựng sẽ thực thi các yêu cầu sau đây về phần phụ thuộc và tiêu đề.

Quản lý phần phụ thuộc

Một đối tượng vendor phụ thuộc vào một thành phần core không tồn tại trong vndk hoặc dưới dạng một đối tượng vendor phải được phân giải bằng một trong các lựa chọn sau:

  • Bạn có thể xoá phần phụ thuộc này.
  • Nếu thành phần core thuộc sở hữu của vendor, thì thành phần đó có thể được đánh dấu là vendor_available hoặc vendor.
  • Thay đổi khiến đối tượng cốt lõi trở thành một phần của vndk có thể được chuyển lên Google.

Ngoài ra, nếu thành phần core có các phần phụ thuộc trên thành phần vendor, thì thành phần vendor phải được chuyển thành thành phần core hoặc phần phụ thuộc phải được xoá theo cách khác (ví dụ: bằng cách xoá phần phụ thuộc hoặc bằng cách di chuyển phần phụ thuộc vào thành phần vendor).

Quản lý tiêu đề

Bạn phải xoá các phần phụ thuộc tiêu đề chung để cho phép hệ thống xây dựng biết có nên tạo tiêu đề có hoặc không có -D__ANDROID_VNDK__ hay không. Ví dụ: bạn vẫn có thể truy cập vào các tiêu đề libutils như utils/StrongPointer.h bằng thư viện tiêu đề libutils_headers.

Bạn không thể đưa một số tiêu đề (chẳng hạn như unistd.h) vào một cách gián tiếp nữa nhưng có thể đưa vào một cách cục bộ.

Cuối cùng, phần công khai của private/android_filesystem_config.h đã được chuyển sang cutils/android_filesystem_config.h. Để quản lý các tiêu đề này, hãy làm theo một trong những cách sau:

  • Xoá phần phụ thuộc vào private/android_filesystem_config.h bằng cách thay thế tất cả các macro AID_* bằng lệnh gọi getgrnam/getpwnam nếu có thể. Ví dụ:
    • (uid_t)AID_WIFI trở thành getpwnam("wifi")->pw_uid.
    • (gid_t)AID_SDCARD_R trở thành getgrnam("sdcard_r")->gr_gid.
    Để biết thông tin chi tiết, hãy tham khảo private/android_filesystem_config.h.
  • Đối với AIS được mã hoá cứng, hãy thêm cutils/android_filesystem_config.h.