Android之Manifest文件

来源:互联网 发布:算法电子书 编辑:程序博客网 时间:2024/05/17 07:28

在Android APP开发过程中,Manifest文件举足轻重。每一个apk都要有一个Manifest文件,它配置了apk在Android系统上的基本信息。

如下 frameworks/base/packages/SystemUI/AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
        package="com.android.systemui"
        android:sharedUserId="android.uid.systemui"
        coreApp="true">


    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- Used to read storage for all users -->
    <uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />


    <uses-permission android:name="android.permission.INJECT_EVENTS" />
    <uses-permission android:name="android.permission.DUMP" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />


    <uses-permission android:name="android.permission.STATUS_BAR_SERVICE" />
    <uses-permission android:name="android.permission.STATUS_BAR" />
    <uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
    <uses-permission android:name="android.permission.REMOTE_AUDIO_PLAYBACK" />


    <uses-permission android:name="android.permission.MANAGE_USERS" />
    <uses-permission android:name="android.permission.READ_PROFILE" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.CONFIGURE_WIFI_DISPLAY" />
    <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
    <uses-permission android:name="android.permission.GET_APP_OPS_STATS" />


    <!-- Networking and telephony -->
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" />
    <!-- Add for op, fix issue: ALPS02093201 -->
    <uses-permission android:name="android.permission.READ_PRECISE_PHONE_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.OVERRIDE_WIFI_CONFIG" />
    <uses-permission android:name="android.permission.MANAGE_NETWORK_POLICY" />
    <uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" />
    <uses-permission android:name="android.permission.READ_NETWORK_USAGE_HISTORY" />
    <uses-permission android:name="android.permission.CONTROL_VPN" />
    <uses-permission android:name="android.permission.PEERS_MAC_ADDRESS"/>
    <!-- Physical hardware -->
    <uses-permission android:name="android.permission.MANAGE_USB" />
    <uses-permission android:name="android.permission.DEVICE_POWER" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.MASTER_CLEAR" />
    <uses-permission android:name="android.permission.VIBRATE" />


    <!-- ActivityManager -->
    <uses-permission android:name="android.permission.REAL_GET_TASKS" />
    <uses-permission android:name="android.permission.GET_DETAILED_TASKS" />
    <uses-permission android:name="android.permission.REORDER_TASKS" />
    <uses-permission android:name="android.permission.REMOVE_TASKS" />
    <uses-permission android:name="android.permission.STOP_APP_SWITCHES" />
    <uses-permission android:name="android.permission.SET_SCREEN_COMPATIBILITY" />
    <uses-permission android:name="android.permission.START_ANY_ACTIVITY" />
    <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
    <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
    <uses-permission android:name="android.permission.GET_TOP_ACTIVITY_INFO" />
    <uses-permission android:name="android.permission.MANAGE_ACTIVITY_STACKS" />
    <uses-permission android:name="android.permission.START_TASKS_FROM_RECENTS" />


    <!-- WindowManager -->
    <uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    <uses-permission android:name="android.permission.READ_FRAME_BUFFER" />
    <uses-permission android:name="android.permission.MANAGE_APP_TOKENS" />
    <uses-permission android:name="android.permission.SET_ORIENTATION" />
    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />


    <!-- DreamManager -->
    <uses-permission android:name="android.permission.READ_DREAM_STATE" />
    <uses-permission android:name="android.permission.WRITE_DREAM_STATE" />


    <!-- Alarm clocks -->
    <uses-permission android:name="com.android.alarm.permission.SET_ALARM" />


    <!-- Keyguard -->
    <uses-permission android:name="android.permission.CONTROL_KEYGUARD" />
    <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
    <uses-permission android:name="android.permission.BIND_DEVICE_ADMIN" />
    <uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" />
    <uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />
    <uses-permission android:name="android.permission.ACCESS_KEYGUARD_SECURE_STORAGE" />
    <uses-permission android:name="android.permission.TRUST_LISTENER" />
    <uses-permission android:name="android.permission.USE_FINGERPRINT" />
    <!-- Keyguard add for Anti-theft-->
    <uses-permission android:name="com.mediatek.ppl.permission.ACCESS_PPL_MANAGER" />
    <uses-permission android:name="android.permission.RESET_FINGERPRINT_LOCKOUT" />


    <!-- Needed for WallpaperManager.clear in ImageWallpaper.updateWallpaperLocked -->
    <uses-permission android:name="android.permission.SET_WALLPAPER"/>


    <!-- Recents -->
    <uses-permission android:name="android.permission.BIND_APPWIDGET" />


    <!-- Wifi Display -->
    <uses-permission android:name="android.permission.CONFIGURE_WIFI_DISPLAY" />


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


    <!-- Screen Capturing -->
    <uses-permission android:name="android.permission.MANAGE_MEDIA_PROJECTION" />


    <!-- Assist -->
    <uses-permission android:name="android.permission.ACCESS_VOICE_INTERACTION_SERVICE" />
    <!-- M: Add for multi-window add permission for install package -->
    <uses-permission android:name="android.permission.INSTALL_PACKAGES" />
    <uses-permission android:name="android.permission.DELETE_PACKAGES" />


    <!-- Self permission for internal broadcasts. -->
    <permission android:name="com.android.systemui.permission.SELF"
            android:protectionLevel="signature" />
    <uses-permission android:name="com.android.systemui.permission.SELF" />


    <!-- M: Add for data sim switch op feature -->
    <uses-permission android:name="android.permission.WRITE_APN_SETTINGS"/>


    <application
        android:name=".SystemUIApplication"
        android:persistent="true"
        android:allowClearUserData="false"
        android:allowBackup="false"
        android:hardwareAccelerated="true"
        android:label="@string/app_label"
        android:icon="@drawable/icon"
        android:process="com.android.systemui"
        android:supportsRtl="true"
        android:theme="@style/systemui_theme">
        <!-- Keep theme in sync with SystemUIApplication.onCreate().
             Setting the theme on the application does not affect views inflated by services.
             The application theme is set again from onCreate to take effect for those views. -->


        <!-- Broadcast receiver that gets the broadcast at boot time and starts
             up everything else.
             TODO: Should have an android:permission attribute
             -->
        <service android:name="SystemUIService"
            android:exported="true"
            />


        <!-- started from PhoneWindowManager
             TODO: Should have an android:permission attribute -->
        <service android:name=".screenshot.TakeScreenshotService"
            android:process=":screenshot"
            android:exported="false" />


        <service android:name=".LoadAverageService"
                android:exported="true" />


        <service android:name=".ImageWallpaper"
                android:permission="android.permission.BIND_WALLPAPER"
                android:exported="true" />


        <receiver android:name=".BootReceiver" androidprv:primaryUserOnly="true">
            <intent-filter android:priority="1000">
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>


        <receiver android:name=".qs.tiles.HotspotTile$APChangedReceiver"
                androidprv:primaryUserOnly="true">
            <intent-filter>
                <action android:name="android.net.wifi.WIFI_AP_STATE_CHANGED" />
            </intent-filter>
        </receiver>


        <activity android:name=".usb.UsbStorageActivity"
                  android:label="@*android:string/usb_storage_activity_title"
                  android:excludeFromRecents="true">
        </activity>


        <activity android:name=".tuner.TunerActivity"
                  android:enabled="false"
                  android:icon="@drawable/tuner"
                  android:theme="@android:style/Theme.Material.Settings"
                  android:label="@string/system_ui_tuner"
                  android:process=":tuner"
                  android:exported="true">
            <intent-filter>
                <action android:name="com.android.settings.action.EXTRA_SETTINGS" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            <meta-data android:name="com.android.settings.category"
                    android:value="com.android.settings.category.system" />
        </activity>


        <!-- Alternate Recents -->
        <activity android:name=".recents.RecentsActivity"
                  android:label="@string/accessibility_desc_recent_apps"
                  android:exported="false"
                  android:launchMode="singleInstance"
                  android:excludeFromRecents="true"
                  android:stateNotNeeded="true"
                  android:resumeWhilePausing="true"
                  android:screenOrientation="behind"
                  android:theme="@style/config_recents_activity_theme">
            <intent-filter>
                <action android:name="com.android.systemui.recents.TOGGLE_RECENTS" />
            </intent-filter>
        </activity>


        <receiver android:name=".recents.RecentsUserEventProxyReceiver"
                  android:exported="false">
            <intent-filter>
                <action android:name="com.android.systemui.recents.action.SHOW_RECENTS_FOR_USER" />
                <action android:name="com.android.systemui.recents.action.HIDE_RECENTS_FOR_USER" />
                <action android:name="com.android.systemui.recents.action.TOGGLE_RECENTS_FOR_USER" />
                <action android:name="com.android.systemui.recents.action.PRELOAD_RECENTS_FOR_USER" />
                <action android:name="com.android.systemui.recents.action.CONFIG_CHANGED_FOR_USER" />
            </intent-filter>
        </receiver>


        <!-- Callback for dismissing screenshot notification after a share target is picked -->
        <receiver android:name=".screenshot.GlobalScreenshot$TargetChosenReceiver"
                  android:process=":screenshot"
                  android:exported="false" />


        <!-- Callback for deleting screenshot notification -->
        <receiver android:name=".screenshot.GlobalScreenshot$DeleteScreenshotReceiver"
                  android:process=":screenshot"
                  android:exported="false" />


        <!-- started from UsbDeviceSettingsManager -->
        <activity android:name=".usb.UsbConfirmActivity"
            android:exported="true"
            android:permission="android.permission.MANAGE_USB"
            android:theme="@style/Theme.SystemUI.Dialog.Alert"
            android:finishOnCloseSystemDialogs="true"
            android:excludeFromRecents="true">
        </activity>


        <!-- started from UsbDeviceSettingsManager -->
        <activity android:name=".usb.UsbPermissionActivity"
            android:exported="true"
            android:permission="android.permission.MANAGE_USB"
            android:theme="@style/Theme.SystemUI.Dialog.Alert"
            android:finishOnCloseSystemDialogs="true"
            android:excludeFromRecents="true">
        </activity>


        <!-- started from UsbDeviceSettingsManager -->
        <activity android:name=".usb.UsbResolverActivity"
            android:exported="true"
            android:permission="android.permission.MANAGE_USB"
            android:theme="@style/Theme.SystemUI.Dialog.Alert"
            android:finishOnCloseSystemDialogs="true"
            android:excludeFromRecents="true">
        </activity>


        <!-- started from UsbDeviceSettingsManager -->
        <activity android:name=".usb.UsbAccessoryUriActivity"
            android:exported="true"
            android:permission="android.permission.MANAGE_USB"
            android:theme="@style/Theme.SystemUI.Dialog.Alert"
            android:finishOnCloseSystemDialogs="true"
            android:excludeFromRecents="true">
        </activity>


        <!-- started from UsbDebuggingManager -->
        <activity android:name=".usb.UsbDebuggingActivity"
            android:permission="android.permission.MANAGE_USB"
            android:theme="@style/Theme.SystemUI.Dialog.Alert"
            android:finishOnCloseSystemDialogs="true"
            android:excludeFromRecents="true">
        </activity>
        <activity android:name=".usb.UsbDebuggingSecondaryUserActivity"
            android:theme="@style/Theme.SystemUI.Dialog.Alert"
            android:finishOnCloseSystemDialogs="true"
            android:excludeFromRecents="true">
        </activity>


        <!-- started from NetworkPolicyManagerService -->
        <activity
            android:name=".net.NetworkOverLimitActivity"
            android:exported="true"
            android:permission="android.permission.MANAGE_NETWORK_POLICY"
            android:theme="@android:style/Theme.DeviceDefault.Light.Panel"
            android:finishOnCloseSystemDialogs="true"
            android:launchMode="singleTop"
            android:taskAffinity="com.android.systemui.net"
            android:excludeFromRecents="true" />


        <!-- started from MediaProjectionManager -->
        <activity
            android:name=".media.MediaProjectionPermissionActivity"
            android:exported="true"
            android:theme="@style/Theme.AlertDialogHost"
            android:finishOnCloseSystemDialogs="true"
            android:launchMode="singleTop"
            android:excludeFromRecents="true" />


        <!-- platform logo easter egg activity -->
        <activity
            android:name=".DessertCase"
            android:exported="true"
            android:label="@string/dessert_case"
            android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
            android:hardwareAccelerated="true"
            android:launchMode="singleInstance"
            android:screenOrientation="locked"
            android:process=":sweetsweetdesserts"
            android:excludeFromRecents="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>


        <activity android:name=".egg.MLandActivity"
                  android:theme="@android:style/Theme.Material.NoActionBar"
                  android:exported="true"
                  android:icon="@drawable/icon"
                  android:label="@string/mland"
                  android:hardwareAccelerated="true"
                  android:launchMode="singleInstance"
                  android:screenOrientation="locked"
                  android:process=":sweetsweetdesserts"
                  android:excludeFromRecents="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="com.android.internal.category.PLATLOGO" />
            </intent-filter>
        </activity>


        <!-- a gallery of delicious treats -->
        <service
            android:name=".DessertCaseDream"
            android:exported="true"
            android:label="@string/dessert_case"
            android:permission="android.permission.BIND_DREAM_SERVICE"
            android:enabled="false"
            android:process=":sweetsweetdesserts"
            >
            <intent-filter>
                <action android:name="android.service.dreams.DreamService" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </service>


        <service
            android:name=".keyguard.KeyguardService"
            android:exported="true"
            android:enabled="@bool/config_enableKeyguardService" />


        <activity android:name=".Somnambulator"
            android:label="@string/start_dreams"
            android:icon="@mipmap/ic_launcher_dreams"
            android:theme="@android:style/Theme.Wallpaper.NoTitleBar"
            android:exported="true"
            android:excludeFromRecents="true"
            >
            <!--
            <intent-filter>
                <action android:name="android.intent.action.CREATE_SHORTCUT" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            -->
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.DESK_DOCK" />
            </intent-filter>
        </activity>


        <activity
            android:name=".settings.BrightnessDialog"
            android:label="@string/quick_settings_brightness_dialog_title"
            android:theme="@android:style/Theme.DeviceDefault.Dialog"
            android:finishOnCloseSystemDialogs="true"
            android:launchMode="singleInstance"
            android:excludeFromRecents="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.SHOW_BRIGHTNESS_DIALOG" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>


        <!-- Doze with notifications, run in main sysui process for every user  -->
        <service
            android:name=".doze.DozeService"
            android:exported="true"
            android:singleUser="true"
            android:permission="android.permission.BIND_DREAM_SERVICE" />
        <!-- Add for Multi-window -->
        <provider
            android:name="com.mediatek.systemui.floatpanel.FloatWindowProvider"
            android:authorities="com.android.systemui.floatwindow"
            android:exported="true" />
          <receiver android:name="com.mediatek.systemui.floatpanel.FloatModel" >
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_ADDED" />
                <action android:name="android.intent.action.PACKAGE_REMOVED" />
                <action android:name="android.intent.action.PACKAGE_CHANGED" />
                <action android:name="action_multiwindow_disable_pkg_updated" />
                <data android:scheme = "package"/>
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.LOCALE_CHANGED" />
            </intent-filter>
        </receiver>


        <receiver
            android:name=".tuner.TunerService$ClearReceiver"
            android:exported="false">
            <intent-filter>
                <action android:name="com.android.systemui.action.CLEAR_TUNER" />
            </intent-filter>
        </receiver>
    </application>
