Android Auto OS 13 dan yang lebih baru berisi fitur yang memungkinkan Anda mengkonfigurasi dan mengelola jaringan Eternet. Gambar 1 menunjukkan contoh jaringan diagram untuk mobil:
Gambar 1. Jaringan Android Auto.
Gambar ini menunjukkan metode panggilan aplikasi jaringan OEM di bagian
Class EthernetManager
untuk mengonfigurasi dan mengelola jaringan Ethernet onboard
(eth0.1, eth0.2, dan eth0.3). Sisa dari Gambar 1 berada di luar cakupan untuk
dokumen ini.
Setel 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>
Ini
contoh menunjukkan overlay resource config_ethernet_interfaces
dari
config.xml
.
Poin penting tentang kode
eth1
,eth2
, daneth3
adalah nama antarmuka jaringan yang sedang dikonfigurasi.- Angka
12, 13, 14, 15
berurutan mewakili jaringan kapabilitas diaktifkan. ip=
,gateway=
, dandns
digunakan untuk menyetel gateway, alamat IP awal, dan DNS 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 penting tentang kode
ifaceName
adalah nama antarmuka jaringan yang akan diaktifkan.getMainExecutor()
menampilkan konteks aplikasi.OutcomeReceiver
adalah callback yang digunakan untuk mengomunikasikan penyelesaian yang menampilkan memperbarui nama jaringan saat berhasil atauEthernetNetworkManagementException
aktif {i>error<i}.
Ketika diaktifkan, antarmuka jaringan akan menggunakan
konfigurasi yang ditetapkan oleh
EthernetManager.updateConfiguration()
. Jika konfigurasi belum disetel
oleh EthernetManager.updateConfiguration()
, antarmuka jaringan menggunakan
overlay resource config_ethernet_interfaces
atau 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 penting tentang kode
ifaceName
adalah nama antarmuka jaringan yang akan dinonaktifkan.getMainExecutor()
menampilkan konteks aplikasi.OutcomeReceiver
adalah callback yang digunakan untuk mengomunikasikan penyelesaian yang menampilkan memperbarui nama jaringan saat berhasil atauEthernetNetworkManagementException
aktif {i>error<i}.
Perbarui 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 penting tentang kode
getCapabilities()
adalah metode bantuan yang mendapatkan jaringan saat ini dan memanggilconvertToUIDs()
untuk mengonversi nama paket yang dapat dibaca manusia ke ID unik (UID) Linux. Biasanya, Anda tidak tahu UID paket-paket terkait mereka. Oleh karena itu, jika Anda ingin menggunakanEthernetManager.updateConfiguration()
untuk membatasi akses ke sebagian aplikasi, Anda menggunakan UID mereka.request
adalah konfigurasi yang akan digunakan untuk jaringan internal. Tujuan dapat berisi setelan baru untuk konfigurasi IP dan jaringan kemampuan IT. Jika terdaftar dengan tumpukan konektivitas, itu diperbarui sesuai dengan konfigurasi Anda. Konfigurasi ini tidak akan dipertahankan meskipun sudah dimulai ulang.getMainExecutor()
menampilkan eksekutor tempat pemroses dipanggil.mCallback
adalah callback yang digunakan untuk mengomunikasikan penyelesaian yang menampilkan memperbarui nama jaringan saat berhasil atauEthernetNetworkManagementException
aktif {i>error<i}.
updateConfiguration()
mungkin memperbarui karakteristik jaringan yang dipertimbangkan
tidak dapat diubah oleh stack Konektivitas Android. Tujuan
jaringan diturunkan, diperbarui, dan dikembalikan ke lingkungan
yang tidak dapat diubah
untuk diperbarui.
Membatasi jaringan ke sebagian aplikasi
Anda dapat menggunakan EthernetManager#updateConfiguration
untuk membatasi akses hanya ke
subset UID yang diizinkan. Gunakan metode ini untuk
mencakup kasus penggunaan di mana
diperlukan, seperti untuk jaringan kendaraan internal yang hanya dapat digunakan oleh sebagian 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 penting tentang kode
getApplicationInfoAsuser().uid
digunakan untuk mengambil UID dari nama paket.uids
adalah array bilangan bulat yang dihasilkan.
Kode berikut di
EthernetManagerTest.kt
menunjukkan cara memperbarui konfigurasi antarmuka jaringan dengan UID aplikasi
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 penting tentang kode
allowUids
adalah kumpulan UID aplikasi yang diizinkan untuk menggunakan jaringan.updateConfiguration()
memperbarui konfigurasi untuk membatasi jaringan agar yang diberikan sesuai dengan UID tersebut.