Android Auto w wersji 13 lub nowszej zawiera funkcje, które umożliwiają: konfigurowania sieci Ethernet i zarządzania nimi. Ilustracja 1 przedstawia przykładową sieć schemat dla samochodu:
Rysunek 1. Android Auto – sieć.
Ten wykres pokazuje metody wywoływania aplikacji sieciowej OEM w
Klasa EthernetManager
do konfigurowania wbudowanych sieci Ethernet i zarządzania nimi
(eth0.1, eth0.2 i eth0.3). Pozostała część rysunku 1 nie wykracza poza zakres
ten dokument.
Skonfiguruj domyślne ustawienia sieci Ethernet
Aby ustawić domyślne ustawienia sieci, użyj
nakładka zasobów
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>
Ten
przykład pokazuje nakładkę zasobu config_ethernet_interfaces
z
config.xml
Najważniejsze informacje o kodzie
eth1
,eth2
ieth3
to nazwy konfigurowanego interfejsu sieci.- Kolejne liczby w polu
12, 13, 14, 15
odpowiadają sieć możliwości jest włączona. ip=
,gateway=
idns
służą do ustawiania początkowego adresu IP, bramy i DNS w sieci.
Włączanie i wyłączanie interfejsu sieci
Aby włączyć interfejs sieci, wywołaj
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);
}
}
Najważniejsze informacje o kodzie
ifaceName
to nazwa interfejsu sieci do włączenia.getMainExecutor()
zwraca kontekst aplikacji.OutcomeReceiver
to wywołanie zwrotne służące do informowania o zakończeniu zwracania zaktualizował(a) nazwę sieci po powodzeniu lubEthernetNetworkManagementException
w dniu .
Gdy interfejs sieci jest włączony, używa konfiguracji ustawionej przez
EthernetManager.updateConfiguration()
Jeśli konfiguracja nie została określona
przez EthernetManager.updateConfiguration()
, interfejs sieci używa
nakładka zasobów config_ethernet_interfaces
lub domyślna sieć Ethernet
, jeśli nakładka jest niedostępna.
Aby wyłączyć interfejs sieci, wywołaj
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);
}
}
Najważniejsze informacje o kodzie
ifaceName
to nazwa interfejsu sieci, który ma zostać wyłączony.getMainExecutor()
zwraca kontekst aplikacji.OutcomeReceiver
to wywołanie zwrotne służące do informowania o zakończeniu zwracania zaktualizował(a) nazwę sieci po powodzeniu lubEthernetNetworkManagementException
w dniu .
Zaktualizuj konfigurację sieci
Aby zaktualizować
Konfiguracje sieci Ethernet, wywołanie
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);
}
}
Najważniejsze informacje o kodzie
getCapabilities()
to metoda pomocnicza, która pobiera bieżącą sieć możliwości i wywołuje funkcjęconvertToUIDs()
w celu konwersji zrozumiałe dla człowieka nazwy pakietów na unikalne identyfikatory (UID) systemu Linux. Zazwyczaj nie znam identyfikatorów UID z wyprzedzeniem powiązanych pakietów. Jeśli więc chcesz użyć funkcjiEthernetManager.updateConfiguration()
, aby ograniczyć dostęp do podzbioru aplikacji, muszą używać swoich identyfikatorów UID.request
to konfiguracja, która ma być używana w sieci wewnętrznej. może zawierać nowe ustawienia dla konfiguracji IP i sieci funkcje zabezpieczeń. Jeśli jest zarejestrowana w stosie połączeń, jest aktualizowana zgodnie z konfiguracji. Ta konfiguracja nie jest zachowywana po ponownym uruchomieniu.getMainExecutor()
zwraca wykonawcę, dla którego został wywołany detektor.mCallback
to wywołanie zwrotne służące do komunikowania się z zakończeniem zaktualizował(a) nazwę sieci po powodzeniu lubEthernetNetworkManagementException
w dniu .
updateConfiguration()
może zaktualizować cechy sieci, która jest brana pod uwagę
i nie można zmienić
w stosie połączeń Androida.
można wyłączyć, zaktualizować i przywrócić do stanu
do zaktualizowania.
Ograniczanie sieci do podzbioru aplikacji
Za pomocą EthernetManager#updateConfiguration
możesz ograniczyć dostęp tylko do
podzbiór dozwolonych identyfikatorów UID. Użyj tej metody, aby uwzględnić przypadki użycia, w których jest to
wymagane, np. w przypadku wewnętrznych sieci samochodowych, z których może korzystać tylko niewielki podzbiór
aplikacji OEM.
Android śledzi głównie aplikacje za pomocą identyfikatora UID.
Ten kod z
UIDToPackageNameConverter.java
pokazuje, jak uzyskać serię identyfikatorów UID z ciągu nazw pakietów:
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;
Najważniejsze informacje o kodzie
getApplicationInfoAsuser().uid
służy do pobierania identyfikatora UID użytkownika z nazwę pakietu.uids
to wygenerowana tablica liczb całkowitych.
Ten kod w argumencie
EthernetManagerTest.kt
pokazuje, jak zaktualizować konfigurację interfejsu sieciowego za pomocą identyfikatorów UID aplikacji
mogą używać sieci:
val allowedUids = setOf(Process.myUid())
val nc = NetworkCapabilities.Builder(request.networkCapabilities)
.setAllowedUids(allowedUids).build()
updateConfiguration(iface, capabilities = nc).expectResult(iface.name)
Najważniejsze informacje o kodzie
allowUids
to zestaw identyfikatorów UID aplikacji, które mogą korzystać z sieci.updateConfiguration()
aktualizuje konfigurację, aby ograniczyć dostęp do niej w podanym zestawie identyfikatorów UID.