</manifest>



 1,manifest标签和其自身的属性

<manifest> </manifest>

Manifest文件是标准xml文件,<manifest>是其根标签,所有文件内容都要包含在这个标签中。

xmlns:android

这个表示xml中要用到的名空间,这个名空间定义了所有android相关的关键字,例如android:name,android:process。

名空间定义了xml中的合法标签,是XML语言的范畴,此处就不细说了。

xmlns:androidprv

与xmlns:android一样,说明androidprv相关的名字会被用到。这里之所以引用这个,是因为这个android应用程序的配置中用到了以androidprv:primaryUserOnly命名的属性。

package="com.android.systemui"

由于android的应用程序是Java书写,manifest通过这个属性直接指明此应用程序对应的Java package包。

android:sharedUserId="android.uid.systemui"

Android为每个应用程序分配一个用户ID,通过这个标识应用程序。如果两个应用拥有相同的UserID,它们就能够互相访问对方的数据,如果需要,还可以运行在同样的进程中。SytemUI声明自己的ID就是“android.uid.systemui”。也就是说,如果要编写一个应用程序,需要访问systemui这个应用程序的数据,那么在他的manifest标签中,配置同样的属性就可以了。当然,还有另外的方法,就是使用uses-permission标签,会在下面介绍。

coreApp="true"

    标识systemui是coreApp中的一个,coreApp是android在bootmode下系统启动的最小子集。在这个模式下,有一组最少的,必须的app需要启动,systemui就是其中之一。

