نظرة عامة على بيان التطبيق

يجب أن يتضمّن كل مشروع تطبيق ملف AndroidManifest.xml يحمل اسمًا بالضبط مماثلاً لملف AndroidManifest.xml في جذر مجموعة مصادر المشروع. يوضّح ملف البيان المعلومات الأساسية حول تطبيقك لأدوات إنشاء Android ونظام التشغيل Android و Google Play.

من بين العديد من الإجراءات الأخرى، يجب أن يوضّح ملف البيان ما يلي:

  • مكونات التطبيق، بما في ذلك جميع الأنشطة والخدمات وأجهزة استقبال البث ومقدّمي المحتوى يجب أن يحدِّد كل مكوّن خصائص dasar ، مثل اسم فئة Kotlin أو Java. ويمكنه أيضًا تحديد الإمكانات، مثل إعدادات الجهاز التي يمكنه التعامل معها، و فلاتر الأهداف التي تصف كيفية بدء المكوّن. اطّلِع على مزيد من المعلومات عن مكوّنات التطبيق في قسم لاحق.
  • الأذونات التي يحتاجها التطبيق للوصول إلى أجزاء محمية من النظام أو التطبيقات الأخرى ويوضّح البيان أيضًا أي أذونات يجب أن تحصل عليها التطبيقات الأخرى إذا أرادت الوصول إلى المحتوى من هذا التطبيق. اطّلِع على مزيد من المعلومات عن الأذونات في القسم التالي.
  • ميزات الأجهزة والبرامج التي يتطلبها التطبيق، ما يؤثر في الأجهزة التي يمكنها تثبيت التطبيق من Google Play اطّلِع على مزيد من المعلومات عن توافق الأجهزة في القسم التالي.

إذا كنت تستخدِم Android Studio لإنشاء تطبيقك، سيتم إنشاء ملف البيان نيابةً عنك وستتم إضافة معظم عناصر البيان الأساسية أثناء إنشاء تطبيقك، خاصةً عند استخدام نماذج الرموز البرمجية.

ميزات الملفات

توضّح الأقسام التالية كيفية ظهور بعض أهم سمات تطبيقك في ملف البيان.

مكوّنات التطبيق

لكل أحد مكونات التطبيق التي تنشئها في تطبيقك، حدِّد عنصر XML متوافقًا في ملف البيان:

إذا أنشأت فئة فرعية لأيّ من هذه المكوّنات بدون الإفصاح عنها في ملف البيان، لن يتمكّن النظام من تشغيلها.

حدِّد اسم الفئة الفرعية باستخدام السمة name ، مع استخدام تصنيف الحزمة الكامل. على سبيل المثال، يتمّ الإعلان عن فئة فرعية Activity على النحو التالي:

<manifest ... >
    <application ... >
        <activity android:name="com.example.myapp.MainActivity" ... >
        </activity>
    </application>
</manifest>

ومع ذلك، إذا كان الحرف الأول في قيمة name هو نقطة، يتم إضافة مساحة الاسم للتطبيق، من سمة namespace ملف build.gradle على مستوى الوحدة، إلى الاسم. على سبيل المثال، إذا كانت مساحة الاسم هي "com.example.myapp"، يتم تحويل اسم النشاط التالي إلى com.example.myapp.MainActivity:

<manifest ... >
    <application ... >
        <activity android:name=".MainActivity" ... >
            ...
        </activity>
    </application>
</manifest>

لمزيد من المعلومات عن ضبط اسم الحزمة أو مساحة الاسم، اطّلِع على ضبط مساحة الاسم.

إذا كانت لديك مكوّنات تطبيق مضمّنة في حِزم فرعية، مثل com.example.myapp.purchases، يجب أن تضيف قيمة name أسماء الحِزم الفرعية المفقودة، مثل ".purchases.PayActivity"، أو استخدام اسم الحزمة المؤهَّلة بالكامل.

فلاتر الأهداف

يتم تفعيل أنشطة التطبيقات وخدماتها ومستلمي البث من خلال النوايا. النيّة هي رسالة يحدّدها عنصر Intent يصف إجراءً يجب تنفيذه، بما في ذلك البيانات التي سيتم اتّخاذ إجراء بشأنها وفئة المكوّن الذي يُتوقّع أن ينفّذ الإجراء وتعليمات أخرى.

