Android内置应用到系统的方法总结 1
1. 前言 2
1.1系统安装应用位置分别为: 2
2.带有源码的第三方应用内置到系统 2
2.1 AndroidStudio工程 3
2.2 Eclipse工程 6
2.3项目中so库文件的处理方法 9
3. APK文件内置到系统 10
目前Android集成第三方应用到系统可以分为两大类:带有源码和不带有源码。两种继承方式的最大区别是在于Android makefile的编写。所以下面将详细的介绍内置第三方应用到系统的方法。
/system/framework 用于存放资源型应用(系统框架)。
/system/app 用于存放系统应用,不能卸载。
/system/priv-app Android4.4+新增,系统【核心】应用存放路径。 /vendor/app 用于存放厂商应用,可以卸载,恢复出厂时恢复。
/data/app 用于存放用户应用,可以卸载,恢复出厂不能恢复。 /data/app-private Android4.4+新增,受DRM保护的应用存放路径。
APP 需要内置到不同的路径下可以在LOCAL_MODULE_PATH :=属性后加入你所需要安装的路径。
无论源码是Eclipse工程项目还是Androidstudio项目,两大工程最大的不同就是代码结构。使用系统的编译方式编译都需要编写系统编译的规则。
2.1.1 代码目录结构(AutoTimeZone)
2.1.2 Android makefile的编写(不可卸载应用)
从上面可看出这个mk和其他的mk的最大区别在于他指定了java文件的路径,资源文件和AndroidManifest的路径。其他的都和普通的Android makefile类似。以下是Android makefile。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) (经典开头两句)
LOCAL_PACKAGE_NAME := xxx(apk的名字)
LOCAL_CERTIFICATE := platform (系统签名)
LOCAL_MANIFEST_FILE := app/src/main/AndroidManifest.xml (指定AndroidManifest的路径)
LOCAL_RESOURCE_DIR += $(LOCAL_PATH)/app/src/main/res \ (指定资源的路径)
frameworks/support/v7/appcompat/res
LOCAL_SRC_FILES := $(call all-java-files-under,app/src/main/java)(指定java文件路径)
LOCAL_PREGUARD_ENABLED :=disabled(取消打包时的混淆)
LOCAL_MODULE_PATH :=$(TARGET_OUT_DATA_APPS) (app安装的路径)
LOCAL_STATIC_JAVA_LIBRARIES += libBaiduLBS_Android \ (使用的jar包声明)
libMyApi \
android-support-v7-appcompat \
android-support-v4 \
LOCAL_AAPT_FLAGS := \
--auto-add-overlay \
--extra-packages android.support.v7.appcompat
include $(BUILD_PACKAGE)
include $(CLEAR_VARS) (使用的jar包路径声明)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \
libBaiduLBS_Android:app/libs/BaiduLBS_Android.jar \
libMyApi:app/libs/myApi.jar
include $(BUILD_MULTI_PREBUILT)
# Use the following include to make our test apk.
include $(call all-makefiles-under,$(LOCAL_PATH))
注:如应用不是系统应用 则可以把LOCAL_CERTIFICATE选项去除,但是应用安装的目录还是在/system/app/下。
2.1.3 增加新的模块
(1)base.mk文件路径在/devices/qcom/common/下。
在base.mk中的PREODUCT_PACKAGE 选项后加入RokidTimeZone。
PRODUCT_PACKAGE+=RokidTimeZone
(2)如果该应用有已使用的so库文件,需要copy so库文件到该应用的安装文件夹下的lib中。
msmxxx.mk文件在devices/qcom/msmxxx/文件夹下。
加入:
PRODUCT_COPY_FILES+= vendor/ts/AutoTimeZone/app/libs/arm64-v8a/liblocSDK7b.so:system/lib64/liblocSDK7b.so
PRODUCT_COPY_FILES+= vendor/ts/AutoTimeZone/app/libs/armeabi/liblocSDK7b.so:system/lib/liblocSDK7b.so(AutotimeZone使用的so库文件)
2.2.1代码目录结构(Calculator)
2.2.2 Android makefile的编写
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_STATIC_JAVA_LIBRARIES := libarity android-support-v4 guava (声明工程使用的jar包)
LOCAL_SRC_FILES := $(call all-java-files-under, src) (指定java文件路径)
LOCAL_SDK_VERSION := current
LOCAL_PACKAGE_NAME := Calculator (声明应用名称)
include $(BUILD_PACKAGE)
##################################################
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := libarity:arity-2.1.2.jar (预编译libarity)
include $(BUILD_MULTI_PREBUILT)
# Use the following include to make our test apk.
include $(call all-makefiles-under,$(LOCAL_PATH))
2.2.3 增加新模块
(1)在devices/qcom/common/base.mk中的 PRODUCT_PACKAGE中加入新的模块
(2)如在项目中使用到so库文件则可以参考2.1.3节中的内容,对so文件进行copy即可。
内置到不同的位置就有不同的处理方法以下详细介绍。
2.3.1 应用内置到/system/app或/system/pri-app
对于安装到system/app system/pri-app 可以在devices/qcom/msmxxx/msmxx.mk中编写PRODUCT_COPY_FILES命令把so库文件拷贝至system/lib或system/lib64下。
2.3.2 应用内置到/vendor/app
对于安装到vendor/app 中的应用也可以参考2.3.1节中的方法把so库文件拷贝到system/vendor/lib或system/vendor/lib64文件夹中。
2.3.2 应用内置到/data/app
对于安装到/data/app中的应用,就不能使用上述的方法进行so库文件的copy.
在system/core/rootdir/init.rc中添加开机启动服务。
service flash_recovery /system/bin/install-recovery.sh
class main
oneshot
#!/bin/bash
if [-d "/data/app-lib/liblocSDK7b.so"];then
copy /system/lib64/liblocSDK7b.so /data/app-lib/liblocSDK7b.so
fi
(3)内置文件
使用PRODUCT_COPY_FILES 把执行的脚本install-recovery.sh
拷贝到system/bin/目录下。
使用PRODUCT_COPY_FILES 把so库文件拷贝至system/lib64下
单独的APK文件内置到系统里,可以参照高通应用内置的方法进行内置。
LOCAL_MODULE_PATH :=$(你需要安装的位置)如:
$(TARGET_OUT_DATA_APPS)
$(TARGET_OUT)/app
$(TARGET_OUT)/vendor/app
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := TimeZone (指定应用名称)
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_PREBUILT_JNI_LIBS := \
@lib/armeabi/liblocSDK7b.so (app中带有的so文件)
$(warning "$(COMMON_ANDROID_PACKAGE_SUFFIX)")
LOCAL_DEX_PREOPT := false
LOCAL_MODULE_PATH :=$(TARGET_OUT_DATA_APPS) (app安装的路径)
LOCAL_CERTIFICATE := PRESIGNED(因编辑器编译成apk已经打上的签名,则不需再去签名)
LOCAL_PRIVILEGED_MODULE := false
include $(BUILD_PREBUILT)
因IDE工具编译打包的时候也会把SO库文件一起打包到APK文件中,所以我们不需要额外的去copy文件。
NOTICE:最后记得在mk中的PRODUCT_PACKAGE中加入新模块的名称。