Android系统编译之产品定制

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 声明变量的方式已经过时了?;崽崾荆?/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 (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 黑白名单是怎么配置的。

?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容