如何为Android系统添加一个新的资源包

如何为Android系统添加一个新的资源包,第1张

如何为Android系统添加一个新的资源

传统的Android系统只有一个framework-res.apk资源包,第三方厂商在进行rom定制时会直接修改framework res资源,达到美化目的。但是这种方式跟原生资源的耦合度过高,在系统迁移或者framework ui移植时需要进行人工merge,工作量巨大。通过为Android添加一个新的独立的资源包,可以将厂商定制资源独立出来,可移植、可维护性非常好。

具体做法可以分为以下几个步骤:

1. 修改build/core/clear_var.mk

LOCAL_USE_LETV_FRAMEWORK_RES:= true

2. 修改build/core/package.mk

以下脚本可以加在 $(R_file_stamp): $(framework_res_package_export_deps) 之前,然后修改$(R_file_stamp): $(framework_res_package_export_deps) 和 $(LOCAL_INTERMEDIATE_TARGETS): \

PRIVATE_AAPT_INCLUDES := $(framework_res_package_export)

如下所示:

view sourceprint?

1 ifeq ($(LOCAL_USE_LETV_FRAMEWORK_RES),true)

2 letv_framework_res_package_export := \

3 $(call intermediates-dir-for,APPS,letv-framework-res,,COMMON)/package-export.apk

4 letv_framework_res_package_export_deps := \

5 $(dir $(letv_framework_res_package_export))src/R.stamp

6 else

7 letv_framework_res_package_export :=

8 letv_framework_res_package_export_deps :=

9 endif # LOCAL_USE_LETV_FRAMEWORK_RES

view sourceprint?

1 $(R_file_stamp): $(framework_res_package_export_deps) $(letv_framework_res_package_export_deps)

2 $(LOCAL_INTERMEDIATE_TARGETS): \

3 PRIVATE_AAPT_INCLUDES := $(framework_res_package_export) \

4 $(letv_framework_res_package_export)

5 endif # LOCAL_NO_STANDARD_LIBRARIES

3. 修改build/target/product/core.mk

在PRODUCT_PACKAGES增加letv-framework-res

4. 添加一个新的资源包项目,袜激这里在framework/base/core/res同级目录下建立一个新的文件夹letv_res用来存放我们的资源。把res目配好带录下的AndroidManifest.xml和Android.mk拷贝过来,进行修改。

记得设培芦置LOCAL_USE_MY_FRAMEWORK_RES为false。

view sourceprint?

01 LOCAL_PATH:= $(call my-dir)

02 include $(CLEAR_VARS)

03

04 LOCAL_MODULE_TAGS := optional

05

06 LOCAL_PACKAGE_NAME := letv-framework-res

07 LOCAL_CERTIFICATE := platform

08

09 # Set LOCAL_USE_LETV_FRAMEWORK_RES as false

10 LOCAL_USE_LETV_FRAMEWORK_RES := false

11

12 # Tell aapt to create "extending (non-application)" resource IDs,

13 # since these resources will be used by many apps.

14 LOCAL_AAPT_FLAGS := -x

15

16 # Install this alongside the libraries.

17 LOCAL_MODULE_PATH := $(TARGET_OUT_JAVA_LIBRARIES)

18

19 # Create package-export.apk, which other packages can use to get

20 # PRODUCT-agnostic resource data like IDs and type definitions.

21 LOCAL_EXPORT_PACKAGE_RESOURCES := true

22

23 # Include resources generated by system RenderScript files.

24 framework_GENERATED_SOURCE_DIR := $(call intermediates-dir-for,JAVA_LIBRARIES,framework,,COMMON)/src

25 framework_RenderScript_STAMP_FILE := $(framework_GENERATED_SOURCE_DIR)/RenderScript.stamp

26 #LOCAL_RESOURCE_DIR := $(framework_GENERATED_SOURCE_DIR)/renderscript/res $(LOCAL_PATH)/res

27

28 include $(BUILD_PACKAGE)

29

30 # Make sure the system .rs files get compiled before building the package-export.apk.

31 #$(resource_export_package): $(framework_RenderScript_STAMP_FILE)

32

33 # define a global intermediate target that other module may depend on.

34 .PHONY: letv-framework-res-package-target

35 letv-framework-res-package-target: $(LOCAL_BUILT_MODULE)

view sourceprint?

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

02 <manifest xmlns:android=""

03 package="letv" coreApp="true" android:sharedUserId="android.uid.system"

04 android:sharedUserLabel="@null">

05

06 <application android:process="system"

07 android:persistent="true"

08 android:hasCode="false"

09 android:label="@null"

10 android:allowClearUserData="false"

11 android:killAfterRestore="false"

12 android:icon="@null">

13

14 </application>

15

16 </manifest>

资源的放置跟res下的类似,记得values目录下创建public.xml,public.xml对id的类型区分比较严格,attr必须是0x0x010000开头,drawable必须是0x0x020000开头,其他类型好像就没有限制,直接依次0x0x030000、0x0x040000开始即可。否则,编译过程中会出现segmentation fault错误。

view sourceprint?

1 <resources>

2 <public type="attr" name="cForeground" id="0x03010000" />

3 <public type="drawable" name="ic_filemanager" id="0x03020000" />

4 <public type="style" name="LetvTheme" id="0x03030000" />

5 <public type="string" name="letv" id="0x03040000" />

6 <public type="dimen" name="letv_width" id="0x03050000" />

