Android 添加framework资源包

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

概述

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

实现

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

1)修改build/core/clear_var.mk,添加一项:

1
LOCAL_USE_XOS_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)

123456789
ifeq ($(LOCAL_USE_XOS_FRAMEWORK_RES),true)xos_framework_res_package_export :=         $(call intermediates-dir-for,APPS,xos-framework-res,,COMMON)/package-export.apkxos_framework_res_package_export_deps :=         $(dir $(xos_framework_res_package_export))src/R.stampelsexos_framework_res_package_export :=xos_framework_res_package_export_deps :=endif 
12345
$(R_file_stamp): $(framework_res_package_export_deps) $(xos_framework_res_package_export_deps)$(LOCAL_INTERMEDIATE_TARGETS):     PRIVATE_AAPT_INCLUDES := $(framework_res_package_export)     	$(xos_framework_res_package_export)endif # LOCAL_NO_STANDARD_LIBRARIES

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

PRODUCT_PACKAGES增加xos-framework-res

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

记得设置 LOCAL_USE_MY_FRAMEWORK_RES为false。

Android.mk

1234567891011121314151617181920212223242526272829303132333435
LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_PACKAGE_NAME := xos-framework-resLOCAL_CERTIFICATE := platform

# Set LOCAL_USE_XOS_FRAMEWORK_RES as falseLOCAL_USE_XOS_FRAMEWORK_RES := false

# Tell aapt to create "extending (non-application)" resource IDs,# since these resources will be used by many apps.LOCAL_AAPT_FLAGS := -x

# Install this alongside the libraries.LOCAL_MODULE_PATH := $(TARGET_OUT_JAVA_LIBRARIES)

# Create package-export.apk, which other packages can use to get# PRODUCT-agnostic resource data like IDs and type definitions.LOCAL_EXPORT_PACKAGE_RESOURCES := true

# Include resources generated by system RenderScript files.framework_GENERATED_SOURCE_DIR := $(call intermediates-dir-for,JAVA_LIBRARIES,framework,,COMMON)/srcframework_RenderScript_STAMP_FILE := $(framework_GENERATED_SOURCE_DIR)/RenderScript.stamp#LOCAL_RESOURCE_DIR := $(framework_GENERATED_SOURCE_DIR)/renderscript/res $(LOCAL_PATH)/res

include $(BUILD_PACKAGE)

# Make sure the system .rs files get compiled before building the package-export.apk.#$(resource_export_package): $(framework_RenderScript_STAMP_FILE)

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

xos-framework-res-package-target: $(LOCAL_BUILT_MODULE)

AndroidManifest.xml

123456789101112131415161718
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.c 大专栏  Android 添加framework资源包om/apk/res/android"    package="systems.xos.car.xsdk"     coreApp="true"     android:sharedUserId="android.uid.system"    android:sharedUserLabel="@null">

    <application android:process="system"                 android:persistent="true"                 android:hasCode="false"                 android:label="@null"                 android:allowClearUserData="false"                 android:killAfterRestore="false"                 android:icon="@null">

    </application>

</manifest>

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

12345678
<resources> <public type="attr" name="cForeground" id="0x03010000" /> <public type="drawable" name="ic_filemanager" id="0x03020000" /> <public type="style" name="xosTheme" id="0x03030000" /> <public type="string" name="xos" id="0x03040000" /> <public type="dimen" name="xos_width" id="0x03050000" /> <public type="layout" name="xos_text" id="0x03060000" /></resources>

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

123456789101112
public () {        synchronized (this) {            if (DEBUG_REFS) {                mNumRefs = 0;                incRefsLocked(this.hashCode());            }            init();            addAssetPath("/system/framework/xos-framework-res.apk");            if (localLOGV) Log.v(TAG, "New asset manager: " + this);            ensureSystemAssets();        }    }

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

xmlns:xos="http://schemas.android.com/apk/res/systems.xos.car.xsdk"
然后像@android:drawable @android:dimen这种引用方式改成@xos:drawable @xos:dimen即可。

123456789101112131415161718
<?xml version="1.0" encoding="utf-8"?><LinearLayout    xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:xos="http://schemas.android.com/apk/res/systems.xos.car.xsdk"    android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:gravity="center"    android:paddingTop="@xos:dimen/xos_width"    android:orientation="horizontal" >

   <ImageView android:id="@+id/file_icon"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_gravity="center"            android:layout_marginBottom="40dp"            android:src="@xos:drawable/ic_filemanager" />

</LinearLayout>

XSDK 使用xos-res资源方式

Android.mk中引用资源路径:

123
framework_res_source_path := APPS/xos-framework-res_intermediates/srcLOCAL_INTERMEDIATE_SOURCES := 	$(framework_res_source_path)/systems/xos/car/xsdk/R.java

