如何为Android系统添加一个新的资源包
\u5982\u4f55\u4e3aAndroid\u7cfb\u7edf\u6dfb\u52a0\u4e00\u4e2a\u65b0\u7684\u8d44\u6e90\u5305\u5982\u4f55\u4e3aAndroid\u7cfb\u7edf\u6dfb\u52a0\u4e00\u4e2a\u65b0\u7684\u8d44\u6e90\u5305
\u4f20\u7edf\u7684Android\u7cfb\u7edf\u53ea\u6709\u4e00\u4e2aframework-res.apk\u8d44\u6e90\u5305\uff0c\u7b2c\u4e09\u65b9\u5382\u5546\u5728\u8fdb\u884crom\u5b9a\u5236\u65f6\u4f1a\u76f4\u63a5\u4fee\u6539framework res\u8d44\u6e90\uff0c\u8fbe\u5230\u7f8e\u5316\u76ee\u7684\u3002\u4f46\u662f\u8fd9\u79cd\u65b9\u5f0f\u8ddf\u539f\u751f\u8d44\u6e90\u7684\u8026\u5408\u5ea6\u8fc7\u9ad8\uff0c\u5728\u7cfb\u7edf\u8fc1\u79fb\u6216\u8005framework ui\u79fb\u690d\u65f6\u9700\u8981\u8fdb\u884c\u4eba\u5de5merge\uff0c\u5de5\u4f5c\u91cf\u5de8\u5927\u3002\u901a\u8fc7\u4e3aAndroid\u6dfb\u52a0\u4e00\u4e2a\u65b0\u7684\u72ec\u7acb\u7684\u8d44\u6e90\u5305\uff0c\u53ef\u4ee5\u5c06\u5382\u5546\u5b9a\u5236\u8d44\u6e90\u72ec\u7acb\u51fa\u6765\uff0c\u53ef\u79fb\u690d\u3001\u53ef\u7ef4\u62a4\u6027\u975e\u5e38\u597d\u3002
\u5177\u4f53\u505a\u6cd5\u53ef\u4ee5\u5206\u4e3a\u4ee5\u4e0b\u51e0\u4e2a\u6b65\u9aa4\uff1a
1. \u4fee\u6539build/core/clear_var.mk
LOCAL_USE_LETV_FRAMEWORK_RES:= true
2. \u4fee\u6539build/core/package.mk
\u4ee5\u4e0b\u811a\u672c\u53ef\u4ee5\u52a0\u5728 $(R_file_stamp): $(framework_res_package_export_deps) \u4e4b\u524d\uff0c\u7136\u540e\u4fee\u6539$(R_file_stamp): $(framework_res_package_export_deps) \u548c $(LOCAL_INTERMEDIATE_TARGETS): \
PRIVATE_AAPT_INCLUDES := $(framework_res_package_export)
\u5982\u4e0b\u6240\u793a\uff1a
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. \u4fee\u6539build/target/product/core.mk
\u5728PRODUCT_PACKAGES\u589e\u52a0letv-framework-res
4. \u6dfb\u52a0\u4e00\u4e2a\u65b0\u7684\u8d44\u6e90\u5305\u9879\u76ee\uff0c\u8fd9\u91cc\u5728framework/base/core/res\u540c\u7ea7\u76ee\u5f55\u4e0b\u5efa\u7acb\u4e00\u4e2a\u65b0\u7684\u6587\u4ef6\u5939letv_res\u7528\u6765\u5b58\u653e\u6211\u4eec\u7684\u8d44\u6e90\u3002\u628ares\u76ee\u5f55\u4e0b\u7684AndroidManifest.xml\u548cAndroid.mk\u62f7\u8d1d\u8fc7\u6765\uff0c\u8fdb\u884c\u4fee\u6539\u3002
\u8bb0\u5f97\u8bbe\u7f6eLOCAL_USE_MY_FRAMEWORK_RES\u4e3afalse\u3002
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
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
15
16
\u8d44\u6e90\u7684\u653e\u7f6e\u8ddfres\u4e0b\u7684\u7c7b\u4f3c\uff0c\u8bb0\u5f97values\u76ee\u5f55\u4e0b\u521b\u5efapublic.xml\uff0cpublic.xml\u5bf9id\u7684\u7c7b\u578b\u533a\u5206\u6bd4\u8f83\u4e25\u683c\uff0cattr\u5fc5\u987b\u662f0x0x010000\u5f00\u5934\uff0cdrawable\u5fc5\u987b\u662f0x0x020000\u5f00\u5934\uff0c\u5176\u4ed6\u7c7b\u578b\u597d\u50cf\u5c31\u6ca1\u6709\u9650\u5236\uff0c\u76f4\u63a5\u4f9d\u6b210x0x030000\u30010x0x040000\u5f00\u59cb\u5373\u53ef\u3002\u5426\u5219\uff0c\u7f16\u8bd1\u8fc7\u7a0b\u4e2d\u4f1a\u51fa\u73b0segmentation fault\u9519\u8bef\u3002
view sourceprint?
1
2
3
4
5
6
7
8
5. \u4ee5\u4e0a\u53ea\u662f\u89e3\u51b3\u4e86\u8d44\u6e90\u7684\u7f16\u8bd1\u73af\u5883\u95ee\u9898\uff0c\u8d44\u6e90\u7684\u67e5\u627e\u8fc7\u7a0b\u4e5f\u9700\u8981\u8fdb\u884c\u4fee\u6539\uff0c\u4fee\u6539 AssetManager.java\uff0c\u5728init()\u540e\u6dfb\u52a0\u4ee3\u7801 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. \u6700\u540e\u5c31\u662f\u8d44\u6e90\u5e94\u7528\u95ee\u9898\u3002\u5e94\u7528\u7a0b\u5e8f\u5728xml\u6587\u4ef6\u4e2d\u5f15\u7528letv-framework-res.apk\u4e2d\u7684\u8d44\u6e90\u65f6\u53ef\u4ee5\u4f7f\u7528\u4e0e\u539f\u751f\u8d44\u6e90\u7c7b\u4f3c\u7684\u8bbf\u95ee\u65b9\u5f0f\uff0c\u9996\u5148\u58f0\u660eletv xmlns :
view sourceprint?
1 xmlns:letv=""
\u7136\u540e\u50cf@android:drawable @android:dimen\u8fd9\u79cd\u5f15\u7528\u65b9\u5f0f\u6539\u6210@letv:drawable @letv:dimen\u5373\u53ef\u3002
view sourceprint?
01
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
\u8f6c\u8f7d\uff0c\u4ec5\u4f9b\u53c2\u8003\u3002
\u3000\u3000\u5982\u4f55\u4e3aAndroid\u7cfb\u7edf\u6dfb\u52a0\u4e00\u4e2a\u65b0\u7684\u8d44\u6e90\u5305
\u3000\u3000\u4f20\u7edf\u7684Android\u7cfb\u7edf\u53ea\u6709\u4e00\u4e2aframework-res.apk\u8d44\u6e90\u5305\uff0c\u7b2c\u4e09\u65b9\u5382\u5546\u5728\u8fdb\u884crom\u5b9a\u5236\u65f6\u4f1a\u76f4\u63a5\u4fee\u6539framework res\u8d44\u6e90\uff0c\u8fbe\u5230\u7f8e\u5316\u76ee\u7684\u3002\u4f46\u662f\u8fd9\u79cd\u65b9\u5f0f\u8ddf\u539f\u751f\u8d44\u6e90\u7684\u8026\u5408\u5ea6\u8fc7\u9ad8\uff0c\u5728\u7cfb\u7edf\u8fc1\u79fb\u6216\u8005framework ui\u79fb\u690d\u65f6\u9700\u8981\u8fdb\u884c\u4eba\u5de5merge\uff0c\u5de5\u4f5c\u91cf\u5de8\u5927\u3002\u901a\u8fc7\u4e3aAndroid\u6dfb\u52a0\u4e00\u4e2a\u65b0\u7684\u72ec\u7acb\u7684\u8d44\u6e90\u5305\uff0c\u53ef\u4ee5\u5c06\u5382\u5546\u5b9a\u5236\u8d44\u6e90\u72ec\u7acb\u51fa\u6765\uff0c\u53ef\u79fb\u690d\u3001\u53ef\u7ef4\u62a4\u6027\u975e\u5e38\u597d\u3002
\u3000\u3000\u5177\u4f53\u505a\u6cd5\u53ef\u4ee5\u5206\u4e3a\u4ee5\u4e0b\u51e0\u4e2a\u6b65\u9aa4\uff1a
\u3000\u30001. \u4fee\u6539build/core/clear_var.mk
\u3000\u3000LOCAL_USE_LETV_FRAMEWORK_RES:= true
\u3000\u30002. \u4fee\u6539build/core/package.mk
\u3000\u3000\u4ee5\u4e0b\u811a\u672c\u53ef\u4ee5\u52a0\u5728 $(R_file_stamp): $(framework_res_package_export_deps) \u4e4b\u524d\uff0c\u7136\u540e\u4fee\u6539$(R_file_stamp): $(framework_res_package_export_deps) \u548c $(LOCAL_INTERMEDIATE_TARGETS): \
\u3000\u3000PRIVATE_AAPT_INCLUDES := $(framework_res_package_export)
\u3000\u3000\u5982\u4e0b\u6240\u793a\uff1a
\u3000\u3000view sourceprint?
\u3000\u30001 ifeq ($(LOCAL_USE_LETV_FRAMEWORK_RES),true)
\u3000\u30002 letv_framework_res_package_export := \
\u3000\u30003 $(call intermediates-dir-for,APPS,letv-framework-res,,COMMON)/package-export.apk
\u3000\u30004 letv_framework_res_package_export_deps := \
\u3000\u30005 $(dir $(letv_framework_res_package_export))src/R.stamp
\u3000\u30006 else
\u3000\u30007 letv_framework_res_package_export :=
\u3000\u30008 letv_framework_res_package_export_deps :=
\u3000\u30009 endif # LOCAL_USE_LETV_FRAMEWORK_RES
\u3000\u3000view sourceprint?
\u3000\u30001 $(R_file_stamp): $(framework_res_package_export_deps) $(letv_framework_res_package_export_deps)
\u3000\u30002 $(LOCAL_INTERMEDIATE_TARGETS): \
\u3000\u30003 PRIVATE_AAPT_INCLUDES := $(framework_res_package_export) \
\u3000\u30004 $(letv_framework_res_package_export)
\u3000\u30005 endif # LOCAL_NO_STANDARD_LIBRARIES
\u3000\u30003. \u4fee\u6539build/target/product/core.mk
\u3000\u3000\u5728PRODUCT_PACKAGES\u589e\u52a0letv-framework-res
\u3000\u30004. \u6dfb\u52a0\u4e00\u4e2a\u65b0\u7684\u8d44\u6e90\u5305\u9879\u76ee\uff0c\u8fd9\u91cc\u5728framework/base/core/res\u540c\u7ea7\u76ee\u5f55\u4e0b\u5efa\u7acb\u4e00\u4e2a\u65b0\u7684\u6587\u4ef6\u5939letv_res\u7528\u6765\u5b58\u653e\u6211\u4eec\u7684\u8d44\u6e90\u3002\u628ares\u76ee\u5f55\u4e0b\u7684AndroidManifest.xml\u548cAndroid.mk\u62f7\u8d1d\u8fc7\u6765\uff0c\u8fdb\u884c\u4fee\u6539\u3002
\u3000\u3000\u8bb0\u5f97\u8bbe\u7f6eLOCAL_USE_MY_FRAMEWORK_RES\u4e3afalse\u3002
\u3000\u3000view sourceprint?
\u3000\u300001 LOCAL_PATH:= $(call my-dir)
\u3000\u300002 include $(CLEAR_VARS)
\u3000\u300003
\u3000\u300004 LOCAL_MODULE_TAGS := optional
\u3000\u300005
\u3000\u300006 LOCAL_PACKAGE_NAME := letv-framework-res
\u3000\u300007 LOCAL_CERTIFICATE := platform
\u3000\u300008
\u3000\u300009 # Set LOCAL_USE_LETV_FRAMEWORK_RES as false
\u3000\u300010 LOCAL_USE_LETV_FRAMEWORK_RES := false
\u3000\u300011
\u3000\u300012 # Tell aapt to create "extending (non-application)" resource IDs,
\u3000\u300013 # since these resources will be used by many apps.
\u3000\u300014 LOCAL_AAPT_FLAGS := -x
\u3000\u300015
\u3000\u300016 # Install this alongside the libraries.
\u3000\u300017 LOCAL_MODULE_PATH := $(TARGET_OUT_JAVA_LIBRARIES)
\u3000\u300018
\u3000\u300019 # Create package-export.apk, which other packages can use to get
\u3000\u300020 # PRODUCT-agnostic resource data like IDs and type definitions.
\u3000\u300021 LOCAL_EXPORT_PACKAGE_RESOURCES := true
\u3000\u300022
\u3000\u300023 # Include resources generated by system RenderScript files.
\u3000\u300024 framework_GENERATED_SOURCE_DIR := $(call intermediates-dir-for,JAVA_LIBRARIES,framework,,COMMON)/src
\u3000\u300025 framework_RenderScript_STAMP_FILE := $(framework_GENERATED_SOURCE_DIR)/RenderScript.stamp
\u3000\u300026 #LOCAL_RESOURCE_DIR := $(framework_GENERATED_SOURCE_DIR)/renderscript/res $(LOCAL_PATH)/res
\u3000\u300027
\u3000\u300028 include $(BUILD_PACKAGE)
\u3000\u300029
\u3000\u300030 # Make sure the system .rs files get compiled before building the package-export.apk.
\u3000\u300031 #$(resource_export_package): $(framework_RenderScript_STAMP_FILE)
\u3000\u300032
\u3000\u300033 # define a global intermediate target that other module may depend on.
\u3000\u300034 .PHONY: letv-framework-res-package-target
\u3000\u300035 letv-framework-res-package-target: $(LOCAL_BUILT_MODULE)
\u3000\u3000view sourceprint?
\u3000\u300001
\u3000\u300002 <manifest xmlns:android=""
\u3000\u300003 package="letv" coreApp="true" android:sharedUserId="android.uid.system"
\u3000\u300004 android:sharedUserLabel="@null">
\u3000\u300005
\u3000\u300006 <application android:process="system"
\u3000\u300007 android:persistent="true"
\u3000\u300008 android:hasCode="false"
\u3000\u300009 android:label="@null"
\u3000\u300010 android:allowClearUserData="false"
\u3000\u300011 android:killAfterRestore="false"
\u3000\u300012 android:icon="@null">
\u3000\u300013
\u3000\u300014
\u3000\u300015
\u3000\u300016
\u3000\u3000\u8d44\u6e90\u7684\u653e\u7f6e\u8ddfres\u4e0b\u7684\u7c7b\u4f3c\uff0c\u8bb0\u5f97values\u76ee\u5f55\u4e0b\u521b\u5efapublic.xml\uff0cpublic.xml\u5bf9id\u7684\u7c7b\u578b\u533a\u5206\u6bd4\u8f83\u4e25\u683c\uff0cattr\u5fc5\u987b\u662f0x0x010000\u5f00\u5934\uff0cdrawable\u5fc5\u987b\u662f0x0x020000\u5f00\u5934\uff0c\u5176\u4ed6\u7c7b\u578b\u597d\u50cf\u5c31\u6ca1\u6709\u9650\u5236\uff0c\u76f4\u63a5\u4f9d\u6b210x0x030000\u30010x0x040000\u5f00\u59cb\u5373\u53ef\u3002\u5426\u5219\uff0c\u7f16\u8bd1\u8fc7\u7a0b\u4e2d\u4f1a\u51fa\u73b0segmentation fault\u9519\u8bef\u3002
\u3000\u3000view sourceprint?
\u3000\u30001
\u3000\u30002
\u3000\u30003
\u3000\u30004
\u3000\u30005
\u3000\u30006
\u3000\u30007
\u3000\u30008
\u3000\u30005. \u4ee5\u4e0a\u53ea\u662f\u89e3\u51b3\u4e86\u8d44\u6e90\u7684\u7f16\u8bd1\u73af\u5883\u95ee\u9898\uff0c\u8d44\u6e90\u7684\u67e5\u627e\u8fc7\u7a0b\u4e5f\u9700\u8981\u8fdb\u884c\u4fee\u6539\uff0c\u4fee\u6539 AssetManager.java\uff0c\u5728init()\u540e\u6dfb\u52a0\u4ee3\u7801 addAssetPath("/system/framework/letv-framework-res.apk");
\u3000\u3000view sourceprint?
\u3000\u300001 public AssetManager() {
\u3000\u300002 synchronized (this) {
\u3000\u300003 if (DEBUG_REFS) {
\u3000\u300004 mNumRefs = 0;
\u3000\u300005 incRefsLocked(this.hashCode());
\u3000\u300006 }
\u3000\u300007 init();
\u3000\u300008 addAssetPath("/system/framework/letv-framework-res.apk");
\u3000\u300009 if (localLOGV) Log.v(TAG, "New asset manager: " + this);
\u3000\u300010 ensureSystemAssets();
\u3000\u300011 }
\u3000\u300012 }
\u3000\u30006. \u6700\u540e\u5c31\u662f\u8d44\u6e90\u5e94\u7528\u95ee\u9898\u3002\u5e94\u7528\u7a0b\u5e8f\u5728xml\u6587\u4ef6\u4e2d\u5f15\u7528letv-framework-res.apk\u4e2d\u7684\u8d44\u6e90\u65f6\u53ef\u4ee5\u4f7f\u7528\u4e0e\u539f\u751f\u8d44\u6e90\u7c7b\u4f3c\u7684\u8bbf\u95ee\u65b9\u5f0f\uff0c\u9996\u5148\u58f0\u660eletv xmlns :
\u3000\u3000view sourceprint?
\u3000\u30001 xmlns:letv=""
\u3000\u3000\u7136\u540e\u50cf@android:drawable @android:dimen\u8fd9\u79cd\u5f15\u7528\u65b9\u5f0f\u6539\u6210@letv:drawable @letv:dimen\u5373\u53ef\u3002
\u3000\u3000view sourceprint?
\u3000\u300001
\u3000\u300002 <LinearLayout
\u3000\u300003 xmlns:android=""
\u3000\u300004 xmlns:letv=""
\u3000\u300005 android:layout_width="fill_parent"
\u3000\u300006 android:layout_height="wrap_content"
\u3000\u300007 android:gravity="center"
\u3000\u300008 android:paddingTop="@letv:dimen/letv_width"
\u3000\u300009 android:orientation="horizontal" >
\u3000\u300010
\u3000\u300011 <ImageView android:id="@+id/file_icon"
\u3000\u300012 android:layout_width="wrap_content"
\u3000\u300013 android:layout_height="wrap_content"
\u3000\u300014 android:layout_gravity="center"
\u3000\u300015 android:layout_marginBottom="40dp"
\u3000\u300016 android:src="@letv:drawable/ic_filemanager" />
\u3000\u300017
\u3000\u300018
\u3000\u3000\u8f6c\u8f7d\uff0c\u4ec5\u4f9b\u53c2\u8003\u3002
传统的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>
转载,仅供参考。
直接下载,然后放到项目的libs下面就可以了
绛旓細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): \ ...
绛旓細鍦╮es鐩綍涓嬫柊寤轰竴涓猺aw鐩綍锛岀劧鍚庢妸txt鏂囦欢鏀惧湪璇ョ洰褰曚笅銆傞氳繃 InputStream is = getResources().openRawResource(R.raw.鏂囦欢鍚)锛涜鍙 濡傛湁鐤戦棶鍙拷闂紝婊℃剰璇峰強鏃堕噰绾筹紝璋㈣阿
绛旓細涓銆佸湪frameworks/base/core/java/android/os/ 澧炲姞涓涓猘idl鏂囦欢锛屾渶鍚庣敤aidl宸ュ叿鐢熶骇涓涓狫ava鏂囦欢锛岃繖鏍峰彲浠ユ柟渚垮悗闈細鐒跺悗鍦ㄤ慨鏀/frameworks/base/Android.mk锛屽湪LOCAL_SRC_FILES閲屾坊鍔犱竴琛岋細core/java/android/os/IYtTtsService.aidl \涓嶇‘瀹氳ˉ鍏咃細鎶夾IDL鏂囦欢鍐欏湪杩欎釜鍦版柟浼间箮鍙互閬垮厤鍔燖hide 浜 銆佸湪fr...
绛旓細鍦android涓娣诲姞绯荤粺鏈嶅姟锛屼笅闈互SurfaceComposer杩欎釜service涓轰緥锛屸憼 棣栧厛鎻愪緵鎺ュ彛鏂囦欢ISurfaceComposer.h //frameworks\native\include\gui\ISurfaceComposer.h //棣栧厛鏄帴鍙o紝c++瀹炵幇鏄櫄鍑芥暟 class ISurfaceComposer: public IInterface { public:DECLARE_META_INTERFACE(SurfaceComposer);// flags for setT...
绛旓細浠ello_android涓轰緥锛屾楠ゅ涓嬶細1銆佸湪external鐩綍涓嬪垱寤篽ello_android鐩綍锛岀劧鍚庡湪hello_android鐩綍涓紪鍐檋ello_android C璇█瀹炵幇鏂囦欢hello_android.h锛宧ello_android.c锛氾紙娉細hello_android鐩綍鍙互鏀剧疆鍦Android绯荤粺婧愮爜涓嬬殑浠绘剰鐩綍涓紝骞堕潪涓瀹氳鍦╡xternal涓嬨傦級hello_android.h include<stdio.h> inc...
绛旓細棣栧厛灏嗚嚜瀹氫箟瀛椾綋鏀惧埌鈥渁ssets鈥濅笅闈㈣瀹炰緥鍖栦箣鍚庡啀浣跨敤,濡傛灉浣犵殑DDMS涓殑system/fonts/...涓嬮潰鏈変綘闇瑕佺殑ttf鏂囦欢鐨勮瘽,鍙互鐩存帴浣跨敤涓嬮潰鐨勬柟娉曟潵璋冪敤 鍦ㄧ▼搴忎腑閫氳繃濡備笅鏂瑰紡瀹炰緥鍖栬嚜瀹氫箟瀛椾綋:Java浠g爜 :Typeface.createFromAsset(getContext().getAssets(), "fonts/samplefont.ttf");涓嬮潰鏄Android榛樿瀛椾綋鍜...
绛旓細棣栧厛锛岃鎴戜滑浜嗚В濡備綍閫氳繃U鐩樹负鐢佃剳瀹夎AndroidX86绯荤粺锛氬敖绠″湪鐢佃剳涓婄洿鎺ュ畨瑁呮剰涔変笉澶э紝浣哢鐩樺惎鍔ㄧ殑鏂瑰紡鎻愪緵浜嗕究鎼烘у拰鐏垫椿鎬с傚彧闇涓涓珮閫烾鐩樺拰绠鍗曠殑姝ラ锛屽涓嬭浇UltraISO锛堜笅杞藉湴鍧锛夊埗浣滃惎鍔ㄧ洏锛屼互鍙婇夋嫨鍚堥傜殑Androidx86绯荤粺闀滃儚锛圛SO鏍煎紡锛屼笅杞藉湴鍧锛夈傚畨瑁呰繃绋嬩究鎹凤紝鍙渶灏哢鐩鎻掑叆鐢佃剳锛屼娇鐢║ltraISO...
绛旓細include 骞朵笖鍦 鍑芥暟涓娣诲姞濡備笅 log 杈撳嚭淇℃伅(濡傝摑鑹插瓧浣撴樉绀)锛歴tatus_t MediaRecorder::setCamera(const sp& camera){LOGV("setCamera(%p)", camera.get()); if(mMediaRecorder == NULL) {LOGE("media recorder is not initialized yet"); return INVALID_OPERATION;}if (!(mCurrentState & ...
绛旓細鍦 Android 涓嬶紝/etc 鏄 link 鍒 /system/etc 鐨勶紝鎴戜滑闇瑕佷慨鏀 /system/etc/hosts 鏉ュ疄鐜般備絾鏄繖涓枃浠舵槸鍙锛屼笉鑳介氳繃 shell 鐩存帴淇敼銆傚彲浠ラ氳繃杩炴帴鍒 PC 涓婁娇鐢 adb 鏉ヤ慨鏀广傛楠ゅ涓嬶細1銆佽幏寰梤oot鏉冮檺锛歛db root 2銆佽缃/system涓哄彲璇诲啓锛歛db remount 3銆佸皢hosts鏂囦欢澶嶅埗鍒癙C锛歛db pull ...
绛旓細浣犵敤鐨凴OM琚汉绮剧畝杩囪瑷浜嗐傚彧鑳介噸鍒稲OM銆傚埆鐨勫姙娉曟垜涓嶇煡閬擄紝杩樻湁涓绉嶆儏鍐碉紝浣犺鐜╂煇涓棩鏂囨垨闊╂枃娓告垙锛岃繘娓告垙鍓嶆墜鏈虹殑璇█璁剧疆鏄腑鏂囨垨鏄嫳鏂囷紝杩涘叆鍚庡氨鏄嫳鏂囷紝鎵嬫満鐨勮瑷璁剧疆鐨勬槸鏃ユ垨闊╋紝杩涘叆娓告垙鍚庢父鎴忚瑷灏辨槸鏃ユ垨闊┿傚悗涓绉嶆儏鍐靛彲浠ヤ笅涓涓绯荤粺璇█鍔╂墜銆