2, 下面分别看<manifest>标签中包含的两个tag,一个是<uses-permission>,另外一个是<application>

<uses-permissionandroid:name="android.permission.RECEIVE_BOOT_COMPLETED" />

上面描述android:sharedUserId提到,每个android应用程序都有一个唯一的ID来标识自己。这个ID也是一个安全壁垒,可以让每个应用的数据只能被自己所访问。

除了android:sharedUserId之外,还有一个机制就是permission。如果应用程序想对自己的数据加以保护,则可以用android:permission这个配置项来声明,而使用者,则需要用uses-permission来声明。

在这里,SystemUI应用程序说明它要用使用android.permission.RECEIVE_BOOT_COMPLETED,也就是SystemUI会在系统启动完成的时候收到通知,如果没有这个声明,就收不到通知。

同样<uses-permissionandroid:name="android.permission.BLUETOOTH" />,表明SystemUI可以访问蓝牙。

    <application

        android:name=".SystemUIApplication"
        android:persistent="true"
        android:allowClearUserData="false"
        android:allowBackup="false"
        android:hardwareAccelerated="true"
        android:label="@string/app_label"
        android:icon="@drawable/icon"
        android:process="com.android.systemui"
        android:supportsRtl="true"
        android:theme="@style/systemui_theme">

