Định cấu hình mạng Ethernet nội bộ

Android Auto OS 13 trở lên có các tính năng cho phép bạn định cấu hình và quản lý mạng Ethernet. Hình 1 minh hoạ một mạng ví dụ sơ đồ cho một chiếc ô tô:

Kết nối mạng cho Android Auto

Hình 1. Kết nối mạng Android Auto.

Hình này cho thấy các phương thức gọi ứng dụng nối mạng của nhà sản xuất thiết bị gốc (OEM) trong EthernetManager lớp để định cấu hình và quản lý mạng Ethernet tích hợp (eth0.1, eth0.2 và eth0.3). Phần còn lại của Hình 1 nằm ngoài phạm vi của tài liệu này.

Đặt chế độ cài đặt mạng Ethernet mặc định

Để đặt chế độ cài đặt mạng mặc định, hãy sử dụng lớp phủ tài nguyên config_ethernet_interfaces:

<string-array translatable="false" name="config_ethernet_interfaces">
        <!--
        <item>eth1;12,13,14,15;ip=192.168.0.10/24 gateway=192.168.0.1 dns=4.4.4.4,8.8.8.8</item>
        <item>eth2;;ip=192.168.0.11/24</item>
        <item>eth3;12,13,14,15;ip=192.168.0.12/24;1</item>
        -->
    </string-array>

Chiến dịch này ví dụ cho thấy lớp phủ tài nguyên config_ethernet_interfaces từ config.xml.

Các điểm chính về mã

  • eth1, eth2eth3 là tên của giao diện mạng đang được định cấu hình.
  • Các số liên tiếp của 12, 13, 14, 15 đại diện cho mạng chức năng đang được bật.
  • ip=, gateway=dns dùng để đặt địa chỉ IP ban đầu, cổng, và DNS cho mạng.

Bật hoặc tắt giao diện mạng

Để bật giao diện mạng, hãy gọi EthernetManager.enableInterface():

public final class InterfaceEnabler {
    private final Context mApplicationContext;
    private final EthernetManager mEthernetManager;
    private final OutcomeReceiver<String, EthernetNetworkManagementException> mOutcomeReceiver;

    public InterfaceEnabler(Context applicationContext,
            OutcomeReceiver<String, EthernetNetworkManagementException> outcomeReceiver) {
        mApplicationContext = applicationContext;
        mEthernetManager = applicationContext.getSystemService(EthernetManager.class);
        mOutcomeReceiver = outcomeReceiver;
    }

    public void enableInterface(String ifaceName) {
        mEthernetManager.enableInterface(ifaceName,
                mApplicationContext.getMainExecutor(),
                mOutcomeReceiver);
    }
}

Các điểm chính về mã

  • ifaceName là tên của giao diện mạng sẽ bật.
  • getMainExecutor() trả về ngữ cảnh ứng dụng.
  • OutcomeReceiver là một lệnh gọi lại dùng để giao tiếp hoàn thành và trả về đã cập nhật tên mạng khi thành công hoặc EthernetNetworkManagementException vào .

Khi được bật, giao diện mạng sẽ sử dụng cấu hình do EthernetManager.updateConfiguration(). Nếu chưa thiết lập cấu hình vào EthernetManager.updateConfiguration(), giao diện mạng sẽ sử dụng lớp phủ tài nguyên config_ethernet_interfaces hoặc mạng Ethernet mặc định nếu không có sẵn lớp phủ.

Để tắt giao diện mạng, hãy gọi EthernetManager.disableInterface():

public final class InterfaceEnabler {
    private final Context mApplicationContext;
    private final EthernetManager mEthernetManager;
    private final OutcomeReceiver<String, EthernetNetworkManagementException> mOutcomeReceiver;

    public InterfaceEnabler(Context applicationContext,
            OutcomeReceiver<String, EthernetNetworkManagementException> outcomeReceiver) {
        mApplicationContext = applicationContext;
        mEthernetManager = applicationContext.getSystemService(EthernetManager.class);
        mOutcomeReceiver = outcomeReceiver;
    }

    public void disableInterface(String ifaceName) {
        mEthernetManager.disableInterface(ifaceName,
                mApplicationContext.getMainExecutor(),
                mOutcomeReceiver);
    }
}

Các điểm chính về mã

  • ifaceName là tên của giao diện mạng cần tắt.
  • getMainExecutor() trả về ngữ cảnh ứng dụng.
  • OutcomeReceiver là một lệnh gọi lại dùng để giao tiếp hoàn thành và trả về đã cập nhật tên mạng khi thành công hoặc EthernetNetworkManagementException vào .

Cập nhật cấu hình mạng

Cần cập nhật Cấu hình mạng Ethernet, lệnh gọi EthernetManager.updateConfiguration():

public final class ConfigurationUpdater {
    private final Context mApplicationContext;
    private final EthernetManager mEthernetManager;
    private final OutcomeReceiver<String, EthernetNetworkManagementException> mCallback;