عندما يُرسِل تطبيق هدفًا إلى النظام، يحدِّد النظام موقع ملف بيان تطبيق يمكنه معالجة الهدف استنادًا إلى فلتر الأهداف في ملف بيان كل تطبيق. يطلق النظام مثيلًا للمكوّن المطابق ويمرّر عنصر Intent إلى هذا المكوّن. إذا كان بإمكان أكثر من تطبيق معالجة الطلب، يمكن للمستخدم اختيار التطبيق الذي يريد استخدامه.

يمكن أن يتضمّن مكوّن التطبيق أي عدد من فلاتر الأهداف (يتم تحديدها باستخدام العنصر <intent-filter> )، ويصف كل فلتر منها قدرة مختلفة لهذا المكوّن.

لمزيد من المعلومات، يُرجى الاطّلاع على مستند Intents and Intent Filters (النوايا وفلاتر النوايا).

الرموز والتصنيفات

تحتوي مجموعة من عناصر البيان على السمتَين icon وlabel لعرض رمز صغير وتصنيف نصي، على التوالي، للمستخدمين لعنصر التطبيق المقابل.

في كل الحالات، يصبح الرمز والاسم اللذان تم ضبطهما في عنصر رئيسي هما القيمة التلقائية icon وlabel لجميع العناصر الفرعية. على سبيل المثال، الرمز والتصنيف اللذان تم ضبطهما في عنصر <application> هما الرمز والتصنيف التلقائيان لكل مكوّن من مكوّنات التطبيق، مثل جميع الأنشطة.

يتم عرض الرمز والتصنيف اللذان تم ضبطهما في <intent-filter> المكوّن للمستخدم كلما تم عرض هذا المكوّن كخيار ل تحقيق نية. يتم اكتساب هذا الرمز تلقائيًا من أي رمز يتم تحديده للمكوّن الرئيسي، سواء كان عنصر <activity> أو <application>.

قد تحتاج إلى تغيير رمز فلتر الأهداف إذا كان يقدّم إجراءً فريدًا تريد الإشارة إليه بشكل أفضل في مربع diálogo الاختيار. لمزيد من المعلومات، يُرجى الاطّلاع على مقالة السماح للتطبيقات الأخرى ببدء نشاطك.

الأذونات

يجب أن تطلب تطبيقات Android الحصول على إذن للوصول إلى بيانات المستخدمين الحسّاسة، مثل جهات الاتصال ورسائل SMS، أو ميزات معيّنة للنظام، مثل الكاميرا والوصول إلى الإنترنت. يتم تحديد كل إذن من خلال تصنيف فريد. على سبيل المثال، يجب أن يتضمّن التطبيق الذي يحتاج إلى إرسال رسائل SMS السطر التالي في البيان:

<manifest ... >
    <uses-permission android:name="android.permission.SEND_SMS"/>
    ...
</manifest>

بدءًا من الإصدار Android 6.0 (المستوى 23 من واجهة برمجة التطبيقات)، يمكن للمستخدم الموافقة على بعض أذونات التطبيق أو رفضها أثناء التشغيل. ولكن بغض النظر عن إصدار Android الذي يتوافق معه تطبيقك، يجب الإفصاح عن جميع طلبات الأذونات باستخدام عنصر <uses-permission> في البيان. في حال منح الإذن، سيتمكّن التطبيق من استخدام الميزات المحمية. وإذا لم يكن الأمر كذلك، ستتعذّر محاولات الوصول إلى هذه الميزات.

يمكن لتطبيقك أيضًا حماية مكوّناته باستخدام الأذونات. ويمكنه استخدام أي من الأذونات التي يحدّدها نظام التشغيل Android، كما هو موضّح في android.Manifest.permission، أو إذن تم الإفصاح عنه في تطبيق آخر. ويمكن لتطبيقك أيضًا تحديد أذوناته الخاصة. يتمّ الإعلان عن إذن جديد باستخدام العنصر <permission>.

