Android系统内置应用可以使用更多的API、更高的权限,与开发普通应用最大的差别在于编译,内置应用编译需要用到Android.mk文件。下面是我在开发过程中的一些小记。
1、在AndroidMainfest.xml中添加 android:sharedUserId="android.uid.system" 。通过sharedUserId属性,相同User id的apk配置运行在同一进程中,把程序的User id配置成android.uid.system,也就是让程序运行在系统进程中,这样程序就有权限来读写系统配置。
2、编写Android.mk
ROOT_DIR := $(call my-dir)include $(CLEAR_VARS)ifeq ($(BOARD_HAS_MOTO_2D_SCANNER), true)# include the libararyLIBPATH := $(ROOT_DIR)/libs/armeabiLOCAL_PATH := $(LIBPATH)$(shell cp -rf $(LIBPATH)/* $(TARGET_OUT)/lib/) include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optionalLOCAL_PREBUILT_LIBS := libbarcodereader.so libIAL.so libSDL.soinclude $(BUILD_MULTI_PREBUILT)# the appinclude $(CLEAR_VARS)LOCAL_PATH:= $(ROOT_DIR)LOCAL_PROGUARD_FLAG_FILES := proguard.cfgsLOCAL_MODULE_TAGS := optionalLOCAL_CERTIFICATE := platformLOCAL_DEX_PREOPT := falseLOCAL_PRIVILEGED_MODULE := trueLOCAL_SRC_FILES := $(call all-java-files-under, src)LOCAL_PACKAGE_NAME := CheckCamerainclude $(BUILD_PACKAGE)endif
Android.mk文件放在工程的根目录中。
当你的项目中要是用的.so库时,需要用下面命令将so库拷贝到系统对于的目录中(/vendor/lib或/system/lib)
# include the libararyLIBPATH := $(ROOT_DIR)/libs/armeabiLOCAL_PATH := $(LIBPATH)$(shell cp -rf $(LIBPATH)/* $(TARGET_OUT)/lib/)
LOCAL_CERTIFICATE := platform 配置为apk使用系统签名
LOCAL_DEX_PREOPT := false LOCAL_DEX_PREOPT用于配置编译时是否将apk和odex分离
3、在Android系统源码目录下build\target\product\core.mk文件中添加Package Name: