如何为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) 0304 LOCAL_MODULE_TAGS := optional 0506 LOCAL_PACKAGE_NAME := letv-framework-res 07 LOCAL_CERTIFICATE := platform 0809 # Set LOCAL_USE_LETV_FRAMEWORK_RES as false 10 LOCAL_USE_LETV_FRAMEWORK_RES := false 1112 # Tell aapt to create "extending (non-application)" resource IDs, 13 # since these resources will be used by many apps. 14 LOCAL_AAPT_FLAGS := -x 1516 # Install this alongside the libraries. 17 LOCAL_MODULE_PATH := $(TARGET_OUT_JAVA_LIBRARIES) 1819 # 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 2223 # 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 2728 include $(BUILD_PACKAGE) 2930 # Make sure the system .rs files get compiled before building the package-export.apk. 31 #$(resource_export_package): $(framework_RenderScript_STAMP_FILE) 3233 # 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"> 0506 <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"> 1314 </application> 1516 </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" > 1011<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" /> 1718 </LinearLayout>转载,仅供参考。

按照以下步骤来吧。

1、手机连接电脑,如果是Win7的话,应该可以识别。有的手机为了安全,会把和电脑USB连接的时候设置成只充电,这里需要你自己手动更改一下,如图,点击轻敲获取其他USB选项。

然后点击媒体设备。然后电脑就可以读取手机的存储了。

如果有SD卡的手机的话,应该有一个选项“大容量存储”连接

2、在手机SD或者是内部存储新建一个文件夹,可以叫Music或者是音乐。如果已有,这步略去。

3、从电脑上复制你想听的音乐到刚才你新建的或者已经存在的music文件夹里。

4、这个时候,如果你断开手机和电脑的连接,就是拔出USB线,手机自带的播放器是可以自动搜索到音乐文件的。这个是手机自带的音乐播放器全自动做的,会自己扫描媒体库。

5、如果你是用的“网易云音乐”等播放软件,则需要细心点,如下图

5.1、打开“网易云音乐”

5.2、点击音乐,然后点击本地音乐

接下来点击右上角的三个点。。设置

虽然选择扫描歌曲

按照自己的想法去扫描,比如说过滤歌曲的长度等等。懒的话就按照我截图这样去弄。

扫描后就可以了。返回或者是继续设置。

点击过滤设置。可以过滤有媒体的文件夹,就是说你不希望app扫描的文件夹,如图。

意思就是说,如果你只希望app扫描你第二步新建的文件夹的话,你只留下你自己建立的文件夹不勾,其他的全部勾选。这样app就专门扫描你的文件夹了。

其他的音乐播放app,都差不多一样的流程。

1)利用系统定义的id

比如我们有一个定义ListView的xml文件,一般的,我们会写类似下面的代码片段。

<ListView

android:id="@+id/mylist"

android:layout_width="fill_parent"

android:layout_height="fill_parent"/>

这里我们定义了一个ListView,定义它的id是"@+id/mylist"。实际上,如果没有特别的需求,就可以利用系统定义的id,类似下面的样子。

<ListView

android:id="@android:id/list"

android:layout_width="fill_parent"

android:layout_height="fill_parent"/>

在xml文件中引用系统的id,只需要加上“@android:”前缀即可。如果是在Java代码中使用系统资源,和使用自己的资源基本上是一样的。不同的是,需要使用android.R类来使用系统的资源,而不是使用应用程序指定的R类。这里如果要获取ListView可以使用android.R.id.list来获取。

2)利用系统的图片资源

假设我们在应用程序中定义了一个menu,xml文件如下。

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

<menu xmlns:android="http://schemas.android.com/apk/res/android">

<item

android:id="@+id/menu_attachment"

android:title="附件"

android:icon="@android:drawable/ic_menu_attachment" />

</menu>

其中代码片段android:icon="@android:drawable/ic_menu_attachment"本来是想引用系统中已有的Menu里的“附件”的图标。但是在Build工程以后,发现出现了错误。提示信息如下:

error: Error: Resource is not public. (at 'icon' with value '@android:drawable/ic_menu_attachment').

从错误的提示信息大概可以看出,由于该资源没有被公开,所以无法在我们的应用中直接引用。既然这样的话,我们就可以在Android SDK中找到相应的图片资源,直接拷贝到我们的工程目录中,然后使用类似android:icon="@drawable/ic_menu_attachment"的代码片段进行引用。

这样做的好处,一个是美工不需要重复的做一份已有的图片了,可以节约不少工时;另一个是能保证我们的应用程序的风格与系统一致。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存