لمزيد من المعلومات، يُرجى الاطّلاع على مقالة الأذونات على Android.

توافق الجهاز

يمكنك أيضًا استخدام ملف البيان لتحديد أنواع الأجهزة أو ميزات البرامج التي يتطلبها تطبيقك، وبالتالي تحديد أنواع الأجهزة التي يتوافق معها تطبيقك. لا يسمح "متجر Google Play" للمستخدمين بتثبيت تطبيقك على الأجهزة التي لا توفّر الميزات أو إصدار النظام الذي يتطلبه تطبيقك.

هناك عدة علامات في ملف البيان تحدّد الأجهزة التي يكون تطبيقك متوافقًا معها. في ما يلي بعض الأسباب الأكثر شيوعًا.

<uses-feature>

يتيح لك عنصر <uses-feature> الإفصاح عن ميزات الأجهزة والبرامج التي يحتاجها تطبيقك. على سبيل المثال، إذا لم يكن بإمكان تطبيقك تنفيذ وظائفه الأساسية على جهاز لا يحتوي على أداة استشعار بوصلة، يمكنك الإفصاح عن أداة استشعار البوصلة على أنّها مطلوبة باستخدام علامة البيان التالية:

<manifest ... >
    <uses-feature android:name="android.hardware.sensor.compass"
                  android:required="true" />
    ...
</manifest>

ملاحظة: إذا كنت تريد إتاحة تطبيقك على أجهزة Chromebook، عليك مراعاة بعض القيود المهمة المتعلقة بالأجهزة والبرامج. لمزيد من المعلومات، يُرجى الاطّلاع على مقالة توافق بيان التطبيق مع أجهزة Chromebook.

<uses-sdk>

غالبًا ما يضيف كل إصدار لاحق من النظام الأساسي واجهات برمجة تطبيقات جديدة غير متوفرة في الإصدار السابق. للإشارة إلى الحد الأدنى للإصدار المتوافق مع تطبيقك، يجب أن يتضمّن البيان العلامة <uses-sdk>وسمة minSdkVersion.

ومع ذلك، يُرجى العِلم أنّ السمات في عنصر <uses-sdk> يتم إلغاؤها من خلال السمات المقابلة في ملف build.gradle. لذلك، إذا كنت تستخدم "استوديو Android"، حدِّد قيمتَي minSdkVersion و targetSdkVersion هناك بدلاً من ذلك:

رائع

android {
    defaultConfig {
        applicationId 'com.example.myapp'

        // Defines the minimum API level required to run the app.
        minSdkVersion 21

        // Specifies the API level used to test the app.
        targetSdkVersion 33
        ...
    }
}

Kotlin

android {
    defaultConfig {
        applicationId = "com.example.myapp"

        // Defines the minimum API level required to run the app.
        minSdkVersion(21)

        // Specifies the API level used to test the app.
        targetSdkVersion(33)
        ...
    }
}

لمزيد من المعلومات عن ملف build.gradle، اطّلِع على كيفية ضبط الإصدار.

للاطّلاع على مزيد من المعلومات حول كيفية الإفصاح عن توافق تطبيقك مع أجهزة مختلفة، اطّلِع على نظرة عامة على توافق التطبيق مع الأجهزة.

اصطلاحات الملفات

يصف هذا القسم القواعد والاصطلاحات التي تنطبق بشكل عام على كل العناصر والسمات في ملف البيان.

العناصر
يجب استخدام العنصرين <manifest> و <application> فقط. ويجب أن يظهر كلّ منها مرّة واحدة فقط. يمكن أن لا تظهر معظم العناصر الأخرى أو تظهر مرّة واحدة أو أكثر. ومع ذلك، يجب أن يكون بعض هذه العناصر متوفّرًا لجعل ملف البيان مفيدًا.

يتمّ ضبط جميع القيم من خلال السمات، وليس كبيانات أحرف ضمن عنصر.

