Android知識點回顧之Manifest文件-上篇

定義:AndrodiManifest.xml文件爲Android程序的入口文件,而且是必須的,位於整個項目的根目錄下。拿到一個Android項目,能夠先從AndroidManifest.xml文件入手,進行分析。它提供了一些必要的信息,好比程序的入口Activity,其餘組件的聲明,權限的聲明,包名,版本信息等。php

Manifest能夠作如下事情:android

  • 定義包名,包名爲APP的惟一標識,每一個不一樣APP的包名必然不一樣。
  • 組件聲明。Activity,Service,BroadcastReceiver,ContentProvider
  • 肯定應用程序組件的進程
  • 權限聲明
  • 列出Instrumentation類的信息,提供性能分析和APP在執行的其餘信息
  • 聲明應用支持最低Android API的版本
  • 聲明必須連接的共享類庫

Manifest文件結構

<?xml version="1.0" encoding="utf-8"?>

<manifest>

    <uses-permission />
    <permission />
    <permission-tree />
    <permission-group />
    <instrumentation />
    <uses-sdk />
    <uses-configuration />  
    <uses-feature />  
    <supports-screens />  
    <compatible-screens />  
    <supports-gl-texture />  

    <application>

        <activity>
            <intent-filter>
                <action />
                <category />
                <data />
            </intent-filter>
            <meta-data />
        </activity>

        <activity-alias>
            <intent-filter> . . . </intent-filter>
            <meta-data />
        </activity-alias>

        <service>
            <intent-filter> . . . </intent-filter>
            <meta-data/>
        </service>

        <receiver>
            <intent-filter> . . . </intent-filter>
            <meta-data />
        </receiver>

        <provider>
            <grant-uri-permission />
            <meta-data />
            <path-permission />
        </provider>

        <uses-library />

    </application>

</manifest>複製代碼

manifest

清單文件的根元素,必須包含標籤,指定命名空間xmlns:android和package屬性app

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="string" android:sharedUserId="string" android:sharedUserLabel="string resource" android:versionCode="integer" android:versionName="string" android:installLocation=["auto" | "internalOnly" | "preferExternal"] >
    . . .
</manifest>複製代碼

xmlns:android,定義android命名空間,一般設置爲「schemas.android.com/apk/res/and… 關於xml的命名空間,能夠看這裏ide

package:不一樣的APP具備不一樣的包名。以Java包名風格進行命名,必須惟一。性能

sharedUserId:具備相同的uderId而且具備相同簽名的APP能夠共享和訪問彼此的數據,甚至能夠在同一個進程裏面運行,此時必須設置相同。測試

sharedUserLabel:給共享userId定義了用戶可讀標籤,只有設置了sharedUserId,此屬性纔有意義。ui

versionCode:內部版本號。必須是整數,Integer類型。用來判斷版本的升級,每一次發佈都必須必以前的要大。若是versionName沒有設置,則設置成此值。spa

versionName:展現給用戶看的版本號。爲String類型。設計

installLocation:設置apk文件的默認安裝路徑。code

  • internalOnly,只能安裝在設備ROM上(內部存儲),若是設備ROM空間滿了,則會安裝失敗。若是沒定義androdi:installLocation,則默認設置的是此項。
  • auto,系統優先安裝apk包到內部存儲,若是內部存儲滿了,則會安裝到SD卡。用戶也能夠把外部存儲安裝好的應用移到內部存儲上
  • preferExternal,會優先安裝在外部存儲上(SD卡),當無SD卡或SD卡滿了的話,則會安裝到內部存儲上。固然,用戶能夠把外部存儲安裝好的應用移到內部存儲上
    關於外部存儲的幾個注意點:
    • .apk文件是安裝在SD卡上,可是數據仍是保持在內部存儲上
    • SD卡上安裝的apk文件和設備關聯,把SD卡放到另一臺設備進行訪問是不行的。
    • 用戶能夠把已安裝好的應用移入內部存儲

權限

user-permission

聲明APP須要使用到的權限,Android5.1或如下在安裝的時候聲請,Android6.0或以上的須要運行時權限申請

<uses-permission android:name="string" android:maxSdkVersion="integer" />複製代碼

name:權限的名稱。能夠是系統定義的權限,也能夠是其餘應用的權限,或者是使用自定義的權限

maxSdkVersion:此申請的權限最高的做用Android版本。當一些權限在高版本無需申請的時候能夠設置此值,好比 WRITE_EXTERNAL_STORAGE,在API 19就不須要進行申請了,能夠進行以下操做

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" />複製代碼

permission

自定義權限,以限制訪問指定的組件或APP——本APP或其餘APP,起到保護的做用。

<permission android:description="string resource" android:icon="drawable resource" android:label="string resource" android:name="string" android:permissionGroup="string" android:protectionLevel=["normal" | "dangerous" | "signature" | "signatureOrSystem"] />複製代碼

description:自定義的用戶可讀的權限描述,

icon:權限的icon圖標

label:展現給用戶的權限名字

name:權限的命名,爲一串惟一的英文字符,如:com.example.READ_ACTIVITY。須要注意的是Android系統不容許不一樣的包名定義相同的權限名(permission name),除非不一樣的包名具備相同的簽名證書。若是一個APP1聲明瞭權限名A,則系統不容許另一個聲明瞭權限名A的不一樣簽名證書的APP2進行安裝。爲了不這種狀況發生,能夠以本身APP的包名爲前綴進行權限聲明

permissionGroup:權限所屬的權限組,此項的值必須爲中聲明的name或者是其餘APP聲明的。若是此項不設置,則此權限不屬於權限組。