application模块定义一个应用程序的基本配置。应用程序是Android上的基本运行单位,每个程序都拥有一个独立的Linux ID。


android:persistent="true"

这个属性指定systemUI会在启动后一直运行下去。如果这个标记为false,则这个应用程序会被系统在资源匮乏的时候回收。大部分应用程序都是不会被设置为true的,而systemUI是一个系统程序,所以被设置为true。

android:allowClearUserData和android:allowBackup

标记应用程序的data是否允许被用户清除,这个会在BackupManagerService.java中用到。

android:allowBackup标记是否允许一个应用使用backup机制。

Androidbackup机制允许用户通过backup manager将应用程序的相关数据存储到云端,当手机被重置或者程序重新安装之后,原来backup的数据可以从云端取回,不会丢失。

android:hardwareAccelerated="true"

使用硬件加速

Android的每个版本都会增加一些功能,而为了使得新功能不引入意想不到的麻烦,就需要将这个功能能够开关,就要加入相应的标记。android:hardwareAccelerated就是之一,Android3.0引入了这个功能。

android:supportsRtl

这是Android4.1引入的一个功能,能够让排版支持从右到左,例如阿拉伯语。

3,在<application>内部,是Android应用程序的主要部分,可以包含四大组件,每个组件都包含很多配置属性,这里不再详述,仅仅列举其中的一个来看