لا يتم ترتيب العناصر على المستوى نفسه بشكل عام. على سبيل المثال، يمكن وضع العناصر <activity> و <provider> و <service> بأي ترتيب. هناك استثناءان رئيسيان لهذا القاعدة:

  • يجب أن يتبع عنصر <activity-alias> عنصر <activity> الذي يمثّل بديلاً له.
  • يجب أن يكون عنصر <application> هو العنصر الأخير داخل عنصر <manifest>.
السمات
من الناحية الفنية، تكون جميع السمات اختيارية. ومع ذلك، يجب تحديد العديد من السمات لكي يتمكّن العنصر من تحقيق الغرض منه. بالنسبة إلى السمات الاختيارية حقًا، يشير المستند المرجعي إلى القيم التلقائية.

باستثناء بعض سمات العنصر الجذر <manifest> ، تبدأ جميع أسماء السمات ببادئة android:، مثل android:alwaysRetainTaskState. ولأنّ البادئة عالمية، لا يتم ذكرها عادةً في المستندات عند الإشارة إلى السمات بالاسم.

قيم متعدّدة
إذا كان من الممكن تحديد أكثر من قيمة واحدة، يتم تكرار العنصر تقريبًا في كل مرة، بدلاً من إدراج قيم متعددة في عنصر واحد. على سبيل المثال، يمكن أن يسرد فلتر الأهداف عدة إجراءات:
<intent-filter ... >
    <action android:name="android.intent.action.EDIT" />
    <action android:name="android.intent.action.INSERT" />
    <action android:name="android.intent.action.DELETE" />
    ...
</intent-filter>
قيم الموارد
تحتوي بعض السمات على قيم يتم عرضها للمستخدمين، مثل عنوان نشاط أو رمز تطبيقك. قد تختلف قيمة هذه السمات استنادًا إلى لغة المستخدم أو إعدادات الجهاز الأخرى (مثل توفير حجم رمز مختلف استنادًا إلى كثافة وحدات البكسل في الجهاز)، لذا يجب ضبط القيم من مورد أو مظهر، بدلاً من تضمينها فيملف البيان بترميز ثابت. ويمكن أن تتغيّر القيمة الفعلية بعد ذلك استنادًا إلى مواد مرجعية بديلة تقدّمها لإعدادات الأجهزة المختلفة.

يتم التعبير عن الموارد كقيم بالتنسيق التالي:

"@[package:]type/name"

يمكنك حذف اسم package إذا كان المورد مقدَّمًا من تطبيقك (بما في ذلك إذا كان مقدَّمًا من مكتبة تابعة، لأنّ موارد المكتبة تُدمج في مواردك). اسم الحزمة الصالح الوحيد الآخر هو android، وذلك عندما تريد استخدام مورد من إطار عمل Android.

يشير الرمز type إلى نوع المورد، مثل string أو drawable، ويكون الرمز name هو الاسم الذي يحدّد المورد المحدّد. يُرجى الاطّلاع على المثال أدناه:

<activity android:icon="@drawable/smallPic" ... >

لمزيد من المعلومات عن كيفية إضافة موارد إلى مشروعك، يمكنك الاطّلاع على مقالة نظرة عامة على موارد التطبيق.

لتطبيق قيمة محدّدة في مظهر بدلاً من ذلك، يجب أن يكون الحرف الأول ? بدلاً من @:

"?[package:]type/name"

قيم السلاسل
إذا كانت قيمة السمة سلسلة، استخدِم الشرطة المائلة للخلف المزدوجة (\\) بدلاً من الأحرف، مثل \\n لبدء سطر جديد أو \\uxxxx لحرف يونيكود.

مرجع عناصر البيان

يقدّم الجدول التالي روابط إلى المستندات المرجعية لجميع العناصر الصالحة في ملف AndroidManifest.xml.

