
مرحبا بالجميع! استغرقنا بعض الوقت لمتابعة سلسلة من المقالات حول جهاز Android الداخلي. في هذه المقالة ، سأتحدث عن عملية تمهيد Android ، وعن محتويات نظام الملفات ، وعن كيفية تخزين بيانات المستخدم والتطبيق ، وعن الوصول إلى الجذر ، وإمكانية نقل إصدارات Android ، وحول مشكلة التجزئة.
مقالات سلسلة:
الحزم
كما قلت من قبل ، فإن بنية Android مبنية على التطبيقات. إنها التطبيقات التي تلعب دورًا رئيسيًا في جهاز العديد من أجزاء النظام ، ومن أجل التفاعل المتناسق للتطبيقات التي يتم بناء نماذج النشاط والقصد ، ويستند نموذج أمان Android على عزل التطبيقات. وإذا كان مدير النشاط يشارك في تنسيق تفاعل مكونات التطبيق ، فإن مدير الحزم مسؤول عن تثبيت وتحديث وإدارة حقوق التطبيق (مدير الحزم - يمكنك تسميتها في shell باستخدام الأمر pm
).
كما يوحي الاسم "مدير الحزم" ، غالبًا ما تسمى التطبيقات على الحزم . يتم توزيع الحزم بتنسيق APK (حزمة Android) - أرشيفات مضغوطة خاصة. لكل حزمة اسم (يُعرف أيضًا باسم معرف التطبيق ) يحدد هذا التطبيق بشكل فريد (ولكن ليس نسخته المحددة - بل على العكس ، يجب أن تتطابق أسماء الإصدارات المختلفة من الحزمة ، وإلا سيتم اعتبارها حزم منفصلة). عادةً ما تتم كتابة أسماء الحزم في تدوين اسم DNS العكسي - على سبيل المثال ، يستخدم تطبيق YouTube اسم الحزمة com.google.android.youtube
. غالبًا ما يتطابق اسم الحزمة مع مساحة الاسم المستخدمة في رمز Java الخاص به ، ولكن Android لا يتطلبها (بالإضافة إلى ذلك ، تتضمن ملفات APK الخاصة بالتطبيق عادةً مكتبات تابعة لجهات خارجية ، والتي لا تتعلق مساحة الاسم بالطبع بأسماء الحزم على الإطلاق ، الذين يستخدمونها).
يجب أن يوقع المطور كل حزمة APK أثناء التجميع باستخدام توقيع رقمي. يتحقق Android من وجود هذا التوقيع عند تثبيت التطبيق ، وعند تحديث تطبيق مثبت بالفعل ، يقارن أيضًا المفاتيح العامة التي تم توقيع الإصدارات القديمة والجديدة عليها ؛ يجب أن تتطابق ، مما يضمن أن الإصدار الجديد تم إنشاؤه من قبل نفس المطور مثل الإصدار القديم. (إذا لم يكن هذا الاختيار متاحًا ، فيمكن للمهاجم إنشاء حزمة تحمل نفس اسم التطبيق الحالي ، وإقناع المستخدم بتثبيته من خلال "تحديث" التطبيق ، والوصول إلى بيانات هذا التطبيق.)
تحديث الحزمة نفسها هو تثبيت إصدارها الجديد بدلاً من الإصدار القديم مع الحفاظ على البيانات والأذونات الواردة من المستخدم. يمكنك أيضًا "إرجاع" التطبيقات إلى إصدارات أقدم ، ولكن في الوقت نفسه ، بشكل افتراضي ، يمحو Android البيانات المحفوظة بواسطة الإصدار الجديد ، حيث قد لا يتمكن الإصدار القديم من العمل مع تنسيقات البيانات التي يستخدمها الإصدار الجديد.
كما قلت ، عادة ما يتم تنفيذ رمز كل تطبيق تحت مستخدم يونيكس الخاص به (UID) ، مما يضمن عزلهم المتبادل. قد تطلب العديد من التطبيقات بشكل صريح من Android استخدام UID مشترك لهم ، مما سيسمح لهم بالوصول مباشرة إلى ملفات بعضهم البعض ، وحتى إذا رغبت في ذلك ، يتم تشغيلهم في نفس العملية.
على الرغم من أن حزمة واحدة عادةً ما تتوافق مع ملف APK واحد ، فإن Android يدعم الحزم التي تتكون من عدة ملفات APK (وهذا ما يسمى ملفات APK المنقسمة ، أو ملفات APK المنقسمة ). هذا هو أساس ميزات "السحر" في Android ، مثل التحميل الديناميكي لوحدات التطبيق الإضافية (وحدات الميزات الديناميكية ) والتشغيل الفوري في Android Studio (التحديث التلقائي لرمز التطبيق قيد التشغيل دون إعادة تثبيته بالكامل ، وفي كثير من الحالات ، حتى بدون إعادة التشغيل).