实际代码中使用:

123456
import systems.xos.car.xsdk.R;

...inflater.inflate(R.layout.menu_view, this, true);

跟在普通的Android项目中使用资源一样调用。

原文地址:https://www.cnblogs.com/lijianming180/p/12268179.html

时间: 2024-11-08 07:30:10

Android 添加framework资源包的相关文章

android编译framework架包运行报错 (转)

android编译framework架包运行报错 http://blog.csdn.net/cqupt_chen/article/details/8163632 最近在看frameworks里的源码,手痒了,便想改改看看效果,没想到改完后,模拟器却运行不起来了.        首先声明,我是用的android 4.0.3 ICS的源码,编译好后,利用编译好的镜像启动的模拟器,以前修改过里面的Launcher,将生成的Launcher.apk和Launcher.odex  push后是成功的.现在

关于资源包存储资源路径名的方案

资源包中一般不会直接存储资源文件的路径名,而是对路径名做Hash,存储其Hash-id(为了避免Hash冲突,最好做两次Hash,用两个Hash唯一标记一个资源文件). 这样不但查询速度更快,而且避免了资源文件路径名变长造成的文件记录结构(Entry)长度不统一的问题. 不过如果有存储资源文件路径名的需求的话,其实也可以另辟蹊径,实现记录资源文件路径名,而且不会影响资源包文件条目(Entry)记录结构. 具体做法: 取hash-id为0的作为系统占用id,此hash-id用于存储一个系统文件Sy

关于如何正确地在android项目中添加第三方jar包

1.下载第三方jar包 2.在android项目下创建一个libs目录(名称并不固定,你完全可以取其他名称) 3.在eclipse中右键点击libs目录,依次选择Import -> General -> File System,选中jar包所在目录, 然后选中这个目录下的jar包 注:到这一步为止你就成功地把jar包添加到项目中(但是还没有被android的虚拟机识别,因此如果这时你使用jar包中的类,编译都无法通过) 4.右键点击项目名,依次选择Build Path -> Config

Android studio 添加第三方jar包遇到的编译不通过问题

经常会出现 Error:Execution failed for task ':app:transformClassesWithDexForDebug'. > com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'C:\Progr

如何制作Jar包并在android中调用jar包

android制作jar包: 新建android工程,然后右击,点击导出,选择导出类型为Java下的JAR file,在java file specification 中不要选择androidmanifest.xml和res文件夹,就可以了.否则在调用jar包的时候会出现“Error generating final archive: Found duplicate file for APK: AndroidManifes”这个错误. 如果在android用调用jar包,需要在工程的属性的Jav

Android应用程序资源的查找过程分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8806798 我们知道,在Android系统中,每一个应用程序一般都会配置很多资源,用来适配不同密度.大小和方向的屏幕,以及适配不同的国家.地区和语言等等.这 些资源是在应用程序运行时自动根据设备的当前配置信息进行适配的.这也就是说,给定一个相同的资源ID,在不同的设备配置之下,查找到的可能是不同的资 源.这个资源查找过程对应用程序来说,是完全透

Cocos2dx引擎优化(2) ---自定义资源包系统

把游戏中的资源文件(纹理,模型,材质,音乐,配置xml,json,脚本)打包有很多好处,也成为MMO开发的基本常识.对资源进行打包可以带来以下好处: . 增加游戏资源和脚本破解的难度.大多游戏制作公司都不希望自己花高昂代价制作的资料被人全盘爬过去使用,更不忍受逻辑脚本完全暴露在同行的面前. . 自定义的资源包比访问散文件资源有更快的查找和读取速度,消耗更少的系统资源,如文件句柄. . 自定义资源包可以提供更简单可用的文件存取API.加解密和压缩方案. . 一般来说,打包的资源也会比散文件形式的资

讯飞离线语音合成(离线资源包)

讯飞离线语音合成(离线资源包) 讯飞的语音合成有三种方式 在线语音合成(免费) 离线使用语记语音合成(免费,需要本地装一个语记App并且下载离线资源) 使用讯飞离线语音包(付费) 这里使用离线资源包实现离线语音合成,因为正式版是要付费的,所以这里使用试用的离线包(35天试用期.3个装机量). 效果图 源码 下载地址(Android Studio工程):http://download.csdn.net/detail/q4878802/9063779 开通服务,下载SDK 之前已经介绍过,地址:ht

Android应用程序资源的编译和打包过程分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8744683 我们知道,在一个APK文件中,除了有代码文件之外,还有很多资源文件.这些资源文件是通过Android资源打包工具aapt(Android Asset Package Tool)打包到APK文件里面的.在打包之前,大部分文本格式的XML资源文件还会被编译成二进制格式的XML资源文件.在本文中,我们就详细分析 XML资源文件的编译和打包