Kích hoạt VNDK

VNDK yêu cầu một số thay đổi đối với cơ sở mã để phân biệt mối quan tâm giữa nhà cung cấp và hệ thống. Sử dụng hướng dẫn sau để kích hoạt VNĐK trong cơ sở mã 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ác thư viện (được chia sẻ, tĩnh hoặc tiêu đề) và các 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 sử dụng bởi hình ảnh hệ thống, trên hình ảnh hệ thống. Các thư viện này không thể được sử dụng bởi các thư viện vendor , vendor_available , vndk hoặc vndk-sp .
    cc_library {
        name: "libThatIsCore",
        ...
    }
    
  • Các thư viện vendor-only (hoặc proprietary ) được sử dụng bởi hình ảnh nhà cung cấp, trên hình ảnh nhà cung cấp.
    cc_library {
        name: "libThatIsVendorOnly",
        proprietary: true,
        # or: vendor: true, # (for things in AOSP)
        ...
    }
    
  • Các thư viện vendor_available được sử dụng bởi hình ảnh nhà cung cấp, trên hình ảnh 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 sử dụng bởi image nhà cung cấp, trên image hệ thống.
    cc_library {
        name: "libThatIsVndk",
        vendor_available: true,
        vndk: {
            enabled: true,
        }
        ...
    }
    
  • Thư viện vndk-sp được sử dụng bởi hình ảnh nhà cung cấp và cả hình ảnh hệ thống một cách gián tiếp.
    cc_library {
        name: "libThatIsVndkSp",
        vendor_available: true,
        vndk: {
            enabled: true,
            support_system_process: true,
        }
        ...
    }
    
  • Thư viện llndk được sử dụng bởi cả hình ảnh hệ thống và nhà cung cấp.
    cc_library {
        name: "libThatIsLlndk",
        llndk: {
            symbol_file: "libthatisllndk.map.txt"
        }
        ...
    }
    

Khi một lib được đánh dấu là vendor_available:true , nó đượ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 VNĐK APEX)

Các phiên bản lib của nhà cung cấp được xây dựng với -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 hóa với cờ này. Ngoài ra, các thư viện khác nhau xuất một bộ tiêu đề khác nhau (chẳng hạn như liblog ). Các tùy chọn dành riêng cho biến thể nhà cung cấp của mục tiêu có thể được chỉ định trong tệp Android.bp trong:

target: { vendor: { … } }

Kích hoạt VNĐK cho codebase

Để kích hoạt VNĐK cho codebase:

  1. Xác định tính đủ điều kiện bằng cách tính toán kích thước yêu cầu của 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 xây dựng các thành phần trực tiếp với nó (ví dụ: m -j BOARD_VNDK_VERSION=current MY-LIB ).

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

Quản lý sự 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 tùy chọn sau:

  • Sự phụ thuộc có thể được loại bỏ.
  • Nếu thành phần core được sở hữu bởi vendor , 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 cập nhật lên Google.

Ngoài ra, nếu thành phần core có các phần phụ thuộc vào 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 loại bỏ theo cách khác (ví dụ: bằng cách loại bỏ phần phụ thuộc hoặc bằng cách chuyển phần phụ thuộc vào thành phần vendor . ).

Quản lý tiêu đề

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

Một số tiêu đề (chẳng hạn như unistd.h ) không còn có thể được đưa vào tạm thời nữa nhưng có thể được đư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 thực hiện một trong các thao tác sau:

  • Xóa 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 chi tiết, hãy tham khảo private/android_filesystem_config.h .
  • Đối với AIS được mã hóa cứng, hãy bao gồm cutils/android_filesystem_config.h .