ضبط إعدادات شبكات إيثرنت الداخلية

يحتوي نظام التشغيل Android Auto OS 13 والإصدارات الأحدث على ميزات تتيح لك ضبط شبكات إيثرنت وإدارتها. يعرض الشكل 1 مثالاً على مخطط شبكة لسيارة:

الشبكات في Android Auto

الشكل 1: الشبكات في Android Auto

يوضّح هذا الشكل تطبيق الشبكات الخاص بالمصنّع الأصلي للجهاز الذي يستدعي طرقًا في الفئة EthernetManager لضبط شبكات إيثرنت المضمّنة (eth0.1 وeth0.2 وeth0.3) وإدارتها. لا يتناول هذا المستند بقية الشكل 1.

ضبط الإعدادات التلقائية لشبكة إيثرنت

لضبط الإعدادات التلقائية للشبكة، استخدِم تراكب الموارد 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>

يعرض هذا المثال تراكب الموارد config_ethernet_interfacesمن config.xml.

نقاط أساسية حول التعليمات البرمجية

تفعيل واجهة شبكة أو إيقافها

لتفعيل واجهة شبكة، استدعِ الدالة 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);
    }
}

نقاط أساسية حول التعليمات البرمجية

  • ifaceName هو اسم واجهة الشبكة التي سيتم تفعيلها.
  • تعرض الدالة getMainExecutor() سياق التطبيق.
  • OutcomeReceiver هي دالة معاودة الاتصال تُستخدَم للإبلاغ عن اكتمال العملية، حيث تعرض اسم الشبكة المعدَّل في حال النجاح أو EthernetNetworkManagementException في حال حدوث خطأ.

عند تفعيل واجهة شبكة، تستخدِم الإعدادات التي تم ضبطها من خلال EthernetManager.updateConfiguration(). إذا لم يتم ضبط إعدادات من خلال EthernetManager.updateConfiguration()، تستخدِم واجهة الشبكة تراكب الموارد config_ethernet_interfaces أو الإعدادات التلقائية لشبكة إيثرنت إذا لم يتوفّر تراكب.

لإيقاف واجهة شبكة، استدعِ الدالة 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);
    }
}

نقاط أساسية حول التعليمات البرمجية

  • ifaceName هو اسم واجهة الشبكة التي سيتم إيقافها.
  • تعرض الدالة getMainExecutor() سياق التطبيق.
  • OutcomeReceiver هي دالة معاودة الاتصال تُستخدَم للإبلاغ عن اكتمال العملية، حيث تعرض اسم الشبكة المعدَّل في حال النجاح أو EthernetNetworkManagementException في حال حدوث خطأ.

تعديل إعدادات الشبكة

لتعديل إعدادات شبكة إيثرنت، استدعِ الدالة 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);

    }
}

نقاط أساسية حول التعليمات البرمجية

  • getCapabilities() هي طريقة مساعِدة تحصل على إمكانات الشبكة الحالية وتستدعي convertToUIDs() لتحويل أسماء الحِزم التي يمكن قراءتها إلى معرّف مستخدم فريد (UID) لنظام Linux. عادةً، لا تعرف أرقام تعريف المستخدمين الفريدة مسبقًا للحِزم المرتبطة بها. لذلك، إذا أردت استخدام EthernetManager.updateConfiguration() لحصر إمكانية الوصول إلى مجموعة فرعية من التطبيقات، عليك استخدام أرقام تعريف المستخدمين الفريدة الخاصة بها.
  • request هي الإعدادات التي سيتم استخدامها للشبكة الداخلية. يمكن أن يحتوي الطلب على إعدادات جديدة لإعدادات IP وإمكانات الشبكة. إذا تم تسجيل الشبكة في مجموعة بروتوكولات الاتصال، يتم تعديلها وفقًا للإعدادات. لا يتم الاحتفاظ بهذه الإعدادات بعد إعادة التشغيل.
  • تعرض الدالة getMainExecutor() المنفِّذ الذي يتم استدعاء المستمع عليه.
  • mCallback هي دالة معاودة الاتصال تُستخدَم للإبلاغ عن اكتمال العملية، حيث تعرض اسم الشبكة المعدَّل في حال النجاح أو EthernetNetworkManagementException في حال حدوث خطأ.

قد تعدِّل الدالة updateConfiguration() خصائص شبكة تعتبرها مجموعة بروتوكولات الاتصال في Android غير قابلة للتغيير. يتم إيقاف الشبكة وتعديلها وإعادة تفعيلها لتعديل هذه السمات غير القابلة للتغيير.

حصر إمكانية الوصول إلى شبكة لمجموعة فرعية من التطبيقات

يمكنك استخدام EthernetManager#updateConfiguration لحصر إمكانية الوصول إلى مجموعة فرعية فقط من أرقام تعريف المستخدمين الفريدة المسموح بها. استخدِم هذه الطريقة لتغطية حالات الاستخدام التي تتطلب ذلك، مثل الشبكات الداخلية للمركبات التي لا يمكن استخدامها إلا من خلال مجموعة فرعية صغيرة من تطبيقات المصنّع الأصلي للجهاز.

يتتبّع Android التطبيقات بشكل أساسي حسب رقم تعريف المستخدم الفريد الخاص بها. يوضّح الرمز التالي من UIDToPackageNameConverter.java كيفية الحصول على سلسلة من أرقام تعريف المستخدمين الفريدة من سلسلة من أسماء الحِزم:

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;

نقاط أساسية حول التعليمات البرمجية

  • يتم استخدام getApplicationInfoAsuser().uid لاسترداد رقم تعريف المستخدم الفريد من اسم الحزمة.
  • uids هي مصفوفة الأعداد الصحيحة التي تم إنشاؤها.

يوضّح الرمز التالي في EthernetManagerTest.kt كيفية تعديل إعدادات واجهة الشبكة باستخدام أرقام تعريف المستخدمين الفريدة للتطبيقات المسموح لها باستخدام الشبكة:

val allowedUids = setOf(Process.myUid())
        val nc = NetworkCapabilities.Builder(request.networkCapabilities)
                .setAllowedUids(allowedUids).build()
        updateConfiguration(iface, capabilities = nc).expectResult(iface.name)

نقاط أساسية حول التعليمات البرمجية

  • allowUids هي مجموعة أرقام تعريف المستخدمين الفريدة للتطبيقات المسموح لها باستخدام الشبكة.
  • تعدِّل الدالة updateConfiguration() الإعدادات لحصر الشبكة على مجموعة أرقام تعريف المستخدمين الفريدة المقدَّمة.