نظام الملفات
يعد جهاز نظام الملفات من أهم المشكلات وأكثرها إثارة للاهتمام في بنية نظام التشغيل ، وجهاز نظام الملفات في Android ليس استثناءً.
من المثير للاهتمام ، أولاً ، ما هي أنظمة الملفات المستخدمة ، أي التنسيق الذي يتم فيه حفظ محتويات الملفات على قرص شرطي (في حالة Android ، عادة ما تكون ذاكرة فلاش وبطاقات SD) وكيف توفر نواة النظام الدعم . تدعم نواة Linux المستخدمة في Android ، إلى درجة أو أخرى ، عددًا كبيرًا من أنظمة الملفات المختلفة - من تلك المستخدمة في Windows FAT و NTFS وتلك المستخدمة في داروين من قبل HFS + و APFS الحديث - إلى شبكة 9pfs من الخطة 9. هناك العديد من "الأصلي »لأنظمة ملفات Linux - على سبيل المثال ، Btrfs والأسرة الخارجية.
لطالما كان المعيار الفعلي لنظام Linux ext4 طويلًا ، ويستخدم بشكل افتراضي من قبل توزيعات Linux الأكثر شيوعًا. لذلك ، لا يوجد شيء غير متوقع في حقيقة أنه يستخدم في Android. تستخدم بعض التجميعات (وبعض المتحمسين) أيضًا F2FS (نظام الملفات الصديقة للفلاش) ، الذي تم تحسينه خصيصًا للذاكرة المحمولة (ومع ذلك ، مع ميزاته ، كل شيء ليس واضحًا ).
ثانيًا ، يعد ما يسمى بتخطيط نظام الملفات موضع اهتمام - موقع مجلدات وملفات النظام والمستخدم في نظام الملفات. يستحق تصميم نظام الملفات في "Linux العادي" وصفًا أكثر تفصيلاً (والذي يمكن العثور عليه ، على سبيل المثال ، على هذا الرابط ) ؛ سأذكر هنا فقط بعض أهم الأدلة:
/home
مخازن المنزل المجلدات الرئيسية للمستخدم ؛ هنا ، في العديد من المجلدات المخفية ( .cache
، .cache
، .config
وغيرها) ، تخزن البرامج إعداداتها وبياناتها وذاكرة التخزين المؤقت الخاصة بها ،/boot
يقوم بتخزين نواة Linux وصورة initramfs (نظام ملفات تمهيد خاص) ،/usr
(سيكون من المنطقي أكثر للاتصال /system
) تخزين الجزء الرئيسي من النظام نفسه ، بما في ذلك المكتبات ، والملفات القابلة للتنفيذ ، وملفات التكوين ، بالإضافة إلى الموارد - مواضيع للواجهة ، والرموز ، ومحتويات دليل النظام ، وما إلى ذلك ،/etc
(سيكون من المنطقي أكثر الاتصال /config
) تخزين الإعدادات على مستوى النظام ،- يخزن
/dev
ملفات الجهاز والملفات الخاصة الأخرى (على سبيل المثال ، المقبس /dev/log
) ، /var
يخزن البيانات القابلة للتغيير - السجلات ، ذاكرة التخزين المؤقت للنظام ، محتويات قاعدة البيانات ، إلخ.
يستخدم Android تخطيط نظام ملفات مشابهًا لكن مختلفًا بشكل ملحوظ. فيما يلي بعض أهم أجزاء منه:
/data
بتخزين البيانات القابلة للتغيير ،- يتم تخزين صورة kernel و initramfs في قسم فلاش منفصل ، والذي لا يمكن تركيبه على نظام الملفات الرئيسي.
/system
يتطابق /usr
ويخزن النظام ،/vendor
- نظام تماثلي لـ /system
مصمم للملفات الخاصة بتجميع Android هذا ، ولا يتم تضمينه في Android "القياسي" ،/dev
، كما في "Linux العادي" ، يقوم بتخزين ملفات الجهاز والملفات الخاصة الأخرى.
الأكثر إثارة للاهتمام من هذه الأدلة /data
و /system
. تصف محتويات /system
النظام وتحتوي على معظم الملفات المكونة له. يقع /system
في قسم منفصل من ذاكرة الفلاش ، والذي يتم تثبيته افتراضيًا في وضع القراءة فقط ؛ عادة ما تتغير البيانات الموجودة عليه فقط عند تحديث النظام. /data
أيضًا في قسم منفصل وتصف الحالة القابلة للتغيير لجهاز معين ، بما في ذلك إعدادات المستخدم والتطبيقات المثبتة وبياناتها ومخازنها المؤقتة وما إلى ذلك. مسح جميع بيانات المستخدم ، ما يسمى إعادة ضبط المصنع ، مع هذا المخطط هو ببساطة لمسح محتويات قسم البيانات ؛ يبقى نظام لم يمسه تثبيت في قسم النظام .
# mount | grep /system /dev/block/mmcblk0p14 on /system type ext4 (ro,seclabel,relatime,data=ordered) # mount | grep /data /dev/block/mmcblk0p24 on /data type ext4 (rw,seclabel,nosuid,nodev,noatime,noauto_da_alloc,data=writeback)
يتم تثبيت التطبيقات - أي ملفات APK الخاصة بها وملفات odex (التي تم تجميعها قبل رمز Java مسبقًا) ومكتبات ELF - في /system/app
(للتطبيقات التي يتم تسليمها مع النظام) أو في /data/app
(للتثبيت بواسطة المستخدم تطبيقات). عند إنشاء تجميع Android ، يتم تخصيص مجلد لكل تطبيق تم تثبيته مسبقًا باسم النموذج /system/app/Terminal
الوحدة /system/app/Terminal
، وبالنسبة للتطبيقات التي يثبتها المستخدم أثناء التثبيت ، يتم إنشاء مجلدات تبدأ أسماؤها باسم الحزمة الخاصة بها. على سبيل المثال ، يتم حفظ تطبيق YouTube في مجلد باسم مثل /data/app/com.google.android.youtube-bkJAtUtbTuzvAioW-LEStg==/
.
حول هذه اللاحقةاللاحقة في اسم مجلدات التطبيق هي 16 بايت عشوائي مشفرة في Base64. يؤدي استخدام هذه اللاحقة إلى منع التطبيقات الأخرى من "تخمين" المسار إلى تطبيق لا يجب أن تكون على دراية به. من حيث المبدأ ، فإن قائمة التطبيقات المثبتة على الجهاز ومساراتها ليست سرية - يمكن الحصول عليها من خلال واجهات برمجة التطبيقات القياسية - ولكن في بعض الحالات (أي للتطبيقات الفورية) يتم تقييد الوصول إلى هذه البيانات.
تخدم هذه اللاحقة غرضًا آخر. في كل مرة يتم تحديث التطبيق ، يتم تثبيت APK الجديد في المجلد بلاحقة جديدة ، وبعد ذلك يتم حذف المجلد القديم. قبل الإصدار 8.0 Oreo ، كان هذا هو الغرض من اللاحقات ، وبدلاً من وحدات البايت العشوائية ، -2
استخدام -1
و -2
بالتناوب (على سبيل المثال ، /data/app/com.google.android.youtube-2
لـ YouTube).
يمكن الحصول على المسار الكامل لمجلد التطبيق في /system/app
أو /data/app
باستخدام واجهة برمجة التطبيقات القياسية أو pm path org.example.packagename
، الذي يعرض مسارات جميع ملفات APK للتطبيق.
# pm path com.android.egg package:/system/app/EasterEgg/EasterEgg.apk
نظرًا لأنه يتم تخزين التطبيقات المثبتة مسبقًا في قسم النظام (أذكر أن محتوياتها تتغير فقط عند تحديث النظام) ، فلا يمكن حذفها (بدلاً من ذلك ، يوفر Android القدرة على "تعطيلها"). ومع ذلك ، يتم دعم تحديث التطبيقات المثبتة مسبقًا - في هذه الحالة ، يتم إنشاء مجلد في /data/app
للنسخة الجديدة ، ويظل الإصدار المزود مع النظام في /system/app
. في هذه الحالة ، تتاح للمستخدم فرصة "إزالة التحديثات" لهذا التطبيق ، والعودة إلى الإصدار من /system/app
.
ميزة أخرى للتطبيقات المثبتة مسبقًا هي أنها يمكن أن تتلقى أذونات "النظام" الخاصة . على سبيل المثال ، لا تحصل تطبيقات الجهات الخارجية على إذن DELETE_PACKAGES
، مما يسمح لك بإزالة التطبيقات الأخرى ، REBOOT
، التي تسمح لك بإعادة تشغيل النظام ، و READ_FRAME_BUFFER
، مما يسمح بالوصول المباشر إلى محتويات الشاشة. تحتوي هذه الأذونات على مستوى حماية التوقيع ، أي أن التطبيق الذي يحاول الوصول إليها يجب أن يتم توقيعه بنفس المفتاح مثل التطبيق أو الخدمة التي يتم تنفيذها فيها - في هذه الحالة ، نظرًا لأن هذه الأذونات يتم تنفيذها بواسطة النظام ، المفتاح الذي تم توقيعه به بناء الروبوت
لتخزين البيانات القابلة للتغيير ، يتم تخصيص مجلد لكل تطبيق في /data/data
(على سبيل المثال ، /data/data/com.google.android.youtube
لـ YouTube) لكل تطبيق. فقط التطبيق نفسه لديه حق الوصول إلى هذا المجلد - أي ، فقط UID الذي يتم تشغيل هذا التطبيق بموجبه (إذا كان التطبيق يستخدم العديد من UIDs ، أو إذا كانت العديد من التطبيقات تستخدم UID مشتركًا ، يمكن أن يكون كل شيء أكثر تعقيدًا). في هذا المجلد ، تحفظ التطبيقات الإعدادات وذاكرة التخزين المؤقت (في المجلدات الفرعية المشتركة shared_prefs
cache
على التوالي) وأي بيانات أخرى تحتاجها:
# ls /data/data/com.google.android.youtube/ cache code_cache databases files lib no_backup shared_prefs # cat /data/data/com.google.android.youtube/shared_prefs/youtube.xml <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map> <string name="user_account">username@gmail.com</string> <boolean name="h264_main_profile_supported7.1.2" value="true" /> <int name="last_manual_video_quality_selection_max" value="-2" /> <...> </map>
يعرف النظام بوجود مجلد cache
ويمكنه تنظيفه من تلقاء نفسه إذا لم يكن هناك مساحة كافية. عند إلغاء تثبيت التطبيق ، يتم حذف المجلد بالكامل من هذا التطبيق تمامًا ، ولا يترك التطبيق أي آثار. بدلاً من ذلك ، يمكن لكلا المستخدمين القيام بذلك بشكل صريح في الإعدادات:

