1.引言
上一节,关于写了关于如何下载,编译android aosp代码,以及如何通过fastboot 推送到我们的pixel手机中。这一节的主要内容就是。如何定制为android系统添加一款定制化的设备。项目实际场景是。一份android代码。我们添加了品牌A和品牌B。每天会出俩个品牌的系统。这个时候就会用到指定化产品的知识。
2.正题
定制一款android产品,它是需要以下的流程:
[图片上传失败...(image-c6134a-1608563744222)]
我们所说的编译配置,属于产品层。定制一个产品它与以下几个文件有很大的关系:
- vendorsetup.sh
- AndroidProducts.mk
- BoardConfig.mk
- Android.mk
下面将分别介绍下,每个文件的作用,以及参考官方demo是如何定制的。
2.1 vendorsetup.sh
首先在device目录下创建一个文件夹,文件夹名代码产品或者公司名称。为了让系统发现次产品?;剐枰诖宋募邢?,添加一个vendorsetup.sh. 此脚本通常就是一句话:
add_lunch_combo chipswang_userdebug
其中add_lunch_combo 是一个函数,定义在envsetup.sh 中,作用是将其参数所描述的产品如“chipswang_userdebug” 添加到系统相关变量中。后续的lunch提供的选单就是这些变量产生的。
vendorsetup.sh 什么时候会被调用呢? 答案就是在source ./build/ensetup.sh 之后.系统会在device
和vendor
俩个目录中寻找vendorsetup.sh。那么ensetup.sh里面又是如何写的呢?
2.2 ensetup.sh
add_lunch_combo 定义的地方:
[图片上传失败...(image-99b3dc-1608563744222)]
ensetup.sh 中find vendorsetup.sh 的代码:
[图片上传失败...(image-81b3f1-1608563744222)]
添加完毕之后。我们就可以在lunch中看到我们的chipswang_userdebug
选项了。
2.3 AndroidProducts.mk
AndroidProducts.mk 是对“产品”做出的描述。在android系统中,每个产品都是需要一个AndroidProducts.mk的。所以为了便于管理。AndroidProducts.mk中主要是转向了其他的mk.如
PRODUCT_MAKEFILES := \
$(LOCAL_DIR)/aosp_marlin.mk \
$(LOCAL_DIR)/aosp_sailfish.mk
COMMON_LUNCH_CHOICES := \
aosp_marlin-userdebug \
aosp_sailfish-userdebug
PRODUCT_MAKEFILES:具体的函数描述文件。
aosp_marlin.mk 描述
//继承下面俩个mk文件
$(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk)
$(call inherit-product, $(SRC_TARGET_DIR)/product/aosp_base_telephony.mk)
PRODUCT_NAME := aosp_marlin //产品名称
PRODUCT_DEVICE := marlin //设备名称
PRODUCT_BRAND := Android // 品牌
PRODUCT_MODEL := AOSP on msm8996 //产品型号
PRODUCT_PACKAGES += \ //系统需要预安装的一系列程序
Launcher3QuickStep \
WallpaperPicker
PRODUCT_LOCALES := en_US \ //系统支持的语言
PRODUCT_USE_PREBUILT_GMS := no //是否包含google服务
PRODUCT_MANUFACTURER := Google //产品制造商
PRODUCT_RESTRICT_VENDOR_FILES := true
PRODUCT_COPY_FILES += device/google/marlin/fstab.common:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.marlin
$(call inherit-product, device/google/marlin/device-marlin.mk)
$(call inherit-product-if-exists, vendor/google_devices/marlin/device-vendor-marlin.mk)
PRODUCT_MAKEFILES 按寻常思维应该只有一个才对,但是上面为啥有俩个mk配置呢?经过测试发现。去掉其中一个只会,lunch就会少一个目录。也就是说这里配置多个,在lunch的时候就会显示多个。多个对产品信息的描述文件。
COMMON_LUNCH_CHOICES
AndroidProducts.mk 中按道理只有PRODUCT_MAKEFILES 就行了啊。为什么还需要COMMON_LUNCH_CHOICES 呢? 原来啊add_lunch_combo 声明变量的方式已经过时了?;崽崾荆?/p>
add_lunch_combo is obsolete. Use COMMON_LUNCH_CHOICES in your AndroidProducts.mk instead.
于是我们需要在AndroidProducts.mk 中加入COMMON_LUNCH_CHOICES。
2.4 BoardConfig.mk
此文件用于填写目标架构,硬件设备属性,编译器条件标志,分区布局,boot地址,ramdisk大小等等一系列参数。
[图片上传失败...(image-b5d45d-1608563744222)]
一般这些文件都是雷同的,可以拷贝一份放进去,然后根据属性更改。
2.5添加Android.mk文件
假如说2.1-2.4是决定一个商品的属性,那么2.5 添加Android.mk 就是开始真正生产。只不过生产的不是整个“产品”。而是其中之一的“零件”。因为android系统由很多个Android.mk功能生成的。
LOCAL_PATH := $(call my-dir)
include $(call all-makefiles-under,$(LOCAL_PATH))
#endif
LOCAL_PATH := $(call my-dir):
每个Android.mk文件必须以定义LOCAL_PATH为开始。它用于在开发tree中查找源文件。宏my-dir 则由Build System提供。返回包含Android.mk的目录路径.
include (LOCAL_PATH))
编译与Android.mk同一文件夹下的,其他子文件夹的Android.mk
2.6 开始make 编译
输入: make-j32
开启编译。编译过程中遇到这样几个问题:
-
lunch 提示“”
add_lunch_combo is obsolete. Use COMMON_LUNCH_CHOICES in your AndroidProducts.mk instead
将vendorsetup.sh 删除,同时将“产品名” 添加在 AndroidProducts.mk的 COMMON_LUNCH_CHOICES下
-
make过程中报错
build/make/core/product_config.mk:247: error: No matches for product chipswang
猜测我各个mk中的product_name 可能写的名字和“chipswang” 不同,毕竟都是copy过来的。
[图片上传失败...(image-5c09f7-1608563744222)]
-
编译成功之后,产品名称不是“chipswang”
[图片上传失败...(image-66a89d-1608563744222)]
说明肯定是某个文件配置写的有问题:这个问题不知道哪里出问题了,也尝试过更改。product_config.mk 但是编译不通过。于是无辙了
3.编译apk
项目中会将第三方apk提交到系统编译,成为系统自带的apk;也有一些framework层的系统级别应用,都是通过Android.mk 编译,生成目标apk的。这些mk的写法大多都是一样的
3.1 提交apk
-
apk中不含有so文件:
LOCAL_PATH := $(call my-dir) ############################## include $(CLEAR_VARS) LOCAL_MODULE := Test //生成apk的文件夹名称 LOCAL_MODULE_CLASS := APPS LOCAL_MODULE_TAGS := optional$ LOCAL_BUILT_MODULE_STEM := package.apk LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) LOCAL_CERTIFICATE := platform //是否需要平台二次签名 LOCAL_DEX_PREOPT := false # Conditional case by branch LOCAL_SRC_FILES := Test.apk //apk名称,当前文件夹下 LOCAL_PRIVILEGED_MODULE := true //等于false的话。最终目录是out\target\product\test\system\app; ture 则在eout\target\product\Cebu\system\priv-app LOCAL_DEX_PREOPT := false // 不进行预先优化 LOCAL_DEX_PREOPT := true // 进行预先优化,生成oat文件,此文件中包含odex,vdex LOCAL_MULTILIB :=32 include $(BUILD_PREBUILT)
-
apk中含有so文件:
LOCAL_PATH := $(call my-dir) ############################## include $(CLEAR_VARS) LOCAL_MODULE := Test //生成apk的文件夹名称 LOCAL_MODULE_CLASS := APPS LOCAL_MODULE_TAGS := optional$ LOCAL_BUILT_MODULE_STEM := package.apk LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) LOCAL_CERTIFICATE := platform //是否需要平台二次签名 LOCAL_DEX_PREOPT := false # Conditional case by branch LOCAL_SRC_FILES := Test.apk //apk名称,当前文件夹下 LOCAL_PRIVILEGED_MODULE := true //等于false的话。最终目录是out\target\product\test\system\app; ture 则在eout\target\product\test\system\priv-app LOCAL_DEX_PREOPT := false // 不进行预先优化 LOCAL_DEX_PREOPT := true // 进行预先优化,生成oat文件,此文件中包含odex,vdex //Test11.so Test222.so LOCAL_PREBUILT_JNI_LIBS := \ @lib/armeabi-v7a/Test11.so \ @lib/armeabi-v7a/Test222.so \ LOCAL_MULTILIB :=32 include $(BUILD_PREBUILT)
3.2源码编译
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res //res文件
LOCAL_MANIFEST_FILE : = $(LOCAL_PATH)/AndroidManifest.xml
LOCAL_PRIVATE_PLATFORM_APIS := true
LOCAL_PACKAGE_NAME := Test
LOCAL_CERTIFICATE := platform
LOCAL_DEX_PREOPT := false
LOCAL_SRC_FILES := $(call all-java-files-under,src)
LOCAL_STATIC_JAVA_LIBRARIES := \ //指定java 库,java库需要写 LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES
TestJava1 \
TestJava2 \
TestJava3 \
TestJava4 \
LOCAL_STATIC_ANDROID_LIBRARIES := \ //指定android 库,不需要提前预编译
android-support-v4 \
android-support-v7-appcompat \
android-support-v17-leanback \
android-support-v7-cardview
LOCAL_USE_AAPT2 := true
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
include $(BUILD_PACKAGE)
include $(CLEAR_VARS)
//提前预编译
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := TestJava1:libs/testJava1.jar \
TestJava2:libs/testJava2.jar \
TestJava3:libs/testJava3.aar \
TestJava4:libs/TestJava4.jar
include $(BUILD_MULTI_PREBUILT)
下一节搞清楚,android 黑白名单是怎么配置的。