Android系统开发 - 扩展Androidmanifest.xml文件中<application>标签的属性

来源:互联网 发布:皮蓬季后赛数据 编辑:程序博客网 时间:2024/05/16 08:41

如下Android的流行,Android平台的开放性有其必然的优势,使得更多的厂商投入到基于Android平台开发当中,但是过多没有公共规范的定制化使得各个厂商也不会走的太远,而对开发者而言,开发一款杀手级的且能在大多android设备中运行的应用也愈来愈难。

有点离题了,现在言归正传,开发过程中可能基于某种原因需要扩展manifest文件中的application标签或其他标签的属性,此处以扩展application标签属性为例说明其需要的步骤。Android系统版本为ICS

1. 扩展属性,那么首先需要在系统的manifest属性文件中声明需要添加的属性,文件位置:/源码/framework/base/core/res/res/values/attr_manifest.xml

// 声明属性<attr name="myTestProp" format="string" />//在需要添加该属性的标签的样式声明文件中中添加属性<declar-styleable name="AndroidManifestApplication" parent="AndroidManifest">......<attr name="myTestProp" />......</declare-styleable>

2. 添加该属性的资源号,每个属性都有对应的资源号,这样才能被系统找到。就想R文件中的各个资源的资源号一样。文件位置:/源码/framework/base/core/res/res/values/public.xml
//在文件的最下方添加<public type="attr" name="myTestProp" id="0x010103aa" />其中type取决于你所添加属性的类型,我们这所添加的就是属性‘Attr', 如添加的是颜色相关的属性,那么type=’Color‘;还有比较重要的一点就是id的指定是public文件中最下面那一项的id+1,id号是顺序递增的,千万别和已有的重复,不然系统找不到你所定义的属性了

3. 系统属性声明完了,而我们是扩展的Application标签的属性,所以也要在Framework层对应的ApplicationInfo.java中添加对应的属性

文件位置:/源码/framework/base/core/java/android/content/pm/ApplicationInfo.java

// 进程间通过Parcelable传递信息public class ApplicationInfo extends PackageItemInfo implements Parcelable {...public String myTestProp;...public ApplicationInfo(ApplicationInfo orig) {...myTestProp = orig.myTestProp;...}public void writeToParcel(Parcel dest, int parcelableFlags) {        ...dest.writeString(myTestProp);    }private ApplicationInfo(Parcel source) {...// 我们定义的myTestProp的类型是String的,所这里用的是readStringmyTestProp = source.readString();}}

好了,经过上述几步以后,系统可以正确的识别你新添加的属性了,于是你觉得系统修改完成了,所以开始编译img

make update-api -j4     //这个很重要的哦,你添加了系统属性,所以需要更新系统api接口的make -j4 

是不很简单?那么我们会很高兴的在编写app的时候自由的使用我们刚刚添加的属性了,当然如果你是需要在eclipse里编译你的app,那么需要根据你所更改的系统重新编译sdk文件导入到eclipse中,这样你app的Androidmanifest文件里的android:myTestProp才能被识别。

 <application        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme"  android:myTestProp="test">        <activity            android:name=".MainActivity"            android:label="@string/title_activity_main" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>    </application>

当你高高兴兴的发现编译过的app在系统中运行的时候,发现没有读到你在manifest文件中android:myTestProp的值,是不是感到很疑惑?其实不用疑惑。仔细想想变可知道原因。Android系统在安装应用的时候,首先都是通过PackageManagerService(其实是PackageParser)解析Androidmanifest.xml文件来获取所需要的信息的,以后根据获取的信息再通过ActivityManagerService等来管理和运行。所以我们在上面缺失了一个重要的步骤:就是解析、读取新添加属性的值

4. 系统解析manifest文件的对应的代码在:/源码/framework/base/core/java/android/content/pm/PackageParser.java

private boolean parseApplication(Package owner, Resources res,            XmlPullParser parser, AttributeSet attrs, int flags, String[] outError)        throws XmlPullParserException, IOException {        final ApplicationInfo ai = owner.applicationInfo;        final String pkgName = owner.applicationInfo.packageName;...// 此处就是将manifest文件中的属性值给解析出来,便于后边系统使用// com.android.internal.R.styleable.AndroidManifestApplication_myTestProp 这个代表myTestProp所对应的资源idai.myTestProp = sa.getString(com.android.internal.R.styleable.AndroidManifestApplication_myTestProp);}


 好了,再次make -j4后就可以正常使用了。


原创粉丝点击