กำหนดค่าเครือข่ายอีเทอร์เน็ตภายใน

Android Auto OS 13 ขึ้นไปมีฟีเจอร์ที่ช่วยให้คุณทำสิ่งต่อไปนี้ได้ กำหนดค่าและจัดการเครือข่ายอีเทอร์เน็ต รูปที่ 1 แสดงเครือข่ายตัวอย่าง แผนภาพรถยนต์

ระบบเครือข่าย Android Auto

รูปที่ 1 ระบบเครือข่าย Android Auto

รูปนี้แสดงวิธีการโทรด้วยแอปเครือข่าย OEM ใน EthernetManager คลาสเพื่อกำหนดค่าและจัดการเครือข่ายอีเทอร์เน็ตแบบออนบอร์ด (eth0.1, eth0.2 และ eth0.3) ส่วนที่เหลือของรูปที่ 1 อยู่นอกเหนือขอบเขตสำหรับ เอกสารนี้

กำหนดการตั้งค่าเครือข่ายอีเทอร์เน็ตเริ่มต้น

หากต้องการตั้งค่าเครือข่ายเริ่มต้น ให้ใช้ การวางซ้อนทรัพยากร 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>

ช่วงเวลานี้ ตัวอย่างแสดงการวางซ้อนทรัพยากร config_ethernet_interfaces จาก config.xml

ประเด็นสำคัญเกี่ยวกับโค้ด

  • eth1, eth2 และ eth3 คือชื่อของอินเทอร์เฟซเครือข่ายที่กำหนดค่า
  • จำนวนต่อเนื่องกันของ 12, 13, 14, 15 หมายถึง เครือข่าย ความสามารถ กำลังเปิดใช้งานอยู่
  • ip=, gateway= และ dns ใช้เพื่อตั้งค่าที่อยู่ IP, เกตเวย์, และ DNS สำหรับเครือข่าย

เปิดหรือปิดใช้อินเทอร์เฟซเครือข่าย

ในการเปิดใช้อินเทอร์เฟซเครือข่าย โปรดเรียกใช้ 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);
    }
}

ประเด็นสำคัญเกี่ยวกับโค้ด

  • ifaceName คือชื่อของอินเทอร์เฟซเครือข่ายที่จะเปิดใช้
  • getMainExecutor() จะแสดงบริบทของแอป
  • OutcomeReceiver เป็น Callback ที่ใช้สื่อสารว่าเสร็จสมบูรณ์ที่ส่งคืน อัปเดตชื่อเครือข่ายเมื่อสำเร็จ หรือ EthernetNetworkManagementException เมื่อ

เมื่อเปิดใช้อินเทอร์เฟซเครือข่าย อินเทอร์เฟซเครือข่ายจะใช้การกำหนดค่าที่กำหนดโดย EthernetManager.updateConfiguration() หากไม่ได้ตั้งค่าการกำหนดค่า โดย EthernetManager.updateConfiguration() อินเทอร์เฟซเครือข่ายจะใช้ การวางซ้อนทรัพยากร config_ethernet_interfaces หรือเครือข่ายอีเทอร์เน็ตเริ่มต้น หากโฆษณาซ้อนทับไม่พร้อมใช้งาน

หากต้องการปิดใช้งานอินเทอร์เฟซเครือข่าย ให้โทร 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);
    }
}

ประเด็นสำคัญเกี่ยวกับโค้ด

  • ifaceName คือชื่อของอินเทอร์เฟซเครือข่ายที่จะปิดใช้
  • getMainExecutor() จะแสดงบริบทของแอป
  • OutcomeReceiver เป็น Callback ที่ใช้สื่อสารว่าเสร็จสมบูรณ์ที่ส่งคืน อัปเดตชื่อเครือข่ายเมื่อสำเร็จ หรือ EthernetNetworkManagementException เมื่อ

อัปเดตการกำหนดค่าเครือข่าย

เพื่ออัปเดต การกำหนดค่าเครือข่ายอีเทอร์เน็ต การโทร 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);

    }
}

ประเด็นสำคัญเกี่ยวกับโค้ด

  • getCapabilities() เป็นวิธีตัวช่วยที่ทำให้เครือข่ายปัจจุบัน ความสามารถและเรียก convertToUIDs() เพื่อแปลง ชื่อแพ็กเกจที่มนุษย์อ่านได้สำหรับตัวระบุที่ไม่ซ้ำกัน (UID) ใน Linux โดยปกติแล้ว คุณ ไม่ทราบ UID ล่วงหน้าสำหรับแพ็กเกจที่เกี่ยวข้องได้ ดังนั้นหากคุณต้องการใช้ EthernetManager.updateConfiguration()เพื่อจำกัดการเข้าถึงกลุ่มย่อยของแอป ต้องใช้ UID ของตนเอง
  • request คือการกำหนดค่าที่จะใช้สำหรับเครือข่ายภายใน คำขอสามารถมีการตั้งค่าใหม่สำหรับการกำหนดค่า IP และเครือข่าย ความสามารถ หาก มีการลงทะเบียนกับสแต็กการเชื่อมต่อแล้ว ซึ่งมีการอัปเดตตาม การกำหนดค่า การกำหนดค่านี้จะคงอยู่ตลอดการรีบูต
  • getMainExecutor() จะแสดงผลตัวดำเนินการที่มีการเรียกใช้ Listener
  • mCallback เป็น Callback ที่ใช้สื่อสารว่าเสร็จสมบูรณ์ที่ส่งคืน อัปเดตชื่อเครือข่ายเมื่อสำเร็จ หรือ EthernetNetworkManagementException เมื่อ

updateConfiguration() อาจอัปเดตลักษณะของเครือข่ายที่ถูกนำมาพิจารณา เปลี่ยนแปลงไม่ได้โดยสแต็กการเชื่อมต่อของ Android เครือข่ายลดลง มีการอัปเดต และกลับมาเหมือนเดิมสำหรับสิ่งที่เปลี่ยนแปลงไม่ได้ ที่จะอัปเดต

จำกัดเครือข่ายไปยังชุดย่อยของแอป

คุณสามารถใช้ EthernetManager#updateConfiguration เพื่อจำกัดการเข้าถึง ชุดย่อยของ UID ที่ได้รับอนุญาต ใช้วิธีนี้เพื่อให้ครอบคลุมกรณีการใช้งานที่มี จำเป็น เช่น สำหรับเครือข่ายยานพาหนะภายในที่มีเพียงส่วนย่อยที่ใช้ได้ จากแอป OEM

Android จะติดตามแอปตาม UID เป็นหลัก โค้ดต่อไปนี้จาก UIDToPackageNameConverter.java แสดงวิธีรับชุด UID จากสตริงชื่อแพ็กเกจดังนี้

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;

ประเด็นสำคัญเกี่ยวกับโค้ด

  • getApplicationInfoAsuser().uid ใช้เพื่อเรียกข้อมูล UID ของ จาก ชื่อแพ็กเกจ
  • uids คืออาร์เรย์ของจำนวนเต็มที่สร้างขึ้น

โค้ดต่อไปนี้ใน EthernetManagerTest.kt แสดงวิธีอัปเดตการกำหนดค่าอินเทอร์เฟซเครือข่ายด้วย UID ของแอป ได้รับอนุญาตให้ใช้เครือข่าย:

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

สถานที่:

  • allowUids คือชุด UID ของแอปที่ได้รับอนุญาตให้ใช้เครือข่าย
  • updateConfiguration() อัปเดตการกำหนดค่าเพื่อจำกัดเครือข่ายไว้ ชุด UID ที่ให้ไว้