يتضمّن الإصدار 14 من نظام التشغيل Android تغييرات في السلوك قد تؤثّر في تطبيقك.
تنطبق تغييرات السلوك التالية على جميع التطبيقات عند تشغيلها على الإصدار 14 من نظام التشغيل Android،
بغض النظر عن
targetSdkVersion. عليك اختبار تطبيقك ثم تعديله حسب الحاجة ليتوافق مع هذه الميزات بشكل صحيح، حيثما ينطبق ذلك.
احرص أيضًا على مراجعة قائمة التغييرات في السلوك التي تؤثّر فقط في التطبيقات التي تستهدف الإصدار 14 من نظام التشغيل Android.
الوظيفة الأساسية
يتم رفض جدولة المنبّهات المحدَّدة الوقت تلقائيًا
تكون المنبّهات المحدّدة الوقت مخصّصة للإشعارات التي يقصدها المستخدم أو للإجراءات التي
يجب أن تحدث في وقت محدد. بدءًا من الإصدار 14 من نظام التشغيل Android، لم يعُد يتم منح الإذن
SCHEDULE_EXACT_ALARM
مسبقًا لمعظم التطبيقات المثبَّتة حديثًا
التي تستهدف الإصدار 13 من نظام التشغيل Android والإصدارات الأحدث، ويتم رفضه تلقائيًا.
مزيد من المعلومات عن التغييرات في الإذن لجدولة رسائل التنبيهات المُحدَّدة
يتم وضع عمليات البث المسجّلة حسب السياق في قائمة الانتظار أثناء تخزين التطبيقات مؤقتًا
On Android 14, the system can place context-registered broadcasts in a queue while the app is in the cached state. This is similar to the queuing behavior that Android 12 (API level 31) introduced for async binder transactions. Manifest-declared broadcasts aren't queued, and apps are removed from the cached state for broadcast delivery.
When the app leaves the cached state, such as returning to the foreground, the system delivers any queued broadcasts. Multiple instances of certain broadcasts might be merged into one broadcast. Depending on other factors, such as system health, apps might be removed from the cached state, and any previously queued broadcasts are delivered.
يمكن للتطبيقات إنهاء عمليات الخلفية الخاصة بها فقط
بدءًا من الإصدار 14 من نظام التشغيل Android، عندما يطلب تطبيقك killBackgroundProcesses()،
لا يمكن لواجهة برمجة التطبيقات إنهاء سوى العمليات التي تعمل في الخلفية لتطبيقك.
إذا مررت اسم الحزمة لتطبيق آخر، فلن يكون لهذه الطريقة أي تأثير في في خلفية هذا التطبيق، وستظهر الرسالة التالية في Logcat:
Invalid packageName: com.example.anotherapp
يجب ألا يستخدم تطبيقك واجهة برمجة التطبيقات killBackgroundProcesses() أو يحاول بأي شكل آخر.
للتأثير في دورة حياة عمليات التطبيقات الأخرى، حتى في إصدارات أنظمة التشغيل القديمة.
تم تصميم Android للاحتفاظ بالتطبيقات المخزّنة مؤقتًا في الخلفية ومنعها
تلقائيًا عندما يحتاج النظام إلى ذاكرة. إذا كان تطبيقك يغلق التطبيقات الأخرى
غير الضرورية، يمكن أن يؤدي ذلك إلى تقليل أداء النظام وزيادة استهلاك البطارية
من خلال طلب إعادة تشغيل هذه التطبيقات بالكامل لاحقًا، ما يستغرق موارد
أكثر بكثير من استئناف تطبيق حالي محفوظ في ذاكرة التخزين المؤقت.
تم ضبط وحدة النقل القصوى (MTU) على 517 لأول عميل GATT يطلب وحدة نقل قصوى
اعتبارًا من الإصدار 14 من Android، يلتزم حِزمة Android Bluetooth بشكل أكثر صرامة بالإصدار 5.2 من مواصفات Bluetooth الأساسية ويطلب
وحدة النقل القصوى (MTU) لبروتوكول ATT في BLE (البروتوكول الخفيف لواجهة برمجة التطبيقات) لتكون 517 بايت عندما يطلب أول عميل GATT وحدة النقل القصوى باستخدام BluetoothGatt#requestMtu(int) API، ويتجاهل كل طلبات MTU التالية
في اتصال ACL هذا.
لحلّ هذه المشكلة وجعل تطبيقك أكثر أمانًا، ننصحك بالاطّلاع على الخطوات التالية:
- يجب أن يستجيب الجهاز الملحق لطلب وحدة تحكُّم في حدود الجلسة (MTU) من جهاز Android
بقيمة معقولة يمكن للجهاز الملحق التعامل معها. ستكون
القيمة النهائية التي تم التفاوض عليها الحد الأدنى للقيمة المطلوبة في Android و
القيمة المقدَّمة في جهاز التحكّم عن بُعد (على سبيل المثال،
min(517, remoteMtu)).- قد يتطلّب تطبيق هذا الإصلاح تحديث البرامج الثابتة للجهاز الملحق.
- بدلاً من ذلك، يمكنك الحد من عمليات الكتابة في سمة GATT استنادًا إلى الحد الأدنى
بين القيمة المعروفة المتوافقة للجهاز الطرفي وMTU المستلَم
تغيير
- تذكير بأنّه عليك تقليل 5 بايت من الحجم المسموح به لملف الرؤوس
- على سبيل المثال:
arrayMaxLength = min(SUPPORTED_MTU, GATT_MAX_ATTR_LEN(517)) - 5
سبب جديد لوضع تطبيق في حزمة وضع الاستعداد المقيد
Android 14 introduces a new reason an app can be placed into the restricted standby bucket.
The app's jobs trigger ANR errors multiple times due to onStartJob,
onStopJob, or onBind method timeouts.
(See JobScheduler reinforces callback and network behavior for changes
to onStartJob and onStopJob.)
To track whether or not the app has entered the restricted standby bucket,
we recommend logging with the API UsageStatsManager.getAppStandbyBucket()
on job execution or UsageStatsManager.queryEventsForSelf() on app startup.
يقتصر حجم mlock على 64 كيلوبايت
في الإصدار 14 من نظام التشغيل Android (المستوى 34 لواجهة برمجة التطبيقات) والإصدارات الأحدث، يخفض النظام الأساسي الحد الأقصى للذاكرة
التي يمكن قفلها باستخدام mlock() إلى 64 كيلوبايت لكل عملية. في الإصدارات السابقة، كان الحد الأقصى هو 64 ميغابايت لكل عملية. ويؤدي هذا القيد
إلى تحسين إدارة الذاكرة على مستوى التطبيقات والنظام. لتوفير المزيد من
الاتساق على جميع الأجهزة، يضيف Android 14 اختبار CTS جديدًا لحدود mlock() الجديدة على الأجهزة المتوافقة.
يفرض النظام استخدام موارد التطبيقات المخزَّنة مؤقتًا
By design, an app's process is in a cached state when it's moved to the
background and no other app process components are running. Such an app process
is subject to being killed due to system memory pressure. Any work that
Activity instances perform after the onStop() method has been called and
returned, while in this state, is unreliable and strongly discouraged.
Android 14 introduces consistency and enforcement to this design. Shortly after an app process enters a cached state, background work is disallowed, until a process component re-enters an active state of the lifecycle.
Apps that use typical framework-supported lifecycle APIs – such as
services, JobScheduler, and Jetpack WorkManager – shouldn't be
impacted by these changes.
تجربة المستخدم
التغييرات في تجربة المستخدمين للإشعارات التي لا يمكن إغلاقها
If your app shows non-dismissable foreground notifications to users, Android 14 has changed the behavior to allow users to dismiss such notifications.
This change applies to apps that prevent users from dismissing foreground
notifications by setting Notification.FLAG_ONGOING_EVENT through
Notification.Builder#setOngoing(true) or
NotificationCompat.Builder#setOngoing(true). The behavior of
FLAG_ONGOING_EVENT has changed to make such notifications actually
dismissable by the user.
These kinds of notifications are still non-dismissable in the following conditions:
- When the phone is locked
- If the user selects a Clear all notification action (which helps with accidental dismissals)
Also, this new behavior doesn't apply to notifications in the following use cases:
CallStylenotifications- Device policy controller (DPC) and supporting packages for enterprise
- Media notifications
- The default Search Selector package
معلومات "أمان البيانات" أصبحت أكثر وضوحًا
لتعزيز خصوصية المستخدم، يزيد الإصدار 14 من Android من عدد الأماكن التي يعرض فيها النظام المعلومات التي قدّمت بيانًا عنها في نموذج Play Console. يمكن للمستخدمين حاليًا الاطّلاع على هذه المعلومات في قسم أمان البيانات ضمن بطاقة بيانات تطبيقك على Google Play.
ننصحك بمراجعة سياسات مشاركة بيانات الموقع الجغرافي في تطبيقك والاطّلاع على أي تعديلات ضرورية لإجراءها في قسم "أمان البيانات" على Google Play.
اطّلِع على مزيد من المعلومات في الدليل حول كيفية عرض معلومات أمان البيانات بشكل أكثر وضوحًا على نظام التشغيل Android 14.
تسهيل الاستخدام
الضبط غير الخطي لحجم الخط بما يصل إلى 200%
بدءًا من الإصدار 14 من نظام التشغيل Android، يتيح النظام تكبير الخط بنسبة تصل إلى %200، ما يوفّر للمستخدمين خيارات إضافية لتسهيل الاستخدام.
إذا كنت تستخدم وحدات بكسل قابلة للتوسّع (sp) لتحديد حجم النص، من المحتمل ألا يكون لهذا التغيير تأثير كبير في تطبيقك. ومع ذلك، عليك إجراء اختبار لواجهة المستخدم مع تفعيل الحد الأقصى لحجم الخط (200%) للتأكّد من أنّ تطبيقك يمكنه استيعاب أحجام خطوط أكبر بدون التأثير في سهولة الاستخدام.
الأمان
الحد الأدنى لمستوى واجهة برمجة التطبيقات المستهدف القابل للتثبيت
بدءًا من نظام التشغيل Android 14، سيتم توفير
targetSdkVersion أقل من 23
تطبيق جديد. إنّ اشتراط استيفاء التطبيقات لمتطلبات المستوى الأدنى لواجهة برمجة التطبيقات المستهدَفة
يساهم في تحسين الأمان والخصوصية للمستخدمين.
تستهدف البرامج الضارة المستويات القديمة من واجهة برمجة التطبيقات غالبًا لتجاوز الأمان والخصوصية
في الإصدارات الأحدث من نظام التشغيل Android. على سبيل المثال:
تستخدم بعض التطبيقات الضارة القيمة targetSdkVersion من 22 لتجنُّب تعرُّضها
نموذج إذن وقت التشغيل الذي تم تقديمه في عام 2015 من خلال نظام التشغيل Android 6.0 Marshmallow (واجهة برمجة التطبيقات)
المستوى 23). يصعِّب هذا التغيير في Android 14 على البرامج الضارّة تجنُّب تحسينات الأمان
والخصوصية.
ستؤدي محاولة تثبيت تطبيق يستهدف مستوى أقل لواجهة برمجة التطبيقات إلى حدوث
فشل في التثبيت، مع ظهور الرسالة التالية في Logcat:
INSTALL_FAILED_DEPRECATED_SDK_VERSION: App package must target at least SDK version 23, but found 7
على الأجهزة التي يتم ترقيتها إلى Android 14، ستظل أي تطبيقات targetSdkVersionمثبَّتة
إذا كان إصدارها أقل من 23.
إذا كنت بحاجة إلى اختبار تطبيق يستهدف مستوى واجهة برمجة تطبيقات أقدم، استخدم ADB التالي :com
adb install --bypass-low-target-sdk-block FILENAME.apk
قد يتم إخفاء أسماء حِزم مالكي الوسائط
The media store supports queries for the OWNER_PACKAGE_NAME column, which
indicates the app that stored a particular media file. Starting in Android
14, this value is redacted unless at least one of the following conditions is
true:
- The app that stored the media file has a package name that is always visible to other apps.
The app that queries the media store requests the
QUERY_ALL_PACKAGESpermission.
Learn more about how Android filters package visibility for privacy purposes.