移动端 Android系统源码集成第三方APP并编译到system.img中

zjturing · February 13, 2020 · 163 hits

预制 APP 到 Android 系统,成为系统默认 APPS。

概论

将第三方厂商定制的 APP 编译进系统源码,随着 system.img 的烧录进设备。定制的 APP 分为以下几种形式添加到系统中:

  • 带源码
  • apk 文件
  • apk 文件依赖 so 库

带源码的 APP 编译到系统

1) 在 packages/apps/ 下创建一个新的项目,以 HelloWorld 为例;
2)参照 apps 下的其他项目目录结构,创建 src、res 以及编写 Android.mk 文件;
3)将你的资源文件以及源码 copy 到对应位置;
4)编写 Android.mk 文件;

Android.mk 是 Android 提供的一种 makefile 文件,用来指定诸如编译生成 so 库名、引用的头文件目录、需要编译的.c/.cpp 文件和.a 静态库文件等。之后会有另外篇章对 Android.mk 进行详解,在此就不多做解释。

给出一个简单的 Android.mk 示例,参照自行修改成适合项目的。

1
2
3
4
5
6
7
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := HelloWorld
LOCAL_JAVA_LIBRARIES := telephony-common
include $(BUILD_PACKAGE)

无源码的 APK 文件编译到系统

1) 在 packages/apps/ 下创建一个新的项目,以 HelloWorld 为例;
2)将 apk 文件 copy 到新建目录下,并创建 android.mk 文件;
3)编写 Android.mk 文件。
示例如下:

1
2
3
4
5
6
7
8
9
10
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := HelloWorld
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
include $(BUILD_PREBUILT)

这里有一点需要注意的,LOCAL_MODULE的值必须与 apk 的名字一致。

app 需要依赖第三方 so 库

有一种情况是定制的 app 需要依赖于第三方 jar 包文件或者 so 库进行开发,这次主要介绍 so 库的使用,jar 包另行查找。

  • app 有源码编译

新建 libs 目录,将 so 库 copy 到该目录,下面主要工作是更新 android.mk 文件,将 so 库包含进去,以 libBMapApiEngine_v1_3_1.so 为例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := HelloWorld
LOCAL_JAVA_LIBRARIES := telephony-common
include $(BUILD_PACKAGE)
##################################################
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES :=libbaidumapapi:libs/baidumapapi.jar
LOCAL_PREBUILT_LIBS :=libBMapApiEngine_v1_3_1:libs/armeabi/libBMapApiEngine_v1_3_1.so
LOCAL_MODULE_TAGS := optional
include $(BUILD_MULTI_PREBUILT)

# Use the following include to make our testapk.
include $(callall-makefiles-under,$(LOCAL_PATH))

以上方案为网上http://zwz94.blog.163.com/blog/static/3206039520131111101412959/查找资料总结的,还没经过实际测试,可行性不能 100% 保证。

  • 纯 apk 文件

因 apk 依赖于 so 库运行,编译过程没问题,但运行 app 会由于系统本身缺少对应 so 库而奔溃。

主要步骤同上,关键需要将 so 库文件复制到系统的/system/lib 目录下,使之能被 app 索引到。示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := HelloWorld
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
include $(BUILD_PREBUILT)
##########
include $(CLEAR_VARS)
LOCAL_MODULE := libgdamapv4sdk751.so
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)
LOCAL_SRC_FILES := lib/armeabi/$(LOCAL_MODULE)
OVERRIDE_BUILD_MODULE_PATH := $(TARGET_OUT_INTERMEDIATE_LIBRARIES)
include $(BUILD_PREBUILT)

纯 apk 文件编译进系统,且依赖 so 库。复制 so 库到/system/lib 目录的方案经过本人实际编译测试可行。

另外再说几句

  • 有些客户对定制 app 在系统中的位置有要求,比如需要放置到/system/priv-app/中,此时你只需在 android.mk 中添加一句:LOCAL_PRIVILEGED_MODULE := true即可将 app 编译进 priv-app 目录。
  • 还有要求预制 app 替代 Android 系统默认的 app,也很简单,同样是编辑 Android.mk 文件,以 SystemUI 为例,添加一句:LOCAL_OVERRIDES_PACKAGES:= SystemUI

写在最后

将定制 APP 加入 Android 源码的 build 系统中,使之能跟随着其他 app 一起编译。

修改 build/target/product/generic_no_telephony.mk
新建项
PRODUCT_PACKAGES := HelloWorld

注意:PRODUCT_PACKAGES中填写的必须跟项目中 Android.mk 文件中定义的LOCAL_PACKAGE_NAME或者LOCAL_MODULE一致。

以上全部完成后就可以对系统进行编译了。

make clean
make -j$(nproc)

No Reply at the moment.
You need to Sign in before reply, if you don't have an account, please Sign up first.