يسمى تخزين البيانات المخصص لكل تطبيق التخزين الداخلي.
بالإضافة إلى ذلك ، يحتوي Android على نوع آخر من التخزين - ما يسمى التخزين الخارجي ( التخزين الخارجي - يعكس هذا الاسم الفكرة الأصلية بأن التخزين الخارجي يجب أن يكون موجودًا على بطاقة SD خارجية مدرجة في الهاتف). في الواقع ، تلعب وحدة التخزين الخارجية دور المجلد الرئيسي للمستخدم - مثل المجلدات مثل المستندات والتنزيل والموسيقى والصور الموجودة هناك ، وهي وحدة التخزين الخارجية التي يفتحها مديرو الملفات كمجلد افتراضي ، ويسمح للكمبيوتر بالوصول إلى محتويات وحدة التخزين الخارجية عند الاتصال عن طريق الكابل.
# ls /sdcard Alarms Download Podcasts Android Movies Ringtones Books Music Subtitles DCIM Notifications bluetooth Documents Pictures
على عكس وحدة التخزين الداخلية ، المقسمة إلى مجلدات التطبيقات الفردية ، فإن وحدة التخزين الخارجية هي "منطقة مشتركة": أي تطبيق حصل على الإذن المناسب من المستخدم لديه حق الوصول الكامل إليه. كما ذكرت في مقال سابق ، يجب على تطبيقات مثل مدير الملفات طلب هذا الإذن ؛ وبالنسبة لمعظم التطبيقات الأخرى ، من الأفضل استخدام intent مع إجراء ACTION_GET_CONTENT
، مما يتيح للمستخدم فرصة اختيار الملف المطلوب في مدير ملفات النظام.
تفضل العديد من التطبيقات حفظ بعض ملفاتها الداخلية ، والتي تكون كبيرة (على سبيل المثال ، ذاكرة تخزين مؤقت للصور والملفات الصوتية التي تم تنزيلها) في وحدة التخزين الخارجية. للقيام بذلك ، يخصص Android للتطبيقات في مجلدات التخزين الخارجية بأسماء النموذج Android/data/com.google.android.youtube
. لا يتطلب التطبيق نفسه إذنًا للوصول إلى وحدة التخزين الخارجية بالكامل للوصول إلى هذا المجلد (نظرًا لأن UID الخاص به تم تعيينه كمالك لهذا المجلد) ، ولكن يمكن لأي تطبيق آخر لديه هذا الإذن الوصول إلى هذا المجلد ، لذا فإنه يستحق حقًا استخدام فقط لتخزين البيانات العامة وغير الهامة. عند إلغاء تثبيت التطبيق ، سيقوم النظام بحذف مجلده الخاص في وحدة التخزين الخارجية ؛ لكن الملفات التي تم إنشاؤها بواسطة التطبيقات في وحدة التخزين الخارجية خارج مجلدها الخاص تعتبر ملكًا للمستخدم وتظل في مكانها بعد إزالة التطبيق الذي أنشأها.
كما ذكرت أعلاه ، كان من المفترض في البداية أن وحدة التخزين الخارجية ستكون موجودة بالفعل على بطاقة SD خارجية ، حيث كان حجم بطاقات SD في ذلك الوقت أكبر بكثير من حجم الذاكرة المضمنة في الهواتف (في نفس HTC Dream كان فقط 256 ميجابايت ، منها تم تخصيص حوالي 90 ميغابايت لقسم البيانات ). منذ ذلك الحين ، تغيرت العديد من الظروف. غالبًا ما لا تحتوي الهواتف الحديثة على فتحة لبطاقة SD ، ولكن يتم تثبيت كمية كبيرة من الذاكرة الداخلية وفقًا لمعايير الهاتف المحمول (على سبيل المثال ، في Samsung Galaxy Note 9 يمكن أن يصل إلى 512 غيغابايت ).
لذلك ، في Android الحديث ، غالبًا ما توجد وحدة التخزين الداخلية والخارجية في الذاكرة الداخلية. يأخذ المسار الحقيقي الذي يوجد على طوله التخزين الخارجي في نظام الملفات الشكل /data/media/0
( يتم إنشاء تخزين خارجي منفصل لكل مستخدم للجهاز ، ويتوافق الرقم في المسار مع رقم المستخدم). لأغراض التوافق ، يمكن أيضًا الوصول إلى وحدة التخزين الخارجية عبر مسارات /sdcard
و /mnt/sdcard
و /storage/self/primary
و /storage/emulated/0
ومسارات متعددة تبدأ بـ /mnt/runtime/
وبعض المسارات الأخرى.
من ناحية أخرى ، لا تزال العديد من الأجهزة تحتوي على فتحة لبطاقة SD. يمكن استخدام بطاقة SD التي تم إدخالها في جهاز Android كمحرك أقراص خارجي منتظم (بدون تحويلها إلى وحدة تخزين داخلية أو خارجية للنظام) - قم بحفظ الملفات إليها ، وفتح الملفات المخزنة عليها ، واستخدامها لنقل الملفات إلى أجهزة أخرى ، إلخ. بالإضافة إلى ذلك ، يتيح لك Android "استعارة" بطاقة SD ووضع مساحة تخزين داخلية وخارجية عليها (يسمى هذا تخزينًا مستعارًا - تخزين معتمد ). في الوقت نفسه ، يقوم النظام بإعادة تهيئة بطاقة SD وتشفير محتوياتها - لا يمكن قراءة البيانات المخزنة عليها عن طريق توصيلها بجهاز آخر.

