Android Auto OS 13 trở lên có các tính năng cho phép bạn định cấu hình và quản lý mạng Ethernet. Hình 1 minh hoạ một mạng ví dụ sơ đồ cho một chiếc ô tô:
Hình 1. Kết nối mạng Android Auto.
Hình này cho thấy các phương thức gọi ứng dụng nối mạng của nhà sản xuất thiết bị gốc (OEM) trong
EthernetManager
lớp để định cấu hình và quản lý mạng Ethernet tích hợp
(eth0.1, eth0.2 và eth0.3). Phần còn lại của Hình 1 nằm ngoài phạm vi của
tài liệu này.
Đặt chế độ cài đặt mạng Ethernet mặc định
Để đặt chế độ cài đặt mạng mặc định, hãy sử dụng
lớp phủ tài nguyên
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>
Chiến dịch này
ví dụ cho thấy lớp phủ tài nguyên config_ethernet_interfaces
từ
config.xml
.
Các điểm chính về mã
eth1
,eth2
vàeth3
là tên của giao diện mạng đang được định cấu hình.- Các số liên tiếp của
12, 13, 14, 15
đại diện cho mạng chức năng đang được bật. ip=
,gateway=
vàdns
dùng để đặt địa chỉ IP ban đầu, cổng, và DNS cho mạng.
Bật hoặc tắt giao diện mạng
Để bật giao diện mạng, hãy gọi
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);
}
}
Các điểm chính về mã
ifaceName
là tên của giao diện mạng sẽ bật.getMainExecutor()
trả về ngữ cảnh ứng dụng.OutcomeReceiver
là một lệnh gọi lại dùng để giao tiếp hoàn thành và trả về đã cập nhật tên mạng khi thành công hoặcEthernetNetworkManagementException
vào .
Khi được bật, giao diện mạng sẽ sử dụng cấu hình do
EthernetManager.updateConfiguration()
. Nếu chưa thiết lập cấu hình
vào EthernetManager.updateConfiguration()
, giao diện mạng sẽ sử dụng
lớp phủ tài nguyên config_ethernet_interfaces
hoặc mạng Ethernet mặc định
nếu không có sẵn lớp phủ.
Để tắt giao diện mạng, hãy gọi
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);
}
}
Các điểm chính về mã
ifaceName
là tên của giao diện mạng cần tắt.getMainExecutor()
trả về ngữ cảnh ứng dụng.OutcomeReceiver
là một lệnh gọi lại dùng để giao tiếp hoàn thành và trả về đã cập nhật tên mạng khi thành công hoặcEthernetNetworkManagementException
vào .
Cập nhật cấu hình mạng
Cần cập nhật
Cấu hình mạng Ethernet, lệnh gọi
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);
}
}
Các điểm chính về mã
getCapabilities()
là một phương thức trợ giúp để lấy mạng hiện tại chức năng và lệnh gọiconvertToUIDs()
để chuyển đổi tên gói mà con người có thể đọc được thành mã nhận dạng duy nhất (UID) của Linux. Thông thường, bạn không biết UID cho các gói liên quan của họ. Do đó, nếu bạn muốn sử dụngEthernetManager.updateConfiguration()
để giới hạn quyền truy cập vào một nhóm nhỏ ứng dụng, bạn cần sử dụng UID của họ.request
là cấu hình được sử dụng cho mạng nội bộ. Chiến lược phát hành đĩa đơn có thể chứa cài đặt mới cho cấu hình IP và mạng các chức năng khác nhau. Nếu được đăng ký với ngăn xếp kết nối, mạng này được cập nhật theo . Cấu hình này không được duy trì sau khi khởi động lại.getMainExecutor()
trả về trình thực thi mà trình nghe được gọi.mCallback
là lệnh gọi lại dùng để giao tiếp hoàn thành và trả về đã cập nhật tên mạng khi thành công hoặcEthernetNetworkManagementException
vào .
updateConfiguration()
có thể cập nhật đặc điểm của một mạng được xem xét
bất biến bởi ngăn xếp Kết nối Android. Chiến lược phát hành đĩa đơn
bị gỡ bỏ, cập nhật và hiển thị trở lại cho những đối tượng không thể thay đổi này
các thuộc tính cần cập nhật.
Giới hạn một mạng cho một nhóm nhỏ ứng dụng
Bạn có thể sử dụng EthernetManager#updateConfiguration
để chỉ cho phép một
một tập hợp con UID được phép. Sử dụng phương thức này để bao gồm các trường hợp sử dụng mà
bắt buộc, chẳng hạn như đối với mạng lưới phương tiện nội bộ mà chỉ một số ít phương tiện vận tải sử dụng được
về ứng dụng OEM.
Android chủ yếu theo dõi các ứng dụng bằng UID.
Mã sau đây từ
UIDToPackageNameConverter.java
cho biết cách lấy một loạt UID qua một chuỗi tên gói:
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;
Các điểm chính về mã
getApplicationInfoAsuser().uid
dùng để truy xuất UID của từ tên gói.uids
là mảng số nguyên được tạo.
Mã sau đây trong
EthernetManagerTest.kt
trình bày cách cập nhật cấu hình giao diện mạng bằng UID của các ứng dụng
được phép sử dụng mạng:
val allowedUids = setOf(Process.myUid())
val nc = NetworkCapabilities.Builder(request.networkCapabilities)
.setAllowedUids(allowedUids).build()
updateConfiguration(iface, capabilities = nc).expectResult(iface.name)
Các điểm chính về mã
allowUids
là tập hợp các UID của ứng dụng được phép sử dụng mạng.updateConfiguration()
cập nhật cấu hình để hạn chế mạng ở tập hợp UID được cung cấp.