Android Auto OS 13 dan yang lebih baru berisi fitur yang memungkinkan Anda mengonfigurasi dan mengelola jaringan Ethernet. Gambar 1 menunjukkan contoh diagram jaringan untuk mobil:
Gambar 1. Jaringan Android Auto.
Gambar ini menunjukkan aplikasi jaringan OEM Anda yang memanggil metode di class EthernetManager untuk mengonfigurasi dan mengelola jaringan Ethernet di dalam mobil (eth0.1, eth0.2, dan eth0.3). Bagian lain dari Gambar 1 berada di luar cakupan dokumen ini.
Menetapkan setelan jaringan Ethernet default
Untuk menetapkan setelan jaringan default, gunakan
overlay resource
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>
Contoh
ini menunjukkan overlay resource config_ethernet_interfaces dari
config.xml.
Poin-poin penting tentang kode
eth1,eth2, daneth3adalah nama antarmuka jaringan yang dikonfigurasi.- Angka berurutan
12, 13, 14, 15mewakili kemampuan jaringan yang diaktifkan. ip=,gateway=, dandnsdigunakan untuk menetapkan alamat IP, gateway, dan DNS awal untuk jaringan.
Mengaktifkan atau menonaktifkan antarmuka jaringan
Untuk mengaktifkan antarmuka jaringan, panggil
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);
}
}
Poin-poin penting tentang kode
ifaceNameadalah nama antarmuka jaringan yang akan diaktifkan.getMainExecutor()menampilkan konteks aplikasi.OutcomeReceiveradalah callback yang digunakan untuk mengomunikasikan penyelesaian yang menampilkan nama jaringan yang diperbarui jika berhasil atauEthernetNetworkManagementExceptionjika terjadi error.
Saat antarmuka jaringan diaktifkan, antarmuka tersebut menggunakan setelan konfigurasi yang ditetapkan oleh EthernetManager.updateConfiguration(). Jika konfigurasi belum ditetapkan oleh EthernetManager.updateConfiguration(), antarmuka jaringan akan menggunakan overlay resource config_ethernet_interfaces atau konfigurasi jaringan Ethernet default jika overlay tidak tersedia.
Untuk menonaktifkan antarmuka jaringan, panggil
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);
}
}
Poin-poin penting tentang kode
ifaceNameadalah nama antarmuka jaringan yang akan dinonaktifkan.getMainExecutor()menampilkan konteks aplikasi.OutcomeReceiveradalah callback yang digunakan untuk mengomunikasikan penyelesaian yang menampilkan nama jaringan yang diperbarui jika berhasil atauEthernetNetworkManagementExceptionjika terjadi error.
Memperbarui konfigurasi jaringan
Untuk memperbarui
konfigurasi jaringan Ethernet, panggil
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);
}
}
Poin-poin penting tentang kode
getCapabilities()adalah metode helper yang mendapatkan kemampuan jaringan saat ini dan memanggilconvertToUIDs()untuk mengonversi nama paket yang dapat dibaca manusia menjadi pengenal unik (UID) Linux. Biasanya, Anda tidak mengetahui UID di awal untuk paket terkait. Oleh karena itu, jika ingin menggunakanEthernetManager.updateConfiguration()untuk membatasi akses ke subset aplikasi, Anda harus menggunakan UID-nya.requestadalah konfigurasi yang akan digunakan untuk jaringan internal. Permintaan dapat berisi setelan baru untuk konfigurasi IP dan kemampuan jaringan. Jika jaringan terdaftar dengan tumpukan konektivitas, jaringan akan diperbarui sesuai dengan konfigurasi. Konfigurasi ini tidak akan berubah setelah reboot.getMainExecutor()menampilkan executor tempat pemroses dipanggil.mCallbackadalah callback yang digunakan untuk mengomunikasikan penyelesaian yang menampilkan nama jaringan yang diperbarui jika berhasil atauEthernetNetworkManagementExceptionjika terjadi error.
updateConfiguration() dapat memperbarui karakteristik jaringan yang dianggap tidak dapat diubah oleh tumpukan Konektivitas Android. Jaringan akan dihentikan, diperbarui, dan diaktifkan kembali agar atribut yang tidak dapat diubah ini dapat diperbarui.
Membatasi jaringan ke subset aplikasi
Anda dapat menggunakan EthernetManager#updateConfiguration untuk membatasi akses hanya ke subset UID yang diizinkan. Gunakan metode ini untuk mencakup kasus penggunaan yang memerlukan hal ini, seperti untuk jaringan kendaraan internal yang hanya dapat digunakan oleh subset kecil
aplikasi OEM.
Android terutama melacak aplikasi berdasarkan UID-nya.
Kode berikut dari
UIDToPackageNameConverter.java
menunjukkan cara mendapatkan serangkaian UID dari string nama paket:
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;
Poin-poin penting tentang kode
getApplicationInfoAsuser().uiddigunakan untuk mengambil UID dari nama paket.uidsadalah array bilangan bulat yang dihasilkan.
Kode berikut di
EthernetManagerTest.kt
menunjukkan cara memperbarui konfigurasi antarmuka jaringan dengan UID aplikasi yang
diizinkan menggunakan jaringan:
val allowedUids = setOf(Process.myUid())
val nc = NetworkCapabilities.Builder(request.networkCapabilities)
.setAllowedUids(allowedUids).build()
updateConfiguration(iface, capabilities = nc).expectResult(iface.name)
Poin-poin penting tentang kode
allowUidsadalah kumpulan UID aplikasi yang diizinkan menggunakan jaringan.updateConfiguration()memperbarui konfigurasi untuk membatasi jaringan ke kumpulan UID yang disediakan.