يمكنك قراءة المزيد حول كل هذا ، على سبيل المثال ، في هذا المنشور وفي الوثائق الرسمية لمطوري التطبيقات ومنشئي تجميع Android .
جارٍ التحميل
يقتصر النهج التقليدي لأمان نظام الكمبيوتر على حماية النظام من هجمات البرامج. يُعتقد أنه إذا كان المهاجم لديه حق الوصول الفعلي إلى جهاز كمبيوتر ، فستفقد اللعبة بالفعل : فيمكنه الوصول الكامل إلى أي بيانات مخزنة عليه. لهذا ، يكفي له ، على سبيل المثال ، أن يعمل على هذا الكمبيوتر نظام تشغيل تعسفي يسيطر عليه ، والذي يسمح له بتجاوز أي قيود يفرضها نظام الحقوق "الرئيسي" ، أو توصيل قرص البيانات مباشرة بجهاز آخر. إذا رغبت في ذلك ، يمكن للمهاجم ترك الكمبيوتر في حالة قابلة للتشغيل ، ولكن تصحيح النظام المثبت عليه ، وتثبيت الأبواب الخلفية التعسفية ، وتسجيلات المفاتيح ، وما إلى ذلك.
إنها الحماية ضد هجمات البرامج التي تركز على نموذج تقييد حقوق المستخدم في Unix (وتقنية وضع الحماية للتطبيق المبنية عليه في Android) ؛ تقييد يونيكس في حد ذاته لا يحمي النظام من المستخدم الذي شق طريقه إلى غرفة الخادم وحصل على حق الوصول المادي إلى الكمبيوتر. وإذا كان يمكن حماية الخوادم الجادة متعددة المستخدمين ويجب حمايتها من الوصول المادي غير المصرح به إلى أجهزة الكمبيوتر الشخصية - وخاصة الأجهزة المحمولة - فإن هذا النهج ببساطة لا ينطبق.
هناك طريقتان لمحاولة تحسين الوضع مع الحماية ضد مهاجم حصل على وصول مادي إلى الجهاز:
- أولاً ، يمكنك تشفير البيانات المخزنة على القرص ، وبالتالي منع المهاجم من الوصول إلى البيانات نفسها ، حتى إذا كان لديه حق الوصول إلى محتويات القرص.
- ثانيًا ، من الممكن تقييد القدرة بطريقة ما على تحميل أنظمة التشغيل التعسفية على الجهاز ، مما يجبر المهاجم على الخضوع لإجراءات المصادقة والتفويض في النظام المثبت.
مع هذين المجالين من الحماية يرتبط نموذج التمهيد الآمن لنظام Android.
تم التحقق من التمهيد
تم تصميم عملية تمهيد Android بحيث لا تسمح للمهاجمين ، من ناحية ، بتحميل نظام تشغيل تعسفي على الجهاز ، من ناحية أخرى ، تتيح للمستخدمين تثبيت مجموعات Android المخصصة (والأنظمة الأخرى).
أولاً وقبل كل شيء ، لا تسمح أجهزة Android ، على عكس أجهزة الكمبيوتر "المكتبية" ، للمستخدم (أو المهاجم) بالتمهيد من وسيط خارجي ؛ بدلاً من ذلك ، يبدأ محمل الإقلاع المثبت على الجهاز (محمل الإقلاع) على الفور. Bootloader هو برنامج بسيط نسبيًا تتضمن مهامه (عند التحميل في الوضع العادي):
- تهيئة وتكوين بيئة التنفيذ الموثوق بها (مثل ARM TrustZone) ،
- إيجاد أقسام من الذاكرة الداخلية تخزن صور نواة لينكس ومبادرتها ،
- (integrity) — — ,
- initramfs .
Flashing, unlocking, fastboot recovery
, bootloader .
-, (Android) , recovery . recovery, Android- , , Android recovery .
«» bootloader', — ( flashing ) . bootloader , fastboot mode ( bootloader mode), bootloader' fastboot ( fastboot
Android SDK ).
bootloader' . , Samsung, bootloader'a (Loke) (Odin). Odin Samsung ( Odin), Heimdall .
bootloader' ( ), recovery Android, , :
$ fastboot flash recovery recovery.img $ fastboot flash boot boot.img $ fastboot flash system system.img
; : , , bootloader' Android, , , , .
, bootloader' (unlocking the bootloader, OEM unlock) — bootloader' recovery, ( ). Android, LineageOS ( CyanogenMod ), Paranoid Android , AOKP , OmniROM .
bootloader' - , ( data ) . , , (, Google ), — , .

