تنفيذ إدارة الجهاز

يصف هذا القسم كيفية تمكين والتحقق من صحة ميزات إدارة الجهاز المطلوبة لإعداد الأجهزة لملفات التعريف المدارة. كما يغطي حالات مستخدم مالك الجهاز الضرورية في بيئة الشركة.

بالإضافة إلى رمز AOSP ، يتطلب الجهاز المكونات التالية لتعمل مع ملفات التعريف المدارة.

المتطلبات العامة

يجب أن تفي الأجهزة التي تهدف إلى دعم إدارة الجهاز بالمتطلبات العامة التالية.

قيم HAL الحرارية

يشتمل Android 7.0 والإصدارات الأحدث على دعم واجهة برمجة تطبيقات HardwarePropertiesManager ، وهي واجهة برمجة تطبيقات لمراقبة الأجهزة وإعداد تقارير صحية تتيح للتطبيقات الاستعلام عن حالة أجهزة الجهاز. يتم الكشف عن واجهة برمجة التطبيقات هذه عبر android.os.HardwarePropertiesManager وإجراء مكالمات من خلال HardwarePropertiesManagerService إلى HAL الحراري hardware/libhardware/include/hardware/thermal.h ( hardware/libhardware/include/hardware/thermal.h ). إنها واجهة برمجة تطبيقات محمية ، وهذا يعني فقط تطبيقات وحدة التحكم في سياسة الجهاز (DPC) لمالك الجهاز / الملف الشخصي ويمكن لـ VrListenerService الحالية VrListenerService .

لدعم واجهة برمجة تطبيقات HardwarePropertiesManager ، يجب أن يكون تنفيذ HAL الحراري للجهاز قادرًا على الإبلاغ عن القيم التالية:

قيمة مقياس التقارير تمكن
درجة حرارة [وحدة المعالجة المركزية | وحدة معالجة الرسومات | البطارية | غلاف الجهاز] درجة حرارة المكون بالدرجات المئوية يمكن للتطبيقات التحقق من درجات حرارة الجهاز ودرجات حرارة اختناق / إيقاف تشغيل المكونات
وحدة المعالجة المركزية النشطة / إجمالي عدد مرات التمكين الوقت بالميلي ثانية يمكن للتطبيقات التحقق من استخدام وحدة المعالجة المركزية لكل مركز
سرعة المروحة دورة في الدقيقة يمكن للتطبيقات التحقق من سرعة المروحة

يجب أن تتعامل التطبيقات بشكل صحيح مع مواقف قيم الإبلاغ عندما ينقطع اتصال النواة (أو وحدة معالجة الرسومات ، والبطارية ، والمروحة) أو يتم توصيله / فصله.

لا توجد ذاكرة وصول عشوائي منخفضة

يجب ألا يكون الجهاز عبارة عن جهاز ذا ذاكرة وصول عشوائي منخفضة ، مما يعني ro.config.low_ram يجب عدم تحديد ro.config.low_ram . يحدد إطار العمل تلقائيًا عدد المستخدمين إلى 1 عند low_ram علامة low_ram .

يستخدم ميزة

يجب أن تحدد الأجهزة uses-feature التالية:

android.software.managed_users
android.software.device_admin

لتأكيد أن قيم uses-feature هذه قد تم تحديدها على الجهاز ، قم بتشغيل: adb shell pm list features .

التطبيقات الأساسية فقط

بشكل افتراضي ، يجب تمكين التطبيقات الضرورية فقط للتشغيل الصحيح لملف التعريف كجزء من توفير جهاز مُدار. يجب أن يضمن المصنّعون الأصليون للجهاز احتواء الملف الشخصي المُدار أو الجهاز على جميع التطبيقات المطلوبة عن طريق تعديل:

vendor_required_apps_managed_profile.xml
vendor_required_apps_managed_device.xml
vendor_disallowed_apps_managed_profile.xml
vendor_disallowed_apps_managed_device.xml
/*
 * The following are for Android 9 and higher only
 */
vendor_required_apps_managed_user.xml
vendor_disallowed_apps_managed_user.xml

