用Android Studio开发的APP,其源码目录大致如下:


而我们需要的,只有三样:AndroidManifest.xml、com文件夹、res文件夹,
于是对源码目录树精简化,将app/src/main下的res和AndroidManifest.xml粘贴到app目录下,如下:


最后我们只需要复制app目录到系统源码目录package/apps下即可,这里我将app改名为HpSetting:


到此为此,从Android Studio开发的App源码移植到了系统源码目录当中,并对其目录进行了简化操作。
在ByeTest目录下新建Android.mk,在@拉大锯的视频了解Android.mk文件结构解释了Android.mk文件中相关属性及结构,这里不再赘述,直接开始写
#初步*
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_PACKAGE_NAME := HpSetting
LOCAL_PRIVATE_PLATFORM_APIS := true
LOCAL_MODULE_TAGS := optional
LOCAL_PROGUARD_ENABLED := disabled
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
include $(BUILD_PACKAGE)
到此为止,Android.mk文件初步编写完成。
接下来,我们需将目光放到源码的依赖上,将依赖添加到Android.mk中。

将依赖变更为mk属性:
LOCAL_STATIC_ANDROID_LIBRARIES := \
androidx.appcompat_appcompat \
com.google.android.material_material \
androidx.recyclerview_recyclerview
添加之后,更新后的Android.mk文件如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_PACKAGE_NAME := HpSetting
LOCAL_PRIVATE_PLATFORM_APIS := true
LOCAL_MODULE_TAGS := optional
LOCAL_PROGUARD_ENABLED := disabled
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
#更新点
LOCAL_STATIC_ANDROID_LIBRARIES := \
androidx.appcompat_appcompat \
com.google.android.material_material \
androidx.recyclerview_recyclerview
include $(BUILD_PACKAGE)
到此为止,Android.mk编写完成(初步)
cd Android9
source build/envsetup.sh
cd packages/apps/HpSetting/
mm #开始单编
根据开发的APP差异,我这边进行编译后,报的会是如下错误:

根据编译日志,可以清晰的看到是themes.xml中的依赖出了问题,Theme.AppCompat.Light.NoActionBar需要的是appcompat-v7依赖,
而appcompat-v7依赖存在于系统源码目录中的framework/support/v7当中,于是我们继续对Android.mk进行补充编写:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_PACKAGE_NAME := HpSetting
LOCAL_PRIVATE_PLATFORM_APIS := true
LOCAL_MODULE_TAGS := optional
LOCAL_PROGUARD_ENABLED := disabled
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_STATIC_ANDROID_LIBRARIES := \
androidx.appcompat_appcompat \
com.google.android.material_material \
androidx.recyclerview_recyclerview
#更新点
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res \
frameworks/support/v7/appcompat/res
#更新点
LOCAL_STATIC_JAVA_LIBRARIES := \
android-common \
android-support-v4 \
android-support-v7-appcompat
include $(BUILD_PACKAGE)
编写完成后,我们继续进行编译:
mm
而后又会出现问题:

根据编译日志,可以清晰的看出是资源文件被覆盖了,
根据提示我们有第一种解决方案,对values目录下的所有文件中的属性添加<add-resource>,举个例子:
<!-- values/dimens.xml -->
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- 更新处 -->
<add-resource name="bg_common_radius" type="dimen" />
<dimen name="bg_common_radius">15dp</dimen>
</resources>
但这种方案的弊端在于,每个属性都要加<add-resource>标签,当属性多了之后,会极其不便。
于是我们有了第二种解决方案,对Android.mk文件进行补充修改
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_PACKAGE_NAME := HpSetting
LOCAL_PRIVATE_PLATFORM_APIS := true
LOCAL_MODULE_TAGS := optional
LOCAL_PROGUARD_ENABLED := disabled
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_STATIC_ANDROID_LIBRARIES := \
androidx.appcompat_appcompat \
com.google.android.material_material \
androidx.recyclerview_recyclerview
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res \
frameworks/support/v7/appcompat/res
LOCAL_STATIC_JAVA_LIBRARIES := \
android-common \
android-support-v4 \
android-support-v7-appcompat
#更新点
LOCAL_AAPT_FLAGS := --auto-add-overlay \
--extra-packages android.support.v7.appcompat
#更新点
LOCAL_USE_AAPT2 := true
include $(BUILD_PACKAGE)
修改补充完成后进行编译,显示编译成功

这里有个问题,起初我在Android5.1的环境下编译,一直没有通过,尽管我已添加了v7依赖;
后续我将上述的
HpSetting文件夹移植(没有修改)到Android9的环境下编译,编译直接通过,具体原因还没查清。
APP已经正常运行在机器中~
整个编译过程最复杂的无疑是解决依赖的问题,除了人为引入的依赖外,还有SDK版本差异导致的依赖问题;第二个则是Android.mk文件的属性问题,在这次编译过程中,基本上都是看着CSDN对属性的解读进行编写的Android.mk文件,后续我会对此进行更深入的了解。
感谢@拉大锯 提供的解决思路!
相关资料:

























