Dahili Ethernet ağlarını yapılandırma

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ı:

Android Auto ağ iletişimi

Ş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 ve eth3, yapılandırılmakta olan ağ arayüzünün adlarıdır.
  • Ardışık 12, 13, 14, 15 sayıları temsil edilir ağ özellikler etkinleştiriliyor.
  • ip=, gateway= ve dns; 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 şurada EthernetNetworkManagementException: 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 şurada EthernetNetworkManagementException: 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çin convertToUIDs() ç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 önceden haber vermelidir. Bu nedenle, çevrimiçi Bir uygulama alt kümesine erişimi sınırlamak için EthernetManager.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 şurada EthernetNetworkManagementException: 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ümesidir. 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)

Nerede:

  • 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.