Изменения Ethernet в Android 13

Проводные изменения Android13

Функции, связанные с Ethernet, не сильно изменились в сетевой части Android12 и 13. С Android11 ​​до Android 12 сетевая часть была сильно изменена как в каталоге хранения кода, так и в логике кода, в основном включая следующие части.

  1. Метод интерфейса для настройки параметров проводной сети ограничен.

  2. Добавлен метод открытия и закрытия проводного сетевого интерфейса.

  3. Добавлен метод интерфейса updateConfiguration.

  4. Статический IP-адрес и информация о прокси-сервере, установленная проводной сетью, недействительна после перезапуска.

  5. Код, связанный с EthernetManager, был перенесен из платформы в packages/modules/Connectivity/ (предыдущий каталог: frameworks\base\core\java\android\net\EthernetManager.java). После разработки кода Android12 или новой версии вы обнаружите, что Wi-Fi, Bluetooth и точки доступа находятся раньше. Исходный код фреймворка был перемещен в следующий каталог пакета:

На основании вышеуказанных изменений. Если для API приложения (targetSdkVersion) установлено значение Android12, приложение не может использовать предыдущий интерфейс для установки информации о проводной сети.

  • Метод интерфейса для настройки параметров проводной сети ограничен.

//packages\modules\Connectivity\framework-t\src\android\net\EthernetManager.java
  /**
     * Get Ethernet configuration.
     * @return the Ethernet Configuration, contained in {@link IpConfiguration}.
     * @hide
     */
    @SystemApi(client = MODULE_LIBRARIES)
    public @NonNull IpConfiguration getConfiguration(@NonNull String iface) {
        try {
            return mService.getConfiguration(iface);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    /**
     * Set Ethernet configuration.
     * @hide
     */
    @SystemApi(client = MODULE_LIBRARIES)
    public void setConfiguration(@NonNull String iface, @NonNull IpConfiguration config) {
        try {
            mService.setConfiguration(iface, config);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }
    
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
    public String[] getAvailableInterfaces() {
        try {
            return mService.getAvailableInterfaces();
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
        }
    }

С вышеизложенной точки зрения основная причина в том, что API добавил ограничения: maxTargetSdk = Build.VERSION_CODES.R //Android11

Поэтому в Android 12 или более поздних версиях указанные выше методы интерфейса нельзя вызвать в EthernetManager.

  • Добавлен метод открытия и закрытия проводного сетевого интерфейса.

//packages\modules\Connectivity\framework-t\src\android\net\EthernetManager.java
    @RequiresPermission(anyOf = {
            NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK,
            android.Manifest.permission.NETWORK_STACK,
            android.Manifest.permission.NETWORK_SETTINGS})
    @SystemApi(client = MODULE_LIBRARIES)
    public void setEthernetEnabled(boolean enabled) {
        try {
            mService.setEthernetEnabled(enabled);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

Это новый интерфейсный метод setEthernetEnabled.Раньше вам приходилось самостоятельно реализовывать коммутатор проводной сети. Необходимые разрешения были объяснены выше.По сути, приложения должны быть подписаны системой, прежде чем их можно будет вызвать.

  • Добавлен метод интерфейса updateConfiguration.

//packages\modules\Connectivity\framework-t\src\android\net\EthernetManager.java
    @SystemApi
    @RequiresPermission(anyOf = {
            NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK,
            android.Manifest.permission.NETWORK_STACK,
            android.Manifest.permission.MANAGE_ETHERNET_NETWORKS})
    public void updateConfiguration(
            @NonNull String iface,
            @NonNull EthernetNetworkUpdateRequest request,
            @Nullable @CallbackExecutor Executor executor,
            @Nullable OutcomeReceiver<String, EthernetNetworkManagementException> callback) {
        Objects.requireNonNull(iface, "iface must be non-null");
        Objects.requireNonNull(request, "request must be non-null");
        final NetworkInterfaceOutcomeReceiver proxy = makeNetworkInterfaceOutcomeReceiver(
                executor, callback);
        try {
            mService.updateConfiguration(iface, request, proxy);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

Строка iface //Имя узла: eth0  /eth1

Объект запроса EthernetNetworkUpdateRequest содержит статические информационные объекты IP-адреса и прокси-сервера, а также объекты характеристических атрибутов.

Последние два являются мониторами обратного вызова, которые не обязательно должны быть ненулевыми и могут передавать нулевое значение.

Кроме того, в услугах кабельной сети новый API добавил ограничения!

//packages\modules\Connectivity\service-t\src\com\android\server\ethernet\EthernetServiceImpl.java

    @Override
    public void updateConfiguration(@NonNull final String iface,
            @NonNull final EthernetNetworkUpdateRequest request,
            @Nullable final INetworkInterfaceOutcomeReceiver listener) {
        Objects.requireNonNull(iface);
        Objects.requireNonNull(request);
        throwIfEthernetNotStarted();


        // TODO: validate that iface is listed in overlay config_ethernet_interfaces
        // only automotive devices are allowed to set the NetworkCapabilities using this API
        //only automotive devices 表明,只有 车载设备支持设置该方法
+        // 非车载项目必须注释调方法:enforceAdminPermission ,否则会报错,这里是校验是否是车载项目
+        //enforceAdminPermission(iface, request.getNetworkCapabilities() != null,
+         //       "updateConfiguration() with non-null capabilities");
+        Log.i(TAG, " lwz add updateConfiguration with: iface=" + iface + ", listener=" + listener);
        maybeValidateTestCapabilities(iface, request.getNetworkCapabilities());

        mTracker.updateConfiguration(
                iface, request.getIpConfiguration(), request.getNetworkCapabilities(), listener);
    }

Таким образом, если вы хотите вызвать новый API в своем собственном проекте, вам необходимо установить свойства, позволяющие распознавать ваше устройство как проект, установленный на транспортном средстве , или удалить логику оценки, установленную на транспортном средстве.

  • Статический IP-адрес и информация о прокси-сервере, установленная проводной сетью, недействительна после перезапуска.

//查看有线网配置信息保存的类:
packages\modules\Connectivity\service-t\src\com\android\server\ethernet\EthernetConfigStore.java

    private static final String CONFIG_FILE = "ipconfig.txt";
    private static final String FILE_PATH = "/misc/ethernet/";
    private static final String LEGACY_IP_CONFIG_FILE_PATH = Environment.getDataDirectory() + FILE_PATH;
    //Android13 新增下面路径:
    private static final String APEX_IP_CONFIG_FILE_PATH = ApexEnvironment.getApexEnvironment(
            TETHERING_MODULE_NAME).getDeviceProtectedDataDir() + FILE_PATH; // TETHERING_MODULE_NAME --》com.android.tethering

/**
可以看到之前的路径是:
/data/misc/ethernet/ipconfig.txt
最新的有线网配置文件保存目录:
/data/misc/apexdata/com.android.tethering/misc/ethernet/ipconfig.txt
可能存在因为未成功保存本地配置文件,所以每次开机重启后,无法读取到静态ip和代理等信息。
所以出现 有线网设置的静态ip和代理信息重启后无效 问题。主要原因为开机读取的时候,目录未成功创建,故保存未成功。
可以参考如下:
*/

//packages\modules\Connectivity/service-t/src/com/android/server/ethernet/EthernetConfigStore.java

    @VisibleForTesting
    void read(final String newFilePath, final String oldFilePath, final String filename) {
        try {
            synchronized (mSync) {
                // Attempt to read the IP configuration from apex file path first.
                if (doesConfigFileExist(newFilePath + filename)) {
                    loadConfigFileLocked(newFilePath + filename);
                    return;
                }
                //ik-phoebe add for create dir data/misc/apexdata/com.android.tethering/misc/ethernet
                final File directory = new File(newFilePath);
                if (!directory.exists()) {
                    boolean mkdirs = directory.mkdirs();
                    Log.d(TAG, "zmm add for mkdirs:" + newFilePath + ",result:" + mkdirs);
                }
                // If the config file doesn't exist in the apex file path, attempt to read it from
                // the legacy file path, if config file exists, write the legacy IP configuration to
                // apex config file path, this should just happen on the first boot. New or updated
                // config entries are only written to the apex config file later.
                if (!doesConfigFileExist(oldFilePath + filename)) return;
                loadConfigFileLocked(oldFilePath + filename);
                writeLegacyIpConfigToApexPath(newFilePath, oldFilePath, filename);
            }
        } catch (Exception e) {
            e.printStackTrace();
            Log.e(TAG, "zmm add for read exception:" + e.getMessage());
        }
    }

Идеи по адаптации проводной сети Android13

В основном из следующих двух аспектов:

(1) Используйте новый интерфейс API для установки статического IP-адреса и информации о прокси-сервере.

(2) Удалите номер версии ограниченного интерфейса в исходном коде. В настоящее время я использую два, но если проект требует сертификации gms, вы можете использовать только один, потому что jar, создаваемый gms при объединении с основной линией, packages\modules \Connectivity будет перезаписан. .

diff --git a/framework-t/api/module-lib-current.txt b/framework-t/api/module-lib-current.txt
index 5a8d47b..177f6c5 100644
--- a/framework-t/api/module-lib-current.txt
+++ b/framework-t/api/module-lib-current.txt
@@ -44,9 +44,11 @@ package android.net {
   public class EthernetManager {
     method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public void addEthernetStateListener(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.IntConsumer);
     method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public void addInterfaceStateListener(@NonNull java.util.concurrent.Executor, @NonNull android.net.EthernetManager.InterfaceStateListener);
+    method @NonNull public android.net.IpConfiguration getConfiguration(@NonNull String);
     method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public java.util.List<java.lang.String> getInterfaceList();
     method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public void removeEthernetStateListener(@NonNull java.util.function.IntConsumer);
     method public void removeInterfaceStateListener(@NonNull android.net.EthernetManager.InterfaceStateListener);
+    method public void setConfiguration(@NonNull String, @NonNull android.net.IpConfiguration);
     method @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_STACK, android.Manifest.permission.NETWORK_SETTINGS}) public void setEthernetEnabled(boolean);
     method public void setIncludeTestInterfaces(boolean);
     field public static final int ETHERNET_STATE_DISABLED = 0; // 0x0
diff --git a/framework-t/src/android/net/EthernetManager.java b/framework-t/src/android/net/EthernetManager.java
index 886d194..9c675fb 100644
--- a/framework-t/src/android/net/EthernetManager.java
+++ b/framework-t/src/android/net/EthernetManager.java
@@ -191,8 +191,8 @@ public class EthernetManager {
      * @return the Ethernet Configuration, contained in {@link IpConfiguration}.
      * @hide
      */
-    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-    public IpConfiguration getConfiguration(String iface) {
+    @SystemApi(client = MODULE_LIBRARIES)
+    public @NonNull IpConfiguration getConfiguration(@NonNull String iface) {
         try {
             return mService.getConfiguration(iface);
         } catch (RemoteException e) {
@@ -204,7 +204,7 @@ public class EthernetManager {
      * Set Ethernet configuration.
      * @hide
      */
-    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
+    @SystemApi(client = MODULE_LIBRARIES)
     public void setConfiguration(@NonNull String iface, @NonNull IpConfiguration config) {
         try {
             mService.setConfiguration(iface, config);
-- 
2.17.1

Конечно, лучше всего использовать метод обновления IP, предоставляемый системой:

   IpConfiguration.Builder build = new IpConfiguration.Builder();
        EthernetNetworkUpdateRequest.Builder requestBuilder = new EthernetNetworkUpdateRequest.Builder();
  build.setHttpProxy(proxyinfo);
//如果是静态ip,需要创建对应的静态staticIpConfiguration
 build.setStaticIpConfiguration(staticIpConfiguration);
   requestBuilder.setIpConfiguration(build.build());
        mEthManager.updateConfiguration("eth0", requestBuilder.build(), null, null);

Выше приведены обновления, связанные с Android13 Ethernet.

Единый цикл «Мантра Великого Сострадания»

Je suppose que tu aimes

Origine blog.csdn.net/androidzmm/article/details/132534388
conseillé
Classement