Android Auto OS 13 ve sonraki sürümler şunları yapmanıza olanak tanıyan özellikler içerir: Ethernet ağlarını yapılandırıp yönetin. Şekil 1'de örnek bir ağ gösterilmektedir bir otomobil şeması:
Şekil 1. Android Auto ağı.
Bu şekilde, OEM ağ uygulaması arama yöntemleriniz
Yerleşik Ethernet ağlarını yapılandırmak ve yönetmek için EthernetManager
sınıf
(eth0.1, eth0.2 ve eth0.3). Şekil 1'in kalanı
bu belgeyi kontrol edin.
Varsayılan Ethernet ağ ayarlarını belirleme
Varsayılan ağ ayarlarını belirlemek için
kaynak yer paylaşımı
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>
Bu
örnek, config_ethernet_interfaces
kaynak yerleşiminin
config.xml
Kodla ilgili önemli noktalar
eth1
,eth2
veeth3
, yapılandırılmakta olan ağ arayüzünün adlarıdır.- Art arda gösterilen
12, 13, 14, 15
sayıları ağ özellikler etkinleştiriliyor. ip=
,gateway=
vedns
; başlangıç IP adresini, ağ geçidini, ve DNS ayarlarını yapmanız gerekir.
Ağ arayüzünü etkinleştirme veya devre dışı bırakma
Bir ağ arayüzünü etkinleştirmek için şunu arayın:
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);
}
}
Kodla ilgili önemli noktalar
ifaceName
, etkinleştirilecek ağ arayüzünün adıdır.getMainExecutor()
, uygulama bağlamını döndürür.OutcomeReceiver
, başarılı olduğunda güncellenmiş ağ adı veya şuradaEthernetNetworkManagementException
: hatası.
Bir ağ arayüzü etkinleştirildiğinde, Google Etiket Yöneticisi tarafından
EthernetManager.updateConfiguration()
Yapılandırma ayarlanmadıysa
ağ arayüzü, EthernetManager.updateConfiguration()
tarafından
kaynak yer paylaşımı config_ethernet_interfaces
veya varsayılan Ethernet ağı
yapılandırmaya ihtiyacınız var.
Bir ağ arayüzünü devre dışı bırakmak için şunu çağırın:
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);
}
}
Kodla ilgili önemli noktalar
ifaceName
, devre dışı bırakılacak ağ arayüzünün adıdır.getMainExecutor()
, uygulama bağlamını döndürür.OutcomeReceiver
, başarılı olduğunda güncellenmiş ağ adı veya şuradaEthernetNetworkManagementException
: hatası.
Ağ yapılandırmasını güncelleme
Güncellemek için
Ethernet ağı yapılandırmaları, çağrı
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);
}
}
Kodla ilgili önemli noktalar
getCapabilities()
geçerli ağı alan yardımcı bir yöntemdir özellikler ve dönüşüm sağlamak içinconvertToUIDs()
çağrısı kullanıcılar tarafından okunabilen paket adlarını Linux benzersiz tanımlayıcısına (UID) bağlayabilirsiniz. Genellikle UID'leri bilmiyorum ön plana çıkarır. Bu nedenle, çevrimiçi Bir uygulama alt kümesine erişimi sınırlamak içinEthernetManager.updateConfiguration()
UID'lerini kullanması gerekir.request
dahili ağ için kullanılacak yapılandırmadır. İlgili içeriği oluşturmak için kullanılan isteği, IP yapılandırması ve ağ için yeni ayarlar içerebilir özellikler. Öğe ağı, bağlantı yığınına kayıtlıysa yapılandırma. Bu yapılandırma, yeniden başlatma işlemleri sırasında kalıcı olmaz.getMainExecutor()
, işleyicinin çağrıldığı yürütücüyü döndürür.mCallback
, başarılı olduğunda güncellenmiş ağ adı veya şuradaEthernetNetworkManagementException
: hatası.
updateConfiguration()
, dikkate alınan bir ağın özelliklerini güncelleyebilir
tarafından değiştirilemez. İlgili içeriği oluşturmak için kullanılan
ağ, bu sabit husus için devre dışı bırakılır, güncellenir ve
özelliklerinin güncellenmesini sağlar.
Ağı bir uygulama alt kümesiyle kısıtlama
Erişimi yalnızca bir kullanıcı ile sınırlandırmak için EthernetManager#updateConfiguration
izin verilen UID'lerin alt kümesi. Bu yöntemin etkili olduğu kullanım alanlarını,
Örneğin, yalnızca küçük bir alt küme tarafından kullanılabilen dahili araç ağları için
satın alabilirsiniz.
Android, uygulamaları öncelikle UID'lerine göre izler.
Aşağıdaki kod,
UIDToPackageNameConverter.java
paket adları dizesinden bir dizi UID'nin nasıl alınacağını gösterir:
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;
Kodla ilgili önemli noktalar
getApplicationInfoAsuser().uid
, paket adı.uids
, oluşturulan tam sayı dizisidir.
Aşağıdaki kod
EthernetManagerTest.kt
ağ arayüzü yapılandırmanızı uygulamaların UID'leriyle nasıl güncelleyeceğinizi gösterir
ağı kullanmasına izin verilen siteler:
val allowedUids = setOf(Process.myUid())
val nc = NetworkCapabilities.Builder(request.networkCapabilities)
.setAllowedUids(allowedUids).build()
updateConfiguration(iface, capabilities = nc).expectResult(iface.name)
Kodla ilgili önemli noktalar
allowUids
, ağı kullanmasına izin verilen uygulama UID'leri grubudur.updateConfiguration()
, ağı şu şekilde kısıtlamak için yapılandırmayı günceller: sağlanan UID grubu.