يتم تطبيق التطبيقات المطلوبة وغير المسموح بها للمستخدمين DevicePolicyManager#createAndManageUser على المستخدمين الثانويين الذين تم DevicePolicyManager#createAndManageUser عبر DevicePolicyManager#createAndManageUser .

أمثلة من جهاز Nexus:

Android 8.x والإصدارات الأقدم

pacakages/apps/ManagedProvisioning/res/values/vendor_required_apps_managed_device.xml

Android 9 والإصدارات الأحدث

frameworks/base/core/res/res/values/vendor_required_apps_managed_device.xml
<resources>
  <!-- A list of apps to be retained on the managed device -->
  <string-array name="vendor_required_apps_managed_device">
    <item>com.android.vending</item> <!--­Google Play -->
    <item>com.google.android.gms</item> <!--­Required by Play -->
    <item>com.google.android.contacts</item> <!--­Google or OEM Contacts­-->
    <item>com.google.android.googlequicksearchbox</item> <!--­Google Launcher -->
    <item>com.google.android.launcher</item> <!--­Google Launcher or OEM Launcher -->
    <item>com.google.android.dialer</item> <!--­Google or OEM dialer to enable making phone calls -->
  </string-array>
</resources>

Android 8.x والإصدارات الأقدم

packages/apps/ManagedProvisioning/res/values/vendor_required_apps_managed_profile.xml

Android 9 والإصدارات الأحدث

frameworks/base/core/res/res/values/vendor_required_apps_managed_profile.xml
<resources>
    <!-- A list of apps to be retained in the managed profile. This includes any Google experience apps required. -->
    <string-array name="vendor_required_apps_managed_profile">
        <item>com.android.vending</item> <!-- Google Play -->
        <item>com.google.android.gms</item> <!-- Required by Play -->
        <item>com.google.android.contacts</item> <!-- Google or OEM Contacts -->
    </string-array>
</resources>

متطلبات قاذفة

يجب عليك تحديث المشغل لدعم تطبيقات الشارات بشارة الأيقونة (المتوفرة في AOSP لتمثيل التطبيقات المدارة) وعناصر واجهة مستخدم الشارة الأخرى مثل الإخطارات والإشعارات. إذا كنت تستخدم Launcher3 في AOSP بدون تعديلات ، فمن المحتمل أنك تدعم بالفعل ميزة الشارات هذه.

متطلبات NFC

يجب أن تقوم الأجهزة المزودة بتقنية NFC بتمكين NFC أثناء التجربة الجاهزة (أي معالج الإعداد) وتهيئتها لقبول أهداف التوفير المُدارة:

packages/apps/Nfc/res/values/provisioning.xml
<bool name="enable_nfc_provisioning">true</bool>
<item>application/com.android.managedprovisioning</item>

متطلبات الإعداد

يجب أن تنفذ الأجهزة التي تتضمن تجربة جاهزة (أي معالج الإعداد) توفير مالك الجهاز. عند فتح تجربة المنتج الجاهز ، يجب أن تتحقق مما إذا كانت عملية أخرى (مثل توفير مالك الجهاز) قد انتهت بالفعل من إعداد المستخدم ، وإذا كان الأمر كذلك ، فيجب أن تطلق نية منزلية وتنتهي من الإعداد. تم اكتشاف هذه النية من خلال تطبيق التوفير ، والذي بدوره يسلم التحكم إلى مالك الجهاز الذي تم تعيينه حديثًا.

لتلبية متطلبات الإعداد ، أضف الكود التالي إلى النشاط الرئيسي لإعداد الجهاز:

@Override
   protected void onStart() {
        super.onStart();

        // When returning to a setup wizard activity, check to see if another setup process
        // has intervened and, if so, complete an orderly exit
        boolean completed = Settings.Secure.getInt(getContentResolver(),
                Settings.Secure.USER_SETUP_COMPLETE, 0) != 0;
        if (completed) {
           startActivity(new Intent(Intent.ACTION_MAIN, null)
                .addCategory(Intent.CATEGORY_HOME)
                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                        | Intent.FLAG_ACTIVITY_CLEAR_TASK
                        | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED));
           finish();
       }

       ...
   }