7 <public type="layout" name="letv_text" id="0x03060000" />

8 </resources>

5. 以上只是解决了资源的编译环境问题,资源的查找过程也需要进行修改,修改 AssetManager.java,在init()后添加代码 addAssetPath("/system/framework/letv-framework-res.apk")

view sourceprint?

01 public AssetManager() {

02 synchronized (this) {

03 if (DEBUG_REFS) {

04 mNumRefs = 0

05 incRefsLocked(this.hashCode())

06 }

07 init()

08 addAssetPath("/system/framework/letv-framework-res.apk")

09 if (localLOGV) Log.v(TAG, "New asset manager: " + this)

10 ensureSystemAssets()

11 }

12 }

6. 最后就是资源应用问题。应用程序在xml文件中引用letv-framework-res.apk中的资源时可以使用与原生资源类似的访问方式,首先声明letv xmlns :

view sourceprint?

1 xmlns:letv=""

然后像@android:drawable @android:dimen这种引用方式改成@letv:drawable @letv:dimen即可。

view sourceprint?

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

02 <LinearLayout

03 xmlns:android=""

04 xmlns:letv=""

05 android:layout_width="fill_parent"

06 android:layout_height="wrap_content"

07 android:gravity="center"

08 android:paddingTop="@letv:dimen/letv_width"

09 android:orientation="horizontal" >

10

11<ImageView android:id="@+id/file_icon"

12 android:layout_width="wrap_content"

13 android:layout_height="wrap_content"

14 android:layout_gravity="center"

15 android:layout_marginBottom="40dp"

16 android:src="@letv:drawable/ic_filemanager" />

17

18 </LinearLayout>

转载,仅供参考。

1.在代码中使用资源文件在代码中访问资源文件,是通过R类中定义的资源文件类型和资源文件名称来访问的。具体格式为:R.资源文件类型.资源文件名称另外,除了访问用户自定义的资源文件,还可以访问系统中的资源文件。访问系统中的资源文件的格式为:android.R. 资源文件类型.资源文件名称2.在其他资源文件中引用资源文件经常会在布局文件中引用图片、颜色资源、字符串资源和尺寸资源。在其他资源中引用资源的一般格式是:@[包名称:]资源类型/资源名称使用颜色资源颜色值定义的开始时一个#号,后面是Alpha-RGB的格式。例如:#RGB#ARGB#RRGGBB#AARRGGBB引用资源格式:Java代码中:R.color.color_nameXML文件中:@[package:]color/color_name使用时在res\values\目录下,定义一个colors.xml文件,里面存放颜色名字和颜色值的键值对。如:<resources> <color name="red_bg">#f00</color> <color name="blue_text">#0000ff</color></resources>其他资源如字符串、尺寸都是类似的方法。使用字符串资源创建字符串资源文件strings.xml.里面内容也是键值对在Java代码中引用字符串资源R.string.string_name可如下取得:String str = getString(R.string.string_name).toString()在xml文件中引用字符串资源:@[package:]string/string_name使用尺寸资源尺寸资源被定义在res\values\dimens.xml文件中。相对屏幕物理密度的抽象单位

sp和精度无关的像素和dp类似,与刻度无关的像素,主要处理字体大小引用尺寸资源:在Java代码中: R.dimen.dimen_name在xml文件中:@[package:]dimen/dimen_name使用原始XML资源XML文件定义在工程的res\xml\目录下,通过Resources.getXML()方法来访问。获得原始XML文件的思路是,通过getResources().getXml()获得XML原始文件,得到XmlResourceParser对象,通过该对象来判断是文档的开始还是结尾、是某个标签的开始还是结尾,并通过一些获谨烂得属性的方法来遍历XML文件,从而访问XML文件的内容。使用drawables资源drawable资源是一些图片或者颜色资源,主要用来绘制屏幕,通过Resources.getDrawable()方法获得。drawable资源分为三类:Bitmap File(位图文件)、Color Drawable(颜色)、Nine-Patch Image(九片图片)。Android中支持的位图文件有png、jpg和gif。 中做 引用位图资源的格式:Java代码中:R.drawable.file_nameXML文件中:@[package:]drawable/file_name使用布局(layout)资源  布局资源是Android中最祥培漏常用的一种资源,将屏幕中组件的布局方式定义在一个XML文件中,类似于Web中的HTML页面。  布局文件位于res\layout\中,名称任意。Android通过LayoutInflater类将XML文件中的组件解析为可视化的视图组件。在Activity中,调用Activity.setContentView()方法,将布局文件设置为Activity的界面,使用findViewById()方法来得到布局中的组件。

Android SDK在编译应用时会在R类中为/res/目录下的所有资源创建索引项,因此在java代码中访罩磨问资源主要是通过R类来完成。

语法格式为:

package_name.R.resource_type.resource_name

package_name:指定R类所在的包,实际上就是使用全限定类名。不过,要是在java程序中已导入闭饥R类所在包,可以省略包名。

resource_type:R类中代表不同资源类型的子类,例如string代表字符串资源。

resource_name:指定资源的物态斗名称。

//从drawable资源中加载图片,并设为该窗口的背景

getWindow().setBackgroundDrawableResource(R.drawable.back)

//从string资源中获取指定字符串源码,并设置该窗口的标题

getWindow().setTitle(getResources().getText(R.string.main_title))


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11985030.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存