    public ConfigurationUpdater(Context applicationContext,
            OutcomeReceiver<String, EthernetNetworkManagementException> callback) {
        mApplicationContext = applicationContext;
        mEthernetManager = applicationContext.getSystemService(EthernetManager.class);
        mCallback = callback;
    }

    public void updateNetworkConfiguration(String packageNames,
            String ipConfigurationText,
            String networkCapabilitiesText,
            String interfaceName)
            throws IllegalArgumentException, PackageManager.NameNotFoundException {

        EthernetNetworkUpdateRequest request = new EthernetNetworkUpdateRequest.Builder()
                .setIpConfiguration(getIpConfiguration(ipConfigurationText))
                .setNetworkCapabilities(getCapabilities(
                        interfaceName, networkCapabilitiesText, packageNames))
                .build();

        mEthernetManager.updateConfiguration(interfaceName, request,
                mApplicationContext.getMainExecutor(), mCallback);

    }
}

Các điểm chính về mã

  • getCapabilities() là một phương thức trợ giúp để lấy mạng hiện tại chức năng và lệnh gọi convertToUIDs() để chuyển đổi tên gói mà con người có thể đọc được thành mã nhận dạng duy nhất (UID) của Linux. Thông thường, bạn không biết UID cho các gói liên quan của họ. Do đó, nếu bạn muốn sử dụng EthernetManager.updateConfiguration() để giới hạn quyền truy cập vào một nhóm nhỏ ứng dụng, bạn cần sử dụng UID của họ.
  • request là cấu hình được sử dụng cho mạng nội bộ. Chiến lược phát hành đĩa đơn có thể chứa cài đặt mới cho cấu hình IP và mạng các chức năng khác nhau. Nếu được đăng ký với ngăn xếp kết nối, mạng này được cập nhật theo . Cấu hình này không được duy trì sau khi khởi động lại.
  • getMainExecutor() trả về trình thực thi mà trình nghe được gọi.
  • mCallback là lệnh gọi lại dùng để giao tiếp hoàn thành và trả về đã cập nhật tên mạng khi thành công hoặc EthernetNetworkManagementException vào .

updateConfiguration() có thể cập nhật đặc điểm của một mạng được xem xét bất biến bởi ngăn xếp Kết nối Android. Chiến lược phát hành đĩa đơn bị gỡ bỏ, cập nhật và hiển thị trở lại cho những đối tượng không thể thay đổi này các thuộc tính cần cập nhật.

Giới hạn một mạng cho một nhóm nhỏ ứng dụng

Bạn có thể sử dụng EthernetManager#updateConfiguration để chỉ cho phép một một tập hợp con UID được phép. Sử dụng phương thức này để bao gồm các trường hợp sử dụng mà bắt buộc, chẳng hạn như đối với mạng lưới phương tiện nội bộ mà chỉ một số ít phương tiện vận tải sử dụng được về ứng dụng OEM.

Android chủ yếu theo dõi các ứng dụng bằng UID. Mã sau đây từ UIDToPackageNameConverter.java cho biết cách lấy một loạt UID qua một chuỗi tên gói:

public static Set<Integer> convertToUids(Context applicationContext, String packageNames)
            throws PackageManager.NameNotFoundException {
        final PackageManager packageManager = applicationContext.getPackageManager();
        final UserManager userManager = applicationContext.getSystemService(UserManager.class);

        final Set<Integer> uids = new ArraySet<>();
        final List<UserHandle> users = userManager.getUserHandles(true);

        String[] packageNamesArray = packageNames.split(",");
        for (String packageName : packageNamesArray) {
            boolean nameNotFound = true;
            packageName = packageName.trim();
            for (final UserHandle user : users) {
                try {
                    final int uid =
                            packageManager.getApplicationInfoAsUser(packageName, 0, user).uid;
                    uids.add(uid);
                    nameNotFound = false;
                } catch (PackageManager.NameNotFoundException e) {
                    // Although this may seem like an error scenario, it is OK as all packages are
                    // not expected to be installed for all users.
                    continue;
                }
            }

            if (nameNotFound) {
                throw new PackageManager.NameNotFoundException("Not installed: " + packageName);
            }
        }
        return uids;

Các điểm chính về mã

  • getApplicationInfoAsuser().uid dùng để truy xuất UID của từ tên gói.
  • uids là mảng số nguyên được tạo.

Mã sau đây trong EthernetManagerTest.kt trình bày cách cập nhật cấu hình giao diện mạng bằng UID của các ứng dụng được phép sử dụng mạng:

val allowedUids = setOf(Process.myUid())
        val nc = NetworkCapabilities.Builder(request.networkCapabilities)
                .setAllowedUids(allowedUids).build()
        updateConfiguration(iface, capabilities = nc).expectResult(iface.name)

Các điểm chính về mã

  • allowUids là tập hợp các UID của ứng dụng được phép sử dụng mạng.
  • updateConfiguration() cập nhật cấu hình để hạn chế mạng ở tập hợp UID được cung cấp.