<Activity>

<activityandroid:name=".recent.RecentsActivity"

               android:label="@string/accessibility_desc_recent_apps"

               android:theme="@style/RecentsStyle"

               android:excludeFromRecents="true"

               android:launchMode="singleInstance"

                android:exported="true"></activity>

android:name

是AndroidManifest与Java程序的一个桥梁,通过它,指定Java程序的执行类。

android:theme

theme就是能够应用于所有Activity或者application的显示风格。这是Android显示机制中的一个概念。

android:excludeFromRecents

如果这个Activity是一个新进程的根Activity,设置此标记为'true'则表示通过这个Activity启动的任务是否会排除在”recent apps” 之外。所谓recent apps,就是长按Home键,会通过一个list显示最近访问的app。

同样,如果你不想让你的进程显示在其中,则可以置这个属性为true.

android:launchMode="singleInstance"

说明这个Activity是独占一个任务的,而且这个任务不能有其他的Activity存在。也可以看到,SystemUI中所有的Activity都是独占模式打开的。

android:exported="true"

这个属性用于指示该服务是否能够被其他应用程序组件调用或跟它交互。现在设置为true,说明它能够被其他应用程序调用。

4,小结

通过这个manifest文件,可以初步了解systemUI是android平台的一个核心应用程序,它一旦启动,就会长久运行下去。它的所有component都拥有独占的任务。这个应用程序的所有数据不会被备份到云端。

在systemui的进程中,会运行多个components。其中有一个recentActivity,也是运行在他的进程中,这个Activity不会出现在rencent list中。



1 0