Bật VNDK

Bộ phát triển gốc của nhà cung cấp (VNDK) yêu cầu một số thay đổi đối với cơ sở mã để phân tách các vấn đề 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.

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

Hệ thống xây dựng chứa một số 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.

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

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

  • Thư viện core được hình ảnh hệ thống sử dụng trên hình ảnh hệ thống. Thư viện vendor, vendor_available, vndk hoặc vndk-sp không thể sử 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)
        ...
    }
  • Thư viện vendor_available được hình ảnh của nhà cung cấp sử dụng trên hình ảnh của nhà cung cấp (có thể chứa các 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,
        }
        ...
    }
  • Thư viện vndk-sp được hình ảnh nhà cung cấp và hình ảnh hệ thống sử dụng gián tiếp.
    cc_library {
        name: "libThatIsVndkSp",
        vendor_available: true,
        vndk: {
            enabled: true,
            support_system_process: true,
        }
        ...
    }
  • Thư viện llndk được cả hệ thống và hình ảnh của nhà cung cấp sử dụng.
    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 thư viện đượ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 nhau (chẳng hạn như liblog). Bạn có thể chỉ định các tuỳ chọn dành riêng cho biến thể nhà cung cấp của một 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 bắt buộc 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 thành phần trực tiếp 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 về phần phụ thuộc và tiêu đề sau.

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

Đối tượng vendor phụ thuộc vào thành phần core không tồn tại trong vndk hoặc dưới dạng đối tượng vendor phải được phân giải bằng một trong các tuỳ 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.
  • Một thay đổi làm cho đối tượng cốt lõi trở thành một phần của vndk có thể được chuyển ngược lên Google.

Ngoài ra, nếu một 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 tạo 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 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 liệu có tạo tiêu đề 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 cách sử dụ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 chuyển tiếp nữa nhưng có thể đưa vào 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.