为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)

1
2
3
4
5
6
7
8
9
ifeq ($(LOCAL_USE_XOS_FRAMEWORK_RES),true)
xos_framework_res_package_export :=
$(call intermediates-dir-for,APPS,xos-framework-res,,COMMON)/package-export.apk
xos_framework_res_package_export_deps :=
$(dir $(xos_framework_res_package_export))src/R.stamp
else
xos_framework_res_package_export :=
xos_framework_res_package_export_deps :=
endif
1
2
3
4
5
$(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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_PACKAGE_NAME := xos-framework-res
LOCAL_CERTIFICATE := platform # Set LOCAL_USE_XOS_FRAMEWORK_RES as false
LOCAL_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)/src
framework_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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?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错误。

1
2
3
4
5
6
7
8
<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");

1
2
3
4
5
6
7
8
9
10
11
12
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即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?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中引用资源路径:

1
2
3
framework_res_source_path := APPS/xos-framework-res_intermediates/src
LOCAL_INTERMEDIATE_SOURCES :=
$(framework_res_source_path)/systems/xos/car/xsdk/R.java

实际代码中使用:

1
2
3
4
5
6
import systems.xos.car.xsdk.R;

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

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

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

  1. python中添加requests资源包

    1.进入资源网址下载:https://www.lfd.uci.edu/~gohlke/pythonlibs/ 2.按下CTRL+F进行页面查找“requests” 3.点击requests-2.22. ...

  2. Android 添加第三方jar包

    1,拷贝jar包到项目的\app\libs文件夹下. 2,打开项目下的build.gradle(Module:app)文件,在“dependencies {}”中添加“compile files('l ...

  3. Android Studio引用自定义的framework.jar包

    1.在app/libs/目录下添加framework.jar包. 2.打开build->Edit Libraries and Dependencies,把libs/framework.jar放到 ...

  4. iOS 中 .a 和 .framework 静态库的创建与 .bundle 资源包的使用

    iOS 中 .a 和 .framework 静态库的创建与 .bundle 资源包的使用 前言 开发中经常使用三方库去实现某特定功能,而这些三方库通常又分为开源库和闭源库.开源库可以直接拿到源码,和自 ...

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

    在android项目中添加第三方jar包虽然不是一个很复杂的问题,但是确实给很多开发者带来了不小的困扰.我自己就曾经碰到过calss not found exception.error inflati ...

  6. 在Android Studio添加本地aar包引用

    1.如何在Android Studio添加本地aar包引用 https://jingyan.baidu.com/article/2a13832890d08f074a134ff0.html 2.完成上述 ...

  7. Android源码分析(二)-----如何编译修改后的framework资源文件

    一 : 编译framework资源文件 如果修改android framework资源文件,需要先编译资源文件,然后再编译framework才可以正常引用, 进入项目目录 cd work/source ...

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

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8806798 我们知道,在Android系统中, ...

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

    android制作jar包: 新建android工程,然后右击,点击导出,选择导出类型为Java下的JAR file,在java file specification 中不要选择androidmani ...

随机推荐

  1. 把cifar数据转换为图片

    参考 https://gist.github.com/fzliu/64821d31816bce595a4bbd98588b37f5 """ make_cifar10.py ...

  2. bat脚本修改dns(判断系统版本)

    @echo off systeminfo if "%OS 名称%"=="%7%" goto windows7:windows7echo 正在设置本机主DNS , ...

  3. Softether使用本地网桥

    https://maytalkhao.com/archives/826 以下步骤都是按照上面这篇文章来的,具体细节如下 一.使用Softether  VPN Server Manager软件添加本地网 ...

  4. SwaggerConfig

    package me.zhengjie.common.swagger2; import com.google.common.base.Predicates; import org.springfram ...

  5. 浅谈PHP小马免杀

    在渗透测试过程初期,上传小马,拿到 webshell 再进行下一步的操作,现如今的网站安全更多是 一些云防护.CDN防护.服务器安全软件等等,给渗透测试.提权等带来了一定难度的提升, 今天探讨一下如何 ...

  6. Docker系列六: 使用Docker官方公共仓库和私有仓库

    使用公共仓库 登陆官方网站:https://hub.docker.com/   注册账号和密码 在Docker hub中创建一个资源,  create  respositories,   创建后会提示 ...

  7. scala编程(七)——内建控制结构

    几乎所有的 Scala 的控制结构都会产生某个值.这是函数式语言所采用的方式,程序被看成是计算值的活动,因此程序的控件也应当这么做.另外,指令式语言经常具有三元操作符(如 C,C++和 Java 的? ...

  8. 001.前端开发知识,前端基础HTML(2020-01-07)

    一.开发工具: chrome . sublime . photoshop 二.Web标准:不是某一个标准,而是由W3C和其他标准化组织制定的一系列标准的集合. 三.HTML的语言语法骨架格式 < ...

  9. mysql之存储过程(一)

    今天开发一个需求,需要在一个旧表中增加一列并且对已经的表中记录初始化新列的值, 由于是一次性的工作,故写了个存储过程来代替代码程序初始化 创建及执行过程记录如下: MySQL [XXX_YYY]> ...

  10. hessian学习笔记

    一.hessian是什么 Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能. 相比WebService,Hessian更简单.快捷.采用的是二进制RPC ...