Android Framework 源码之旅 —— 系统应用

前言

之前用Android Studio开发了各式各样的APP,但那基本都是应用层应用,即便是通过设置android:sharedUserId="android.uid.system"将应用设为系统级应用,也始终有些美中不足,于是就有了本文

正文

aosp的源码根目录packages里面收录了设备出厂自带的各系统级应用
Android Framework 源码之旅 —— 系统应用_第1张图片
这里,新建一个dev文件夹作为外部开发的系统级应用项目存放目录,接下来就是开发一个APP,方便起见,直接拷贝一份之前弄好的安卓项目到dev目录下
Android Framework 源码之旅 —— 系统应用_第2张图片
Android Framework 源码之旅 —— 系统应用_第3张图片
准备工作差不多了,结果发现编译单独模块一直报错,随后猜测,可能是我用的是最新版源码的原因,于是重新下载编译了一个稳定版本源码,终于好了

稳定起见,还是要准备一份固定的稳定版本源代码

在使用单独模块编译命令前,先要执行source build/envsetup.sh脚本文件,这样一来,才能够使用mmm命令

除非特殊说明,后面的所有终端命令都是在aosp根目录下执行
mmm命令就是用来进行模块编译的

Android Framework 源码之旅 —— 系统应用_第4张图片
显然,编译模块需要在编译的工程根目录下创建一个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开发的项目,通常将minSdkVersiontargetSdkVersion放在了build.gradle中,以防万一,还是在AndroidManifest.xml文件中加上,如

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	......

    
        android:minSdkVersion="24"
        android:targetSdkVersion="28" />

	......
manifest>

Android Framework 源码之旅 —— 系统应用_第5张图片
好一番功夫,总算编译成功了,在Android.mk文件中折腾了半天
Android Framework 源码之旅 —— 系统应用_第6张图片
这里有个问题,就是,我编译的模拟器是基于x86_64
Android Framework 源码之旅 —— 系统应用_第7张图片
于是重新为x86_64重新编译
Android Framework 源码之旅 —— 系统应用_第8张图片
Android Framework 源码之旅 —— 系统应用_第9张图片
Android Framework 源码之旅 —— 系统应用_第10张图片
Android Framework 源码之旅 —— 系统应用_第11张图片
Android Framework 源码之旅 —— 系统应用_第12张图片
Android Framework 源码之旅 —— 系统应用_第13张图片
启动模拟器来见证奇迹的时刻
Android Framework 源码之旅 —— 系统应用_第14张图片
然而,并没有想象中的应用图标,原来,是没有更新system.img,而更新system.img需要用到make snod命令
Android Framework 源码之旅 —— 系统应用_第15张图片
Android Framework 源码之旅 —— 系统应用_第16张图片

新增模块编译到真机上

Android Framework 源码之旅 —— 系统应用_第17张图片
不出意外的话,这样就成功了,但是,发现手机系统没有应用图标,还需要重启手机一次,或者直接使用adb reboot命令

你可能感兴趣的:(Android,Framework)