美文网首页
Android系统编译之产品定制

Android系统编译之产品定制

作者: 过期的薯条 | 来源:发表于2020-12-21 23:16 被阅读0次

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 之后.系统会在devicevendor 俩个目录中寻找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 声明变量的方式已经过时了。会提示:

 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 (call all-makefiles-under,(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 黑白名单是怎么配置的。

相关文章

网友评论

      本文标题:Android系统编译之产品定制

      本文链接:https://www.haomeiwen.com/subject/adqjnktx.html