Bật VNDK

Bộ công cụ phát triển gốc dành cho nhà cung cấp (VNDK) yêu cầu một số thay đổi đối với toàn bộ mã nguồn để tách biệt các mối quan tâm giữa nhà cung cấp và hệ thống. Hãy sử dụng hướng dẫn sau đây để bật VNDK (Bộ công cụ phát triển gốc dành cho nhà cung cấp) trong toàn bộ mã nguồn của nhà cung cấp/OEM (Nhà sản xuất thiết bị gốc).

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 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. Thư viện hệ thống xây dựng.

  • Hình ảnh hệ thống sử dụng thư viện core trên hình ảnh hệ thống. Các thư viện này không thể được sử dụng bởi vendor, vendor_available, vndk hoặc vndk-sp thư viện.
    cc_library {
        name: "libThatIsCore",
        ...
    }
  • Hình ảnh nhà cung cấp sử dụng thư viện vendor-only (hoặc proprietary) trên hình ảnh nhà cung cấp.
    cc_library {
        name: "libThatIsVendorOnly",
        proprietary: true,
        # or: vendor: true, # (for things in AOSP)
        ...
    }
  • Hình ảnh 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,
        ...
    }
  • Hình ảnh nhà cung cấp sử dụng thư viện vndk 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 sử dụng thư viện vndk-sp và cũng được hình ảnh hệ thống sử dụng 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à nhà cung cấp đều sử dụng thư viện llndk.
    cc_library {
        name: "libThatIsLlndk",
        llndk: {
            symbol_file: "libthatisllndk.map.txt"
        }
        ...
    }

Khi một lib được đánh dấu là vendor_available:true, lib đó sẽ được xây dựng 2 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 lib của nhà cung cấp được xây dựng 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 sau này 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 tập hợp 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 một biến thể của nhà cung cấp đối với 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 toàn bộ mã nguồn:

  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 trực tiếp xây dựng các thành phần bằng cách này (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

Đố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 giải quyết bằng một trong các tuỳ chọn sau:

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

Ngoài ra, nếu thành phần core có phần phụ thuộc vào thành phần vendor, thì bạn phải biến thành phần vendor thành thành phần core hoặc xoá phần phụ thuộc theo cách khác (ví dụ: bằng cách xoá phần phụ thuộc hoặc 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 xây dựng tiêu đề bằng -D__ANDROID_VNDK__ hay không. Ví dụ: bạn vẫn có thể truy cập các tiêu đề libutils như utils/StrongPointer.h bằng thư viện tiêu đề libutils_headers.

Bạn không thể bao gồm một số tiêu đề (chẳng hạn như unistd.h) một cách bắc cầu nữa nhưng có thể bao gồm 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.