本blog记录了把自己编译的软件当做系统的app随着android的编译而加入到系统。

主要还是编写Android.mk 的问题,还有资源存放问题,这点系统编译比sdk编译要严格。

##关于资源

有些人喜欢在xml里面写硬编码,例如android:text="hello world",这些在系统编译的时候一定会报错的,为了养成良好的习惯,方便以后做国际化,字符串应该放到strings.xml里面,而诸如style,color,甚至常用的数字常量都应该放入相应的文件夹。

虽然能够编译了,可能还会发生资源找不到的错误。大多是因为图片资源乱放的原因,例如 drawable drawable-ldpi drawable-mdpi drawable-hdpi 这几个常用的文件夹,android的图片加载策略是先看屏幕密度究竟是ldpi还是mdpi,又或者是hdpi,然后在该文件夹下找图片资源,找不到的话,再到drawable里面找图片资源,再找不到的话就报错,它不会遍历所有文件夹来寻找图片的,这就要求我们图片要方正确了,要兼容好的话最好每个文件夹都放上对应分辨率的图片。

##Android.mk

系统编译脚本可以参考其他的系统应用程序,例如Setting。其中有一个注意的地方是如果引用了第三方的包,可以使用BUILD_MULTI_PREBUILT来把包引进编译流程,下面就是一个例子,其中还有aidl的参考编译方法。

还有一点就是如果需要系统权限,加上LOCAL_CERTIFICATE := platform

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

LOCAL_MODULE_TAGS := optional

LOCAL_STATIC_JAVA_LIBRARIES := \
        android-common \
        guava \
        android-support-v13 \
        android-support-v4 \
		android-log4jlib \
		jcifslib \

LOCAL_SRC_FILES := \
        $(call all-java-files-under, src) 

LOCAL_PACKAGE_NAME := package-test 

#LOCAL_PROGUARD_FLAG_FILES := proguard.flags

LOCAL_CERTIFICATE := platform

include $(BUILD_PACKAGE)

include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := android-log4jlib:libs/android-logging-log4j-1.0.3.jar \
	jcifslib:libs/jcifs-krb5-1.3.17.jar \
	
include $(BUILD_MULTI_PREBUILT)

include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := src/com/xx/xx.aidl
LOCAL_MODULE := com.xx.aidl
include $(BUILD_STATIC_JAVA_LIBRARY)

##最后

不要忘记在build/target/product/core.mk,文件里添加你的应用名称,这样才能在编译后自动安装到system/app目录下