作者其他文章
- AOSP | Android 9 控制导航栏的隐藏与显示
- AOSP | Android 11 Settings 开发(01) 环境搭建
- AOSP | Android 11 Framework 修改记录(持续更新)
- AOSP | Android 9 Framework 修改记录(持续更新)
- AOSP | Android 9 由壁纸切换带来的手机主题变更及问题出现)
- AOSP | Android 9 过滤Recents
- 后端 | 沙箱环境下实现支付宝网站支付
- 前端 | vue-echarts渲染时视图模糊的解决办法
1、精简目录树
用Android Studio开发的APP,其源码目录大致如下:
而我们需要的,只有三样:AndroidManifest.xml
、com文件夹
、res文件夹
,
于是对源码目录树精简化,将app/src/main
下的res
和AndroidManifest.xml
粘贴到app
目录下,如下:
最后我们只需要复制app目录到系统源码目录package/apps
下即可,这里我将app
改名为HpSetting
:
到此为此,从Android Studio开发的App源码移植到了系统源码目录当中,并对其目录进行了简化操作。
2、编写Android.mk
在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编写完成(初步)
3、编译
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的环境下编译,编译直接通过,具体原因还没查清。
4、安装测试
APP已经正常运行在机器中~
5、总结
整个编译过程最复杂的无疑是解决依赖的问题,除了人为引入的依赖外,还有SDK版本差异导致的依赖问题;第二个则是Android.mk
文件的属性问题,在这次编译过程中,基本上都是看着CSDN对属性的解读进行编写的Android.mk文件,后续我会对此进行更深入的了解。
感谢@拉大锯 提供的解决思路!
相关资料: