סקירה כללית של קובץ המניפסט של האפליקציה

לכל פרויקט אפליקציה חייב להיות קובץ AndroidManifest.xml, בדיוק עם הפרטים האלה שם, ברמה הבסיסית (root) של קבוצת מקור הפרויקט. קובץ המניפסט מתאר מידע חיוני על האפליקציה שלך בכלי ה-build של Android, במערכת ההפעלה של Android Google Play.

בין היתר, בקובץ המניפסט יש להצהיר על הפרטים הבאים:

  • רכיבי האפליקציה, כולל כל הפעילויות, השירותים, מקלטי שידור וספקי תוכן. לכל רכיב צריך להגדיר כמו השם של מחלקה Kotlin או Java. הוא יכול גם להצהיר יכולות, כמו תצורות המכשיר שהוא יכול לטפל בהן מסנני Intent שמתארים איך ניתן להפעיל את הרכיב. מידע נוסף על רכיבי אפליקציות מופיע בקטע הבא.
  • ההרשאות שהאפליקציה צריכה כדי לגשת לחלקים מוגנים של המערכת או לאפליקציות אחרות. בנוסף, אנחנו מצהירים כל ההרשאות שיש לאפליקציות אחרות כדי לגשת לתוכן מהאפליקציה הזו. מידע נוסף על הרשאות מופיע בקטע הבא.
  • תכונות החומרה והתוכנה הנדרשות לאפליקציה, שקובעים אילו מכשירים יכולים להתקין את האפליקציה מ-Google Play. בקטע הבא תוכלו למצוא מידע נוסף על תאימות המכשירים.

אם אתם משתמשים ב-Android Studio כדי ליצור את האפליקציה, קובץ המניפסט נוצר עבורך ורוב רכיבי המניפסט החיוניים מתווספים שאתם מפתחים את האפליקציה, במיוחד כשאתם משתמשים בתבניות קוד.

תכונות קבצים

בקטעים הבאים מתואר איך חלק מהמאפיינים החשובים ביותר של האפליקציה שלך משתקפים בקובץ המניפסט.

רכיבי האפליקציה

לכל אפליקציה רכיב מסוים שיצרתם באפליקציה, להצהיר על רכיב XML תואם בקובץ המניפסט:

אם תגדירו סיווג משנה של אחד מהרכיבים האלה בלי להצהיר על כך במניפסט הקובץ, המערכת לא יכולה להפעיל אותו.

מציינים את השם של מחלקת המשנה באמצעות השדה name. באמצעות סיווג החבילה המלא. לדוגמה, תת-מחלקה אחת (Activity) הוצהרה כך:

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

אבל, אם התו הראשון בערך name הוא נקודה, מרחב השמות של האפליקציה, מהקובץ build.gradle ברמת המודול namespace המאפיין יסומן לפני השם. לדוגמה, אם מרחב השמות הוא "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 שמתאר את הפעולה לביצוע, כולל הנתונים שיש לבצע עליהם פעולה, הקטגוריה של הרכיב שאמור לבצע את הפעולה, וכן הוראות אחרות.

כשאפליקציה יוצרת Intent למערכת, המערכת מאתרת את האפליקציה רכיב שיכול לטפל ב-Intent על סמך מסנן כוונת הרכישה בקובץ המניפסט של כל אפליקציה. המערכת מפעילה מופע של הרכיב התואם ומעביר את האובייקט Intent לרכיב הזה. אם יותר מאפליקציה אחת משתמשים בכוונה, ואז המשתמשים יכולים לבחור באיזו אפליקציה להשתמש.

רכיב אפליקציה יכול לכלול כל מספר של מסנני Intent (מוגדרים באמצעות <intent-filter> של רכיב מסוים), שכל אחד מהם מתאר יכולת שונה של אותו רכיב.

מידע נוסף זמין במסמך מנגנוני Intent ומסנני Intent.

סמלים ותוויות

לכמה רכיבי מניפסט יש icon ו-label להצגת סמל קטן ותווית טקסט, בהתאמה, למשתמשים ברכיב האפליקציה המתאים.

בכל מקרה, הסמל והתווית שמוגדרים ברכיב ההורה הופכים לברירת המחדל icon ו-label לכל רכיבי הצאצא. לדוגמה, הסמל והתווית שמוגדרים <application> הם סמל ברירת המחדל והתווית עבור כל אחד מרכיבי האפליקציה, כמו כל הפעילויות.

הסמל והתווית שמוגדרים <intent-filter> מוצגים למשתמש בכל פעם שהרכיב הזה מוצג כאפשרות למלא כוונה. כברירת מחדל, הסמל עובר בירושה מוצהר עבור רכיב ההורה, <activity> או רכיב <application>.

כדאי לשנות את הסמל למסנן Intent אם הוא מספק פעולה ייחודית שאותה רוצים לציין בצורה טובה יותר תיבת דו-שיח עם בורר. מידע נוסף זמין במאמר מתן הרשאה לאפליקציות אחרות להתחיל את הפעילות שלכם.

הרשאות

אפליקציות ל-Android חייבות לבקש הרשאת גישה לנתוני משתמש רגישים, כמו אנשי קשר והודעות SMS, או תכונות מערכת מסוימות, למצלמה ולאינטרנט. כל הרשאה מזוהה באמצעות תווית ייחודית. לדוגמה, אפליקציה שצריכה לשלוח הודעות SMS צריכה לכלול: במניפסט:

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

מתחיל ב- Android 6.0 (רמת API 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>

כל גרסת פלטפורמה רציפה מוסיפה לעיתים קרובות ממשקי API חדשים שלא זמינה בגרסה הקודמת. כדי לציין את הגרסה המינימלית שבה האפליקציה שלך תואם, המניפסט חייב לכלול את התג <uses-sdk> ו-minSdkVersion .

עם זאת, חשוב לשים לב שמאפיינים ברכיב <uses-sdk> הנכסים המתאימים משנים את הערכים שלהם בקובץ build.gradle. לכן, אם אתם משתמשים ב-Android Studio, צריך לציין את 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 אפשר לעיין במאמר איך מגדירים את ה-build.

כדי לקרוא איך להצהיר על התמיכה של האפליקציה במכשירים שונים: לצפייה בתאימות מכשירים סקירה כללית.

מוסכמות לגבי קבצים

קטע זה מתאר את המוסכמות והכללים החלים באופן כללי על כל והמאפיינים שלו בקובץ המניפסט.

Elements
רק <manifest> והקבוצה <application> רכיבים נדרשים. כל אירוע צריך להתרחש פעם אחת בלבד. רוב הרכיבים האחרים יכולים להופיע אפס פעמים או יותר. אבל, חלק מהם חייבים להיות כדי שקובץ המניפסט יהיה שימושי.

כל הערכים מוגדרים באמצעות מאפיינים, לא כנתוני תווים בתוך רכיב.

בדרך כלל, רכיבים באותה רמה לא מסודרים. לדוגמה, <activity>, <provider>, וגם <service> רכיבים יכולים להופיע בכל סדר שהוא. יש שני יוצאים מן הכלל מרכזיים למדיניות הזו כלל:

  • <activity-alias> הרכיב חייב להיות תואם ל<activity> עבורו הוא כינוי.
  • הרכיב <application> חייב להיות הרכיב האחרון שבתוך רכיב <manifest>.
מאפיינים
טכנית, כל המאפיינים הם אופציונליים. אבל הרבה מאפיינים חייבים לציין אותן כדי שרכיב יוכל למלא את המטרה שלו. לגבי מאפיינים אופציונליים באמת, במאמרי העזרה מציין את ערכי ברירת המחדל.

מלבד מאפיינים מסוימים של השורש <manifest> אלמנט, כל שמות המאפיינים מתחילים בקידומת android:, כמו android:alwaysRetainTaskState. כי התחילית היא אוניברסלי, התיעוד בדרך כלל משמיט אותו כשמדובר במאפיינים לפי שם.

ערכים מרובים
אם אפשר לציין יותר מערך אחד, הרכיב כמעט תמיד שחוזרים על עצמם, במקום להציג כמה ערכים בתוך רכיב יחיד. לדוגמה, מסנן Intent יכול להציג כמה פעולות:
<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"

ערכי מחרוזת
כשערך מאפיין הוא מחרוזת, צריך להשתמש בלוכסנים כפולים (\\) כדי לסמן בתו בריחה (escape) תווים, כמו \\n עבור שורה חדשה או \\uxxxx לתו Unicode.

הפניה לרכיבי מניפסט

הטבלה הבאה מכילה קישורים למסמכי העזר עבור כל רכיבים בקובץ AndroidManifest.xml.

<action> הוספת פעולה למסנן Intent.
<activity> מצהירה על רכיב פעילות.
<activity-alias> מצהיר על כינוי של פעילות.
<application> מצהירה על הבקשה.
<category> הוספת שם קטגוריה למסנן Intent.
<compatible-screens> מציינת כל אחת מההגדרות של המסך שהאפליקציה תואמת לה.
<data> הוספת מפרט נתונים למסנן Intent.
<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> ההגדרה מציינת שאפליקציה מבקשת הרשאה מסוימת, אבל רק אם האפליקציה מותקנת במכשיר עם Android מגרסה 6.0 (רמת API 23) ואילך.
<uses-sdk> מאפשר לבטא את התאימות של האפליקציה לגרסה אחת או יותר של פלטפורמת Android, באמצעות מספר שלם ברמת ה-API.

המגבלות

בתגים הבאים יש הגבלה על מספר המופעים בקובץ מניפסט:

שם התג הגבלה
<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>