recovery bootloader , .
bootloader' :

recovery, «» (flashaholics) — TWRP (Team Win Recovery Project). - «», zip-, :

Android ( file-based encryption ). ext4 , Linux ( fscrypt ), .
, data , , (credential encrypted storage). , , . , , .

credential encrypted storage Android device encrypted storage — , ( Trusted Execution Environment). , , , . , Direct Boot : ; ( ) device encrypted storage, , . , Direct Boot , , - .
Root
root- — « root» (UID 0, ). , root — Unix-, — — , .
, Android , root- . , « », Android « », root- «», :
- — , APK ,
- : -, email-, , , , , , ( activity intent', ),
- (icon packs),
- , ,
- ( Android-) ,
- , Android, .

, , , root- . root- ( ), Android root . , , Unix-; shell, adb shell
, Unix- shell .
, , root :
- -, root- Android — Android Studio QEMU, .

- -, root- Android ( pre-rooted ROMs).
- -, bootloader' root- Android , ,
su
, bootloader. - , -, , , root-, ( root- ). , 2016 , root- Dirty Cow .
? , root- . , root-, , , . — , . , , system ( ).
, root- — , .
root-
With great power comes great responsibility.
, . , root- .
, , . , root- , , , root- . root, , , , — , , , ..
, Unix, Android , — . root- , , . , root- Android, .
, , root- , . , , , , , . , — , Google Pay ( Android Pay) — root- , .

, - Pokémon GO root- , , .
Google Play root-
Google Google Play Store Google Play Services , root- , Android , , , , . Play Store — ( , ) Android, . ( — , Amazon Android Fire OS — Echo, Fire TV, Fire Phone, Kindle Fire Tablet — Google). root- Android-.
, Google , root-, Google Play ( Open GApps ); Google , .
Device manufacturers work with Google to certify that Android devices with Google apps installed are secure and will run apps correctly. To be certified, a device must pass Android compatibility tests. If you are unable to add a Google Account on your Android device, your Android device software might not have passed Android compatibility tests, or the device manufacturer has not submitted the results to Google to seek approval. As a result, your device is uncertified. This means that your device might not be secure.
If you are a User wanting to use custom ROMs on your device, please register your device by submitting your Google Services Framework Android ID below.
root
«» Linux, Unix-, root- ( sudo
su
) ( , Unix- root, ) (, ). , root-.
su
Android Open Source Project , Unix- shell ( root), root-. su
, , , .
, su
. su
, root-. , SuperSU ; Magisk .

Magisk
Magisk — , , /system
, system ( systemless-ly ), «» Linux . Magisk Hide — root-, root- Magisk — - Google Pay, root- . Magisk Hide root-, SafetyNet Google.
, , Google Pay root- — root- . , root-, - Google Pay. , .
Magisk systemless- «» Magisk Modules , Magisk. , , root- Xposed ViPER , .
SoC,
, «», , — , — (, Wi-Fi ).
, Android- (system on a chip, SoC). — , , -, , LTE-, Bluetooth- Wi-Fi- .. — . , , , , , .
, , . , «», , , , . , , -, , , , .
— Android — SoC . , , — LTE- — . , ; , , .
SoC (, Qualcomm) Android- (, Sony LG), Android, Android Open Source Project. , Android, , , .
Android Android-. , Android. Android , , . .
, : Android — , . Android, .
, , , Android. .
-, . , . , , , , .
-, Android — developer experience (DX, user experience/UX). , Android, API — Android Framework, OpenGL/Vulkan — . , , , Android — , , .

Don't Stop Thinking About Tomorrow
Android- . , Google Nexus Pixel , Android. Android , , , .
, , Android, SoC. Android «» (, , Android-x86 RemixOS ). Android ChromeOS, Chromebook' Android- Linux- -. — Android — Anbox , Android- «» Linux-. (, Android- x86-, , Java, .)

, Android — , Android .
— Android. , , . , , Android .
. 2017 Google Project Treble — , ( HAL, hardware abstraction layer) ( , ) . Treble , , , — — .
Treble . Treble (Sony, Nokia, OnePlus, Oppo, Xiaomi, Essential Vivo — Google) - Android Pie. Treble Essential Android Pie Essential Phone Android Pie. Android — - — , Treble, , SoC.
Treble . Java «write once, run everywhere» — Android- . Treble — , Android SoC. , , Treble. , Android- .
userspace Android: init, Zygote, Binder, props.