- 浏览: 214987 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (196)
- android (153)
- sqlite (1)
- java (3)
- os (4)
- tools (4)
- ResolveInfo 转 packageinf 取信息 (1)
- multimedia (2)
- fastboot (1)
- create user in samba (0)
- android qcn (0)
- windows (0)
- net (2)
- linux (1)
- git (0)
- proguard (0)
- android cpu (1)
- android gts (1)
- MySql (1)
- c/c++ (0)
- network (1)
- python (3)
- AI (1)
- Ultroedit (1)
- HarmonyOS NEXT (0)
传统的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="http://schemas.android.com/apk/res/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="http://schemas.android.com/apk/res/letv"
然后像@android:drawable @android:dimen这种引用方式改成@letv:drawable @letv:dimen即可。
view sourceprint?
01 <?xml version="1.0" encoding="utf-8"?>
02 <LinearLayout
03 xmlns:android="http://schemas.android.com/apk/res/android"
04 xmlns:letv="http://schemas.android.com/apk/res/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. 修改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="http://schemas.android.com/apk/res/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="http://schemas.android.com/apk/res/letv"
然后像@android:drawable @android:dimen这种引用方式改成@letv:drawable @letv:dimen即可。
view sourceprint?
01 <?xml version="1.0" encoding="utf-8"?>
02 <LinearLayout
03 xmlns:android="http://schemas.android.com/apk/res/android"
04 xmlns:letv="http://schemas.android.com/apk/res/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>
发表评论
-
Android SnappyDB
2018-05-15 11:23 965https://blog.csdn.net/qq_214305 ... -
使用UncaughtExceptionHandler保存全局异常(转)
2018-05-07 15:04 644From: https://blog.csdn.net/dre ... -
android udp
2018-04-10 19:47 605Android之Socket的基于UDP传输 接收方创建步骤: ... -
android DownloadManager
2018-04-10 12:52 597From: https://www.jianshu.com/p ... -
Snackbar 可以交互的Toast
2018-04-08 21:44 765Snackbar 是 Android design sup ... -
android 操作串口
2018-03-19 18:20 661http://blog.csdn.net/akunainian ... -
proguard对 android-support-v4.jar 的配置
2018-03-16 15:32 725-libraryjars libs/android-sup ... -
apk 多个dex
2018-03-16 10:05 1008android studio 配置应用生成多个dex ... -
ddmlib 解决android n file explorer 为空问题
2018-03-16 09:27 939百度云:http://pan.baidu.com/s/1sl4 ... -
android 代码混淆
2018-03-15 08:38 1056打开混淆开关 Android.mk ... -
menu item 显示icon
2018-03-07 09:32 686@Override public boolean onMenu ... -
ubuntu 脚本切换root用户,并执行其它脚本
2018-03-05 09:58 0#!/bin/bash expect -c" ... -
DrawerLayout 滑动侧边栏
2018-03-01 10:42 0// TODO -
jack-server 多用户编译问题
2018-02-27 10:44 14043),需要同时修改 $HOME/.jack-server/co ... -
更新eclipse 遇到两个问题 Oxygen.2 Release (4.7.2)
2018-02-26 14:28 12311. the file dx.jar was not load ... -
监听系统开关变化
2018-02-05 14:02 814// 转屏开关 /** * Content obse ... -
android 8.0 模块编译命令
2018-02-02 14:42 1172Invoke ". build/envsetup.s ... -
svn checkout 忽略某个文件夹
2018-01-26 11:14 1367android源码更新时, frameworks\compil ... -
eclipse jni
2018-01-19 16:10 494试过,可以运行 http://blog.csdn.net/sb ... -
opencv for android
2018-01-19 14:37 440http://blog.csdn.net/sbsujjbcy/ ...
相关推荐
### 如何在Android系统中添加波斯语及新增一种系统未自带的语言 #### 背景介绍 在Android开发过程中,经常会遇到需要增加系统未预置的语言支持的需求。例如,客户可能要求支持波斯语(Farsi),而该语言在某些...
本文档“Android 增加一个分区配置指南 V1.00_rk系统新增分区_android_”详细介绍了如何在Rockchip(rk)平台上为Android系统添加新的分区。以下是对该指南的主要内容的概述: 1. **理解Android分区体系结构** - *...
本文将深入探讨安卓Android系统日历日程的操作,基于提供的"安卓Android源码——安卓Android系统日历日程操作.rar"资源,我们将分析如何在Android应用程序中实现对日历的增删改查功能。 首先,Android提供了`...
### Android添加多国语言支持详解 #### 背景与目的 随着全球化进程加快,越来越多的应用需要支持多种语言,以满足不同国家和...通过以上步骤,开发者可以顺利地为Android系统添加多国语言支持,提升应用的国际竞争力。
2. **HAL层接口**:硬件抽象层(HAL)是Android系统架构中的一个重要组成部分,它提供了与硬件交互的接口。为以太网添加HAL组件,使得上层系统服务能调用以太网功能。 3. **系统服务集成**:Android的网络管理服务...
优博讯是一家知名的移动智能终端制造商,其提供的Android SDK(软件开发工具包)是开发者针对优博讯设备进行应用程序开发的重要资源。此SDK版本为V3,包含了详细的API(应用程序编程接口)文档,旨在帮助开发者更...
标题提到的“Android-一个方便为Android View添加自然的阴影的库”显然是一个专门用于帮助开发者更轻松地在Android应用中实现阴影效果的第三方库。这个库名为“zhengcx-ShadowHelper”,其主要功能是提供一种简洁、...
下面我们将详细探讨如何为这两个版本的Android系统添加负一屏功能。 首先,我们需要了解`Launcher3`。`Launcher3`是Android默认的主屏幕应用,负责管理桌面图标、小部件和应用抽屉。要添加负一屏功能,我们需要对`...
Android系统采用多媒体框架(Media Framework)处理音频和视频数据,它包括一系列组件,如MediaCodec、MediaExtractor、MediaMuxer等,用于编码、解码、混音和封装媒体数据。 2. **MediaCodec** MediaCodec是...
在本文中,我们将深入探讨如何基于Android Studio开发一个安卓通讯录系统。Android Studio是Google官方推出的集成开发环境(IDE),专为Android应用开发设计,它提供了丰富的工具和资源,使得开发者能够高效地构建高...
总的来说,"Android6.0 Settings添加以太网选项"是一个涉及Android系统深度定制的过程,需要对Android的框架和组件有深入的理解。通过这个过程,不仅可以学习到Android系统的结构和组件工作原理,还可以提升在系统...
在Android开发中,动态添加图片是一项...`multiimagechooser-master`项目是一个很好的学习资源,通过阅读源码,开发者可以更好地理解这一过程。同时,不断实践和优化,可以提高用户体验,降低内存消耗,提升应用性能。
记得为新资源分配一个唯一的ID,并指定适当的类型和名称。 **资源ID的管理** 在Android中,每个资源都有一个唯一的ID,由`0x01040000`这样的十六进制数字表示。ID的分配通常遵循一定的顺序,以避免冲突。在添加新...
这个压缩包“安卓Android源码——安卓Android系统访问串口设备源码.zip”包含了实现这一功能的源代码,可以帮助开发者深入理解如何在Android平台上操作串行端口。 串口通信是一种古老的通信方式,但因其简单可靠,...
这份"安卓Android源码——安卓Android系统访问串口设备源码.rar"压缩包提供了相关的源代码和资料,帮助开发者理解和实现这一功能。 首先,我们需要了解的是Android系统对串口的支持。在Linux内核的基础上构建的...
ADB(Android Debug Bridge)是Android开发中的一个关键工具,它是一个命令行实用程序,允许开发者通过USB或网络连接与Android设备进行通信。在32位Windows XP系统上使用ADB尤为重要,因为这个系统版本已经较为老旧...
如果你想要为图标添加背景框,可以创建一个新的XML文件,如`icon_background.xml`,放在`res/drawable`目录下。在这个XML文件中,你可以定义一个矩形或带有圆角的矩形作为背景框。例如: ```xml <shape xmlns:...
自Android Oreo (8.0)开始,所有通知必须在一个名为`NotificationChannel`的通道中发送。你需要为你的应用定义一个渠道ID,然后创建并注册这个频道。例如: ```java int importance = NotificationManager....
在Android开发过程中,有时我们需要为同一个项目生成多个不同的APK,比如针对不同的市场或客户,可能需要使用不同的签名、包名以及资源。Android Studio作为官方推荐的集成开发环境,提供了强大的构建系统,允许...
Android是一个开放的平台,自2007年底由谷歌主持的开放手机联盟大会上提出,旨在成为一个能在多种硬件设备上运行的手机开发平台。Android的特点在于其开放性、免费的SDK以及由Apache许可证版本2授权的项目,允许...