protectionLevel:權限的級別。

  • normal:默認值。低風險的。系統會自動分配此類權限,而不須要經過用戶來點擊確認
  • dangerous:危險的權限。須要經用戶容許纔可以獲取此類權限
  • signature:申請權限的APP必須也聲明此權限的APP具備相同的簽名才容許得到。
  • signatureOrSystem:申請權限的APP必須爲系統簽名或是和聲明此權限的APP具備相同的簽名才容許得到權限

要訪問授權限保護的組件,必須在進行聲明,不管是官方定義的仍是自定義的,如:

<manifest>
    <permission android:name="com.example.READ_ACTIVITY"/>
    <uses-permission android:name="com.example.READ_ACTIVITY" />

    <application>
        <activity android:name="com.example.TestActivity" android:permission="com.example.READ_ACTIVITY" >
        </activity>
    </application>
</manifest>複製代碼

TestActivity聲明瞭READ_ACTIVITY權限保護,若是要啓動TestActivity,必需要申請READ_ACTIVITY權限

permission-tree

聲明一個權限樹,能夠在此節點上動態添加權限,PackageManager.addPermission()。如聲明瞭權限樹com.example.project.taxes,在此節點上能夠動態添加權限:
com.example.project.taxes.CALCULATE
com.example.project.taxes.deductions.MAKE_SOME_UP
com.example.project.taxes.deductions.EXAGGERATE

須要注意的是此項聲明的不是權限,是權限的命名空間。

<permission-tree android:icon="drawable resource" android:label="string resource" ] android:name="string" />複製代碼

icon和label與permission的相似。
name爲權限的命名,如:com.example.project.taxes

permission-group

聲明一個邏輯上的權限分組

<permission-group android:description="string resource" android:icon="drawable resource" android:label="string resource" android:name="string" />複製代碼

instrumentation

聲明一個Instrumentation類,用來監控APP和系統的交互。Instrumentation對象會在APP的全部組件以前進行實例化。

<instrumentation android:functionalTest=["true" | "false"] android:handleProfiling=["true" | "false"] android:icon="drawable resource" android:label="string resource" android:name="string" android:targetPackage="string" />複製代碼

functionalTest:是否進行功能性的測試。true:是。false:否。默認值爲false

handleProfiling:true:自定義性能分析的開始和結束時間。false:性能分析整個運行過程。默認值爲false

name:Instrumentation子類的全名。好比:com.example.project.StringInstrumentation

targetPackage:Instrumentation對象所依賴的目標包名

Instrumentation具體的可看這裏

uses-sdk

<uses-sdk android:minSdkVersion="integer" android:targetSdkVersion="integer" android:maxSdkVersion="integer" />複製代碼

minSdkVersion:指定APP運行的所需最低API級別的整數,若是系統API級別低於此值,則會阻止用戶安裝。若是不聲明該屬性,則默認爲1。

targetSdkVersion:指定APP目標API級別的整數,不過不聲明該屬性,則默認和minSdkVersion同樣

maxSdkVersion:APP可以運行在系統的最大API級別。在Android2.0.1如下,若是APP指定的此項低於系統的API級別,則會安裝不了,已安裝的會被隱藏掉。Android2.0.1(不包含)以上的系統不會檢查安裝的APP的此項屬性,因此不會出現2.0.1如下的狀況。此值通常不進行設置。

uses-configuration

用來設置APP須要的相關硬件和軟件的配置。大部分APP都不須要此屬性。

<uses-configuration android:reqFiveWayNav=["true" | "false"] android:reqHardKeyboard=["true" | "false"] android:reqKeyboardType=["undefined" | "nokeys" | "qwerty" | "twelvekey"] android:reqNavigation=["undefined" | "nonav" | "dpad" | "trackball" | "wheel"] android:reqTouchScreen=["undefined" | "notouch" | "stylus" | "finger"] />複製代碼

reqFiveWayNav:是否須要五維導航控制,如方向版(D-pad),軌跡球等。

reqHardKeyboard:是否須要物理鍵盤

reqKeyboardType:設置所需鍵盤的類型

reqNavigation:指定方向控制的確切類型或不指定(undefined,爲默認值)

reqTouchScreen:觸摸屏的類型。

uses-feature

用來聲明APP所要使用和依賴的單一的軟硬件功能。該項所提供的require屬性若是是須要的功能,那麼若是缺乏的話就會沒法使用。好比聲明瞭<uses-feature android:name="android.hardware.camera" require="true"/>,若是缺乏攝像頭,那麼就會沒法使用。而且必須單獨地爲每一個功能進行聲明。很重要的一點是GooglePlay會根據此項所聲明的功能進行過濾提供給兼容設備的用戶,用戶只能下載和其設備相容的APP。

<uses-feature android:name="string" android:required=["true" | "false"] android:glEsVersion="integer" />複製代碼

name:硬件或軟件功能的字符串描述。

required:true,當設備沒有改指定的功能(name)時,APP沒法正常工做或設計爲沒法正常工做;false,有該功能優先使用該功能,無也可正常工做。默認值爲true

glEsVersion:所須要的OpenGL ES版本。高16位表示主版本號,底16位表示次版本號。例如,要指定 OpenGL ES 2.0 版,您須要將其值設置爲「0x00020000」;要指定 OpenGL ES 3.2,則需將其值設置爲「0x00030002」。若是聲明多個,則選擇最高版本的那個,其它的忽略。若是不聲明,則默認爲1.0版本,全部Android設備都支持。

相關文章
相關標籤/搜索