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 cơ sở mã để tách biệt mối lo ngại giữa nhà cung cấp và hệ thống. Làm theo hướng dẫn sau để bật VNDK trong một nhà cung cấp/nhà sản xuất thiết bị gốc cơ sở mã.

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, trong đó có thư viện (được chia sẻ, 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. Các vendor, vendor_available không thể sử dụng thư viện Thư viện vndk hoặc vndk-sp.
    cc_library {
        name: "libThatIsCore",
        ...
    }
    
  • 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 của 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 nhà cung cấp sử dụng trên hình ảnh (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 ảnh hệ thống.
    cc_library {
        name: "libThatIsVndk",
        vendor_available: true,
        vndk: {
            enabled: true,
        }
        ...
    }
    
  • Thư viện vndk-sp được sử dụng theo hình ảnh nhà cung cấp cũng như 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,
        }
        ...
    }
    
  • Cả hình ảnh hệ thống và hình ảnh của 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, thư viện đó sẽ được tạo 2 lần:

  • Khi 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 do nhà cung cấp cung cấp được xây dựng bằng -D__ANDROID_VNDK__. Các thành phần của hệ thống riêng tư có thể thay đổi đáng kể trong các phiên bản sau này của Android bị vô hiệu hoá bằng cờ này. Ngoài ra, các thư viện khác nhau xuất bộ tiêu đề khác (chẳng hạn như liblog). Các tuỳ chọn dành riêng cho một biến thể nhà cung cấp của một mục tiêu có thể được chỉ định trong tệp Android.bp trong:

target: { vendor: { … } }

Bật VNDK cho cơ sở mã

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

  1. Xác định khả năng đủ điều kiện bằng cách tính toán kích thước bắt buộc 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 tạo các thành phần trực tiếp bằng công cụ đó (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 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 lựa chọn sau:

  • Bạn có thể xoá phần phụ thuộc này.
  • Nếu thành phần core do vendor sở hữu, thì thành phần này có thể sẽ được đánh dấu là vendor_available hoặc vendor.
  • Thay đổi khiến đối tượng cốt lõi của vndk có thể là ngược dòng 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 một Thành phần vendor, bạn phải tạo thành phần vendor vào một thành phần core hoặc phần phụ thuộc phải là 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 đề

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

Không thể thêm một số tiêu đề (chẳng hạn như unistd.h) theo cách bắc cầu 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 đến cutils/android_filesystem_config.h. Để quản lý các tiêu đề này, hãy thực hiện một trong những thao tác sau:

  • Xoá phần phụ thuộc khỏi private/android_filesystem_config.h bằng cách thay thế tất cả AID_* macro với getgrnam/ getpwnam sẽ gọi 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 cố định giá trị trong mã, hãy thêm cutils/android_filesystem_config.h.