前言
之前用Android Studio
开发了各式各样的APP,但那基本都是应用层应用,即便是通过设置android:sharedUserId="android.uid.system"
将应用设为系统级应用,也始终有些美中不足,于是就有了本文
正文
aosp
的源码根目录packages
里面收录了设备出厂自带的各系统级应用
这里,新建一个dev
文件夹作为外部开发的系统级应用项目存放目录,接下来就是开发一个APP,方便起见,直接拷贝一份之前弄好的安卓项目到dev
目录下
准备工作差不多了,结果发现编译单独模块一直报错,随后猜测,可能是我用的是最新版源码的原因,于是重新下载编译了一个稳定版本源码,终于好了
稳定起见,还是要准备一份固定的稳定版本源代码
在使用单独模块编译命令前,先要执行source build/envsetup.sh
脚本文件,这样一来,才能够使用mmm
命令
除非特殊说明,后面的所有终端命令都是在
aosp
根目录下执行mmm
命令就是用来进行模块编译的
显然,编译模块需要在编译的工程根目录下创建一个Android.mk
文件
LOCAL_PATH := $(call my-dir)
aosp_dir := ./../../../
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
# 编译的java文件路径
LOCAL_SRC_FILES := $(call all-java-files-under, apps/ndkcamera2/src/main/java)
# 需要编译的AndroidManifest.xml文件
LOCAL_MANIFEST_FILE := apps/ndkcamera2/src/main/AndroidManifest.xml
# 需要编译的资源文件路径
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/apps/ndkcamera2/src/main/res
# 需要编译出的apk名称
LOCAL_PACKAGE_NAME := ndkCamera2
# apk签名
LOCAL_CERTIFICATE := platform
LOCAL_PRIVATE_PLATFORM_APIS := true
# 依赖库,aar
LOCAL_STATIC_JAVA_AAR_LIBRARIES := \
constraint
LOCAL_STATIC_JAVA_LIBRARIES := \
android-support-v7-appcompat \
android-support-v4 \
solver
LOCAL_RESOURCE_DIR += \
prebuilts/sdk/current/support/v7/appcompat/res
# aapt,重复资源自动覆盖,每个包含res的依赖库,都必须在这里添加
LOCAL_AAPT_FLAGS := \
--auto-add-overlay \
--extra-packages android.support.v7.appcompat \
--extra-packages constraint
# 混淆文件
LOCAL_PROGUARD_FLAG_FILES := apps/ndkcamera2/proguard-rules.pro
# 不进行混淆,如果要混淆的话,将disabled换成full
LOCAL_PROGUARD_ENABLED := disabled
include $(BUILD_PACKAGE)
include $(CLEAR_VARS)
# 这里的constraint可以随意命名
LOCAL_PREBUILT_STATIC_JAVA_AAR_LIBRARIES := constraint:$(aosp_dir)/prebuilts/sdk/current/extras/constraint-layout/constraintlayout/constraint-layout-1.1.0-beta1.aar
include $(BUILD_MULTI_PREBUILT)
include $(CLEAR_VARS)
# 这里的solver可以随意命名
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := solver:$(aosp_dir)/prebuilts/sdk/current/extras/constraint-layout/solver/constraint-layout-solver-1.1.0-beta1.jar
include $(BUILD_MULTI_PREBUILT)
使用Android Studio
开发的项目,通常将minSdkVersion
和targetSdkVersion
放在了build.gradle
中,以防万一,还是在AndroidManifest.xml
文件中加上,如
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
......
<uses-sdk
android:minSdkVersion="24"
android:targetSdkVersion="28" />
......
</manifest>
好一番功夫,总算编译成功了,在Android.mk
文件中折腾了半天
这里有个问题,就是,我编译的模拟器是基于x86_64
的
于是重新为x86_64
重新编译
启动模拟器来见证奇迹的时刻
然而,并没有想象中的应用图标,原来,是没有更新system.img
,而更新system.img
需要用到make snod
命令
新增模块编译到真机上
不出意外的话,这样就成功了,但是,发现手机系统没有应用图标,还需要重启手机一次,或者直接使用adb reboot
命令