以6.0系统中的Settings模块源码为例讲解。
<manifest/>标签层:
这是整个清单文件的最上层,用来做一些最基本的声明,如(包名,权限,资源命名空间等)。老规矩,通过栗子来讲解:
<manifest coreApp="true"
package="com.android.settings"
xmlns:android="http://schemas.android.com/apk/res/android"
android:sharedUserId="android.uid.system"
android:versionCode="20150101"
android:versionName="3.0.5">
<original-package android:name="com.android.settings"/>
<uses-sdk
android:minSdkVersion="21"
android:targetSdkVersion="21"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
-
1.package="com.android.settings"
整个应用的包名。这里有个坑,当我们通过ComponentName
来启动某个Activity时,所用的包名一定是这个应用的包名,而不是当前Activity的包名。 -
2.xmlns:android="http://schemas.android.com/apk/res/android"
命名空间的声明,使得各种Android系统级的属性能让我们使用。当我们需要使用自定义属性时,可以将其修改为res-auto,编译时会为我们自动去找到该自定义属性。 -
3.android:sharedUserId="android.uid.system"//由SystemServer启动而来.很多的服务都是在系统进程里启动的.
将当前应用进程设置为系统级进程(不推介随意这么做,会产生很多隐患)。拥有此属性后,我们的应用就可以无视用户,无法无天地处理很多事情,比如擅自修改手机system分区的内容、静默安装等。之前开发过一个类似切换多套开关机动画和音效的模块,添加此属性后,就可以明目张胆地将我们的数据节点存在system分区,可以让用户恢复出厂设置都清空不了我们的数据。
但是添加此属性后,我们需要在当前模块的MakeFile中添加LOCAL_CERTIFICATE := platform
,然后在安卓源码环境下使用原生make命令编译才能生效(原生编译虽然比使用ide工具麻烦很多,但是却能使用很多ide工具无权限使用的api)。
如果非要在ide工具中使用则必须通过系统密钥重签名生成的apk才行(未亲自验证)。 -
4.uses-permission
为我们的应用添加必须的权限。同时我们也可以该层声明自定义的权限。
<permission
android:name="com.cold.permission.appfreeze"
android:protectionLevel="signatureOrSystem"/>
--*
<application/>标签层:
应用层标签,用来配置我们的apk的整体属性,也可以统一指定所有界面的主题。栗子如下:
<application
android:name=".SettingsApp"
android:allowBackup="false"
android:hardwareAccelerated="true"
android:icon="@mipmap/ic_launcher_settings"
android:label="@string/settings_label"
android:requiredForAllUsers="true"
android:supportsRtl="true"
android:taskAffinity=""
android:theme="@style/Theme.Aui">
-
1."android:name"、"android:icon"、"android:label"
顾名思义