https://blog.csdn.net/qq_15003505/article/details/70231975
AndroidManifest,中文名一般稱之為清單文件。它描述了應用程序的組件的活動、服務,廣播接收機,內容提供商,應用程序組成、應用程序的Java包命名、權限、特性等。每個安卓應用程序必須有一個AndroidManifest.xml文件,基本內容如下:
<?xml version="1.0" encoding="utf-8"?>
<!-- <manifest>
<manifest>AndroidManifest.xml配置文件的根元素,
必須包含一個<application>元素並且指定xlmns:android和package屬性。
xlmns:android指定了Android的命名空間,默認情況下是“http://schemas.android.com/apk/res/android”;
package是標准的應用包名,也是一個應用進程的默認名稱,我們為了避免命名空間的沖突,一般會以應用的域名來作為包名。
android:versionCode是給設備程序識別版本用的,必須是一個整數值代表app更新過多少次;
android:versionName則是給用戶查看版本用的,需要具備一定的可讀性,
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android_activitylife"
android:versionCode="1"
android:versionName="1.0" >
<!-- <uses-permission>
為了保證Android應用的安全性,應用框架制定了比較嚴格的權限系統,一個應用必須聲明了正確的權限才可以使用相應的功能
例如我們需要讓應用能夠訪問網絡就需要配置“android.permission.INTERNET”
而如果要使用設備的相機功能,則需要設置“android.permission.CAMERA”等。
<uses-permission>就是我們最經常使用的權限設定標簽,
android:name屬性來聲明相應的權限名,
-->
<!-- 網絡相關功能 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 讀取電話狀態 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!-- 通知相關功能 -->
<uses-permission android:name="android.permission.VIBRATE" />
<!-- <permission>
權限聲明標簽,定義了供給<uses-permission>使用的具體權限,
通常情況下我們不需要為自己的應用程序聲明某個權限,除非需要給其他應用程序提供可調用的代碼或者數據,這個時候你才需要使用<permission>標簽。
android:name權限名標簽,
android:icon權限圖標
android:description權限描述
<permission-group>以及<permission-tree>配合使用來構造更有層次的、更有針對性權限系統。
<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"] />
-->
<!-- <instrumentation>
用於聲明Instrumentation測試類來監控Android應用的行為並應用到相關的功能測試中,
android:functionalTest測試功能開關
android:handleProfiling profiling調試功能開關,
android:targetPackage測試用例目標對象。
Instrumentation對象是在應用程序的組件之前被實例化的,這點在組織測試邏輯的時候需要被考慮到。
<instrumentation>標簽語法范例如下。
<instrumentation android:functionalTest=["true" | "false"]
android:handleProfiling=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:targetPackage="string" />
-->
<!-- <uses-sdk>
用於指定Android應用中所需要使用的SDK的版本,
比如我們的應用必須運行於Android 2.0以上版本的系統SDK之上,那么就需要指定應用支持最小的SDK版本數為5;
當然,每個SDK版本都會有指定的整數值與之對應,比如我們最常用的Android 2.2.x的版本數是8。
當然,除了可以指定最低版本之外,<uses-sdk>標簽還可以指定最高版本和目標版本,語法范例如下。
<uses-sdk android:minSdkVersion="integer"
android:targetSdkVersion="integer"
android:maxSdkVersion="integer" /> -->
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<!-- <uses-configuration>與<uses-feature>
這兩個標簽都是用於描述應用所需要的硬件和軟件特性,以便防止應用在沒有這些特性的設備上安裝。
<uses-configuration>標簽中,比如有些設備帶有D-pad或者Trackball這些特殊硬件,那么android:reqFiveWayNav屬性就需要設置為true;
而如果有一些設備帶有硬件鍵盤,android:reqHardKeyboard也需要被設置為true。
另外,如果設備需要支持藍牙,我們可以使用<uses-feature android:name="android.hardware.bluetooth" />來支持這個功能。
這兩個標簽主要用於支持一些特殊的設備中的應用,兩個標簽的語法范例分別如下。
<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"] />
<uses-feature android:name="string"
android:required=["true" | "false"]
android:glEsVersion="integer" />
-->
<!-- <uses-library>
用於指定Android應用可使用的用戶庫,
除了系統自帶的android.app、android.content、android.view和android.widget這些默認類庫之外,
有些應用可能還需要一些其他的Java類庫作為支持,
這種情況下我們就可以使用<uses-library>標簽讓ClassLoader加載其類庫供Android應用運行時用。
以下是語法范例。
<uses-library android:name="string"
android:required=["true" | "false"] />
小貼士:
當運行Java程序時,
首先運行JVM(Java虛擬機),然后再把Java類加載到JVM里頭運行,
負責加載Java類的這部分就叫做ClassLoader。當然,ClassLoader是由多個部分構成的,每個部分都負責相應的加載工作。
當運行一個程序的時候,JVM啟動,運行BootstrapClassLoader,
該ClassLoader加載java核心API(ExtClassLoader和AppClassLoader也在此時被加載),
然后調用ExtClassLoader加載擴展API,最后AppClassLoader加載CLASSPATH目錄下定義的Class,
這就是一個Java程序最基本的加載流程。
-->
<!-- <supports-screens>
對於一些應用或者游戲來說,只能支持某些屏幕大小的設備或者在某些設備中的效果比較好,
我們就會使用<supports-screens>標簽來指定支持的屏幕特征。
屏幕自適應屬性android:resizeable,
小屏(android:smallScreens)、
中屏(android:normalScreens)、
大屏(android:largeScreens)
特大屏(android:xlargeScreens)支持屬性,
按屏幕渲染圖像屬性android:anyDensity
最小屏幕寬度屬性android:requiresSmallestWidthDp等。
<supports-screens>標簽的語法范例如下。
<supports-screens android:resizeable=["true"| "false"]
android:smallScreens=["true" | "false"]
android:normalScreens=["true" | "false"]
android:largeScreens=["true" | "false"]
android:xlargeScreens=["true" | "false"]
android:anyDensity=["true" | "false"]
android:requiresSmallestWidthDp="integer"
android:compatibleWidthLimitDp="integer"
android:largestWidthLimitDp="integer"/>
-->
<!-- <application>
應用配置的根元素,位於<manifest>下層,包含所有與應用有關配置的元素,
其屬性可以作為子元素的默認屬性
應用名android:label,
應用圖標android:icon,
應用主題android:theme等。
大家可以打開Android SDK文檔來進一步學習,以下是語法范例。
<application android:allowTaskReparenting=["true" | "false"]
android:backupAgent="string"
android:debuggable=["true" | "false"]
android:description="string resource"
android:enabled=["true" | "false"]
android:hasCode=["true" | "false"]
android:hardwareAccelerated=["true" | "false"]
android:icon="drawable resource"
android:killAfterRestore=["true" | "false"]
android:label="string resource"
android:logo="drawable resource"
android:manageSpaceActivity="string"
android:name="string"
android:permission="string"
android:persistent=["true" | "false"]
android:process="string"
android:restoreAnyVersion=["true" | "false"]
android:taskAffinity="string"
android:theme="resource or theme" >
... ...
</application>
-->
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<!-- <activity>
Activity活動組件(即界面控制器組件)的聲明標簽,
Android應用中的每一個Activity都必須在AndroidManifest.xml配置文件中聲明,
否則系統將不識別也不執行該Activity。
Activity對應類名android:name,
對應主題android:theme,
加載模式android:launchMode
鍵盤交互模式android:windowSoftInputMode等,
其他的屬性用法大家可以參考Android SDK文檔學習。
另外,<activity>標簽還可以包含用於消息過濾的<intent-filter>元素,
當然還有可用於存儲預定義數據的<meta-data>元素,以下是<activity>標簽的語法范例。
<activity android:allowTaskReparenting=["true" | "false"]
android:alwaysRetainTaskState=["true" | "false"]
android:clearTaskOnLaunch=["true" | "false"]
android:configChanges=["mcc", "mnc", "locale",
"touchscreen", "keyboard", "keyboardHidden",
"navigation", "orientation", "screenLayout",
"fontScale", "uiMode"]
android:enabled=["true" | "false"]
android:excludeFromRecents=["true" | "false"]
android:exported=["true" | "false"]
android:finishOnTaskLaunch=["true" | "false"]
android:hardwareAccelerated=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:launchMode=["multiple" | "singleTop" | "singleTask" | "singleInstance"]
android:multiprocess=["true" | "false"]
android:name="string"
android:noHistory=["true" | "false"]
android:permission="string"
android:process="string"
android:screenOrientation=["unspecified" | "user" | "behind" |
"landscape" | "portrait" |
"sensor" | "nosensor"]
android:stateNotNeeded=["true" | "false"]
android:taskAffinity="string"
android:theme="resource or theme"
android:windowSoftInputMode=["stateUnspecified",
"stateUnchanged", "stateHidden",
"stateAlwaysHidden", "stateVisible",
"stateAlwaysVisible", "adjustUnspecified",
"adjustResize", "adjustPan"] >
... ...
</activity>
-->
<activity
android:name="com.example.android_activitylife.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<!-- <activity-alias>
Activity組件別名的聲明標簽,簡單來說就是Activity的快捷方式,
屬性android:targetActivity表示的就是其相關的Activity名,當然必須是前面已經聲明過的Activity。
Activity別名名稱android:name,
別名開關android:enabled,
權限控制android:permission等。
另外,我們還需要注意的是,Activity別名也是一個獨立的Activity,可以擁有自己的<intent-filter>和<meta-data>元素,
其語法范例如下。
<activity-alias android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:permission="string"
android:targetActivity="string" >
... ...
</activity-alias>
-->
<!-- <intent-filter>與<action>、<category>、<data>
<intent-filter>用於Intent消息過濾器的聲明,
Intent消息對於Android應用系統來說,是非常重要的“粘合劑”,
<intent-filter>元素可以放在<activity>、<activity-alias>、<service>和<receiver>元素標簽中,
來區分可用於處理消息的Activity控制器、Service服務和廣播接收器Broadcast Receiver。
另外,我們還知道Intent消息還包含有名稱、動作、數據、類別等幾個重要屬性。這點與該標簽的寫法也有一定的關系,
<category>標簽則用於表示能處理消息組件的類別,即該Action所符合的類別;
<data>元素則用於描述消息需要處理的數據格式,我們甚至還可以使用正則表達式來限定數據來源。
這些元素和標簽的具體用法我們還需要慢慢學習,下面是標准<intent-filter>元素標簽的語法范例。
<intent-filter android:icon="drawable resource"
android:label="string resource"
android:priority="integer" >
<action android:name="string" />
<category android:name="string" />
<data android:host="string"
android:mimeType="string"
android:path="string"
android:pathPattern="string"
android:pathPrefix="string"
android:port="string"
android:scheme="string" />
</intent-filter>
-->
<!-- <meta-data>
用於存儲預定義數據,和<intent-filter>類似,
<meta-data>也可以放在<activity>、<activity-alias>、<service>和<receiver>這四個元素標簽中。
Meta數據一般會以鍵值對的形式出現,個數沒有限制,而這些數據都將被放到一個Bundle對象中
,程序中我們則可以使用ActivityInfo、ServiceInfo甚至ApplicationInfo對象的metaData屬性中讀取。
假設我們在一個Activity中定義了一個<meta-data>元素,相關示例用法如下。
<activity...>
<meta-data android:name="testData" android:value="Test Meta Data"></meta-data>
</activity>
ActivityInfo info = this.getPackageManager()
.getActivityInfo(getComponentName(), PackageManager.GET_META_DATA);
String testData = info.metaData.getString("testData");
System.out.println("testData:" + testData);
-->
<!-- <service>
Service服務組件的聲明標簽,用於定義與描述一個具體的Android服務,
Service服務類名android:name,
服務圖標android:icon,
服務描述android:label
服務開關android:enabled等。
以下是<service>標簽的語法范例。
<service android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:permission="string"
android:process="string" >
... ...
</service>
-->
<!-- <receiver>
Boardcast Receiver廣播接收器組件的聲明標簽,用於定義與描述一個具體的Android廣播接收器,其主要屬性和<service>
標簽有些類似:Boardcast Receiver
接收器類名android:name,
接收器圖標android:icon,
接收器描述android:label
接收器開關android:enabled等。
<receiver>標簽的語法范例。
<receiver android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:permission="string"
android:process="string" >
... ...
</receiver>
-->
<!-- <provider>與<grant-uri-permission>
除Activity、Service和Boardcast Receiver之外的另一個“四大組件”,也就是Content Provider內容提供者的聲明標簽。
<provider>標簽除了和其他組件相同的android:name、android:icon和android:label等基礎屬性之外,
還提供了用於支持其功能的特殊屬性,以下是<provider>標簽的語法范例。
<provider android:authorities="list"
android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:grantUriPermissions=["true" | "false"]
android:icon="drawable resource"
android:initOrder="integer"
android:label="string resource"
android:multiprocess=["true" | "false"]
android:name="string"
android:permission="string"
android:process="string"
android:readPermission="string"
android:syncable=["true" | "false"]
android:writePermission="string" >
... ...
</provider>
-->
</manifest>
以上的詳細說明感謝博主的分享http://blog.csdn.net/zhaoyazhi2129/article/details/27234245
不過從當前的Unity項目生成的Android工程來說,只使用到了四大組件中的Activity,就連Fragment都沒用上。
Unity中AndroidManifest
如果還不熟悉Unity如何導出Android工程,請參考上一篇。Unity在導出Android工程的時候會自動生成一個AndroidManifest.xml文件,如果已經存在則使用存在的AndroidManifest.xml文件。Unity生成的時候會自動生成所需要的組件、權限、版本等,當然有些信息是可以在Unity中配置的,比如如下圖:
不過這里還是推薦讓Unity自動生成清單文件,如果有需要改動的地方在手動修改即可。清單文件存放的位置在Assets/Plugins/Android/AndroidManifest.xml。另外Unity針對Android項目提供了一個固定名稱的UnityPlayerActivity類,這個是Unity在生成Android工程的啟動類,我們可以直接使用該類或者繼承它。清單文件如下所示:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.company.product">
<application android:icon="@drawable/app_icon" android:label="@string/app_name">
<activity
android:name="com.xanthuim.UnityPlayerActivity"
android:label="@string/app_name"
android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
權限
谷歌為了用戶的安全隱私,采用權限的機制,讓用戶明白在使用應用的時候都使用了什么權限,因此開發需要在清單文件中配置相關的權限,否則無法正常使用。比如網絡、讀寫SD卡、位置信息等。不過注意的是在Android低版本的系統配置權限只需要在清單文件中配置即可,而在Android 6.0以上則要復雜些。Android 6.0以上把權限分為普通權限和危險權限,普通權限的使用同低版本一致,而危險權限不僅需要配置還需要在代碼運行時做出檢查,並且根據不同情況進行相應的操作,否則應用程序出現崩潰,詳情請查看谷歌官方文檔https://developer.android.google.cn/about/versions/marshmallow/android-6.0-changes.html#behavior-runtime-permissions。
那么Unity中該如何應對Android 6.0中的危險權限呢?答案是不用特殊處理,因為Unity暫時不支持,只需要在清單文件中的Application或Activity做一下配置即可(詳情請參考Unity官方文檔說明https://docs.unity3d.com/Manual/android-manifest.html):
<meta-data android:name="unityplayer.SkipPermissionsDialog" android:value="true" />
1
但是這里需要提醒的是,其實應用程序的權限是否按照Android 6.0以上運行取決於android:targetSdkVersion=”23”。這句話的意思表示當前應用運行的環境是Android 6.0(22代表5.0,23代表7.0等),也就是說只有android:targetSdkVersion的值是23以上(包含23)應用的權限才會有危險權限一說,否則還是按照普通權限執行。那么上面提到的Unity不支持想必就是如此吧,不過我還是不太確定如果這兩個參數都設置了那會有什么結果呢?這里就放在程序中去做測試吧。
---------------------
作者:Xanthuim
來源:CSDN
原文:https://blog.csdn.net/qq_15003505/article/details/70231975
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!