Interne Ethernet-Netzwerke konfigurieren

Android Auto OS 13 und höher enthält Funktionen, mit denen Sie Ethernet-Netzwerke konfigurieren und verwalten Abbildung 1 zeigt ein Beispiel für ein Netzwerk. Diagramm für ein Auto:

Android Auto-Netzwerk

Abbildung 1: Android Auto-Netzwerk.

Diese Abbildung zeigt die Aufrufmethoden der OEM-Netzwerk-App im EthernetManager-Klasse zum Konfigurieren und Verwalten von Onboard-Ethernet-Netzwerken (eth0.1, eth0.2 und eth0.3). Der Rest von Abbildung 1 fällt nicht in den Bereich in diesem Dokument.

Standard-Ethernet-Netzwerkeinstellungen festlegen

Verwenden Sie zum Festlegen von Standard-Netzwerkeinstellungen die Ressourcen-Overlay 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>

Dieses Das Beispiel zeigt das Ressourcen-Overlay config_ethernet_interfaces von config.xml

Wichtige Informationen zum Code

  • eth1, eth2 und eth3 sind die Namen der Netzwerkschnittstelle, die konfiguriert wird.
  • Die fortlaufenden Zahlen von 12, 13, 14, 15 stehen für Netzwerk Funktionen aktiviert wird.
  • ip=, gateway= und dns werden verwendet, um die anfängliche IP-Adresse, das Gateway und DNS für das Netzwerk.

Netzwerkschnittstelle aktivieren oder deaktivieren

Rufen Sie zum Aktivieren einer Netzwerkschnittstelle 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);
    }
}

Wichtige Informationen zum Code

  • ifaceName ist der Name der zu aktivierenden Netzwerkschnittstelle.
  • getMainExecutor() gibt den Anwendungskontext zurück.
  • OutcomeReceiver ist ein Callback, mit dem der Abschluss kommuniziert wird. Aktualisierter Netzwerkname bei Erfolg oder EthernetNetworkManagementException bei Fehler.

Wenn eine Netzwerkschnittstelle aktiviert ist, verwendet sie die Konfiguration, EthernetManager.updateConfiguration() Wenn keine Konfiguration festgelegt wurde durch EthernetManager.updateConfiguration() verwendet, verwendet die Netzwerkschnittstelle den Ressourcen-Overlay config_ethernet_interfaces oder das Standard-Ethernetnetzwerk Konfiguration, wenn kein Overlay verfügbar ist.

Rufen Sie zum Deaktivieren einer Netzwerkschnittstelle 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);
    }
}

Wichtige Informationen zum Code

  • ifaceName ist der Name der Netzwerkschnittstelle, die deaktiviert werden soll.
  • getMainExecutor() gibt den Anwendungskontext zurück.
  • OutcomeReceiver ist ein Callback, mit dem der Abschluss kommuniziert wird. Aktualisierter Netzwerkname bei Erfolg oder EthernetNetworkManagementException bei Fehler.

Netzwerkkonfiguration aktualisieren

Zum Aktualisieren Ethernet-Netzwerkkonfigurationen, rufen Sie 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);

    }
}

Wichtige Informationen zum Code

  • getCapabilities() ist eine Hilfsmethode, die das aktuelle Netzwerk und ruft convertToUIDs() zum Conversion-Tracking auf für Menschen lesbare Paketnamen in eine Linux-eindeutige Kennung (UID) ein. In der Regel die UIDs nicht, im Voraus für die zugehörigen Pakete. Wenn Sie also EthernetManager.updateConfiguration(), um den Zugriff auf eine Untergruppe von Apps zu beschränken, ihre UIDs verwenden.
  • request ist die Konfiguration, die für das interne Netzwerk verwendet werden soll. Die -Anfrage kann neue Einstellungen für die IP-Konfiguration und das Netzwerk enthalten. Funktionen. Wenn die im Konnektivitäts-Stack registriert ist, wird es gemäß Konfiguration. Diese Konfiguration bleibt bei einem Neustart nicht erhalten.
  • getMainExecutor() gibt den Executor zurück, auf dem der Listener aufgerufen wird.
  • mCallback ist der Callback, mit dem der Abschluss kommuniziert wird. Aktualisierter Netzwerkname bei Erfolg oder EthernetNetworkManagementException bei Fehler.

Mit updateConfiguration() können die Eigenschaften eines berücksichtigten Netzwerks aktualisiert werden durch den Android-Konnektivitäts-Stack unveränderlich. Die das Netzwerk für diese unveränderlichen die zu aktualisieren sind.

Netzwerk auf bestimmte Apps beschränken

Mit EthernetManager#updateConfiguration können Sie den Zugriff auf eine Person beschränken, Teilmenge der zulässigen UIDs. Verwenden Sie diese Methode, um Anwendungsfälle abzudecken, erforderlich, z. B. für interne Fahrzeugnetze, die nur von einer kleinen Gruppe genutzt werden können von OEM-Apps.

Android verfolgt Apps hauptsächlich anhand ihrer UID. Der folgende Code von UIDToPackageNameConverter.java zeigt, wie Sie eine Reihe von UIDs aus einem String von Paketnamen abrufen:

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;

Wichtige Informationen zum Code

  • Mit getApplicationInfoAsuser().uid wird die UID von der Paketname.
  • uids ist das generierte Array von Ganzzahlen.

Der folgende Code in EthernetManagerTest.kt zeigt, wie Sie die Konfiguration Ihrer Netzwerkschnittstelle mit den UIDs der Apps aktualisieren dürfen das Netzwerk nutzen:

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

Dabei gilt:

  • allowUids ist die Gruppe von App-UIDs, die das Netzwerk verwenden dürfen.
  • updateConfiguration() aktualisiert die Konfiguration, um das Netzwerk auf Folgendes zu beschränken: den angegebenen UID-Satz.