<action> تُضيف إجراءً إلى فلتر أهداف.
<activity> لتعريف مكوّن نشاط
<activity-alias> تُستخدَم لتعريف اسم بديل لنشاط.
<application> يُعلن عن التطبيق.
<category> تُضيف اسم فئة إلى فلتر أهداف.
<compatible-screens> تُحدِّد كل إعداد شاشة يتوافق معه التطبيق.
<data> تُضيف مواصفات بيانات إلى فلتر أهداف.
<grant-uri-permission> تُحدِّد المجموعات الفرعية لبيانات التطبيق التي يملك موفِّر المحتوى الرئيسي الإذن بالوصول إليها.
<instrumentation> يُعلن عن فئة Instrumentation تتيح لك مراقبة تفاعل التطبيق مع النظام.
<intent-filter> تُحدِّد أنواع النوايا التي يمكن أن يستجيب لها نشاط أو خدمة أو مستلِم البث.
<manifest> العنصر الجذر لملف AndroidManifest.xml
<meta-data> زوج اسم وقيمة لعنصر بيانات إضافية عشوائية يمكن تقديمها إلى المكوّن الرئيسي
<path-permission> يحدّد المسار والأذونات المطلوبة لمجموعة فرعية معيّنة من البيانات ضمن مزوّد محتوى.
<permission> يُعلن عن إذن أمان يمكن استخدامه لتقييد الوصول إلى مكونات أو ميزات معيّنة في هذا التطبيق أو تطبيقات أخرى.
<permission-group> تُعرِض اسمًا لتجميع منطقي للأذونات ذات الصلة.
<permission-tree> يُعلن عن الاسم الأساسي لشجرة الأذونات.
<provider> يُستخدَم لتعريف مكوّن موفّر محتوى.
<queries> يُستخدَم للإفصاح عن مجموعة التطبيقات الأخرى التي يريد تطبيقك الوصول إليها. اطّلِع على مزيد من المعلومات في الدليل عن فلترة مستوى عرض الحزمة.
<receiver> يُستخدَم لتعريف مكوّن مستقبل البث.
<service> يُستخدَم لتعريف مكوّن خدمة.
<supports-gl-texture> يُستخدَم لتعريف تنسيق واحد لضغط بنية GL يتوافق معه التطبيق.
<supports-screens> يُعلن عن أحجام الشاشات التي يتوافق معها تطبيقك ويفعّل وضع توافق الشاشة للشاشات الأكبر حجمًا من تلك التي يتوافق معها تطبيقك.
<uses-configuration> يشير إلى ميزات إدخال معيّنة يتطلبها التطبيق.
<uses-feature> يُستخدَم لتعريف ميزة واحدة للأجهزة أو البرامج يستخدمها التطبيق.
<uses-library> تُحدِّد مكتبة مشترَكة يجب ربط التطبيق بها.
<uses-native-library> تُحدِّد مكتبة مشترَكة أصلية يوفّرها المورّد ويجب ربط التطبيق بها.
<uses-permission> تُحدِّد إذن نظام يجب أن يمنحه المستخدم لكي يعمل التطبيق بشكل صحيح.
<uses-permission-sdk-23> تشير إلى أنّ التطبيق يطلب إذنًا معيّنًا، ولكن فقط إذا كان التطبيق مثبّتًا على جهاز يعمل بالإصدار 6.0 من نظام التشغيل Android (المستوى 23 من واجهة برمجة التطبيقات) أو إصدار أحدث.
<uses-sdk> يتيح لك هذا الحقل التعبير عن توافق تطبيق مع إصدار واحد أو أكثر من نظام التشغيل Android، وذلك باستخدام عدد صحيح لمستوى واجهة برمجة التطبيقات.

الحدود

هناك حدّ أقصى لعدد مرات ظهور العلامات التالية في ملف البيان:

اسم العلامة الحد اليومي
<package> 1000
<meta-data> 1000
<uses-library> 1000

هناك حدّ أقصى لطول السمات التالية:

السمة الحد اليومي
name 1024
versionName 1024
host 255
mimeType 255

مثال على ملف البيان

ملف XML أدناه هو مثال بسيط AndroidManifest.xml يُعرِض نشاطَين للتطبيق.

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="1"
    android:versionName="1.0">

    <!-- Beware that these values are overridden by the build.gradle file -->
    <uses-sdk android:minSdkVersion="15" android:targetSdkVersion="26" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <!-- This name is resolved to com.example.myapp.MainActivity
             based on the namespace property in the build.gradle file -->
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:name=".DisplayMessageActivity"
            android:parentActivityName=".MainActivity" />
    </application>
</manifest>