老罗的文章:http://blog.csdn.net/luoshengyang/article/details/18928789
http://0xcc0xcd.com/p/index.php(进击的程序员)
vendorsetup.sh
add_lunch_combo full_yyd8163_tb_m-eng
add_lunch_combo full_yyd8163_tb_m-user
调用envsetup.sh中的函数,为LUNCH_MENU_CHOICES数组添加元素full_yyd8163_tb_m-eng
和full_yyd8163_tb_m-user
使用lunch的时候,不输入任何东西就会选full_yyd8163_tb_m-user,还可以输入1或2选择full_yyd8163_tb_m-eng
或者full_yyd8163_tb_m-user
而LUNCH_MENU_CHOICES应该是不知道在哪export的变量
lunch是编译非常重要关键的一步。这是指定TARGET_PRODUCT
首先编译时回去收集device目录下的所有AndroidProducts.mk。AndroidProduct.mk中需要指定编译的mk文件,如下分析是RK3399和mt8163的AndroidProducts.mk:
PRODUCT_MAKEFILES := \
$(LOCAL_DIR)/rk3399.mk \
$(LOCAL_DIR)/rk3399_64.mk \
$(LOCAL_DIR)/rk3399_64_vr.mk \
$(LOCAL_DIR)/rk3399_disvr.mk \
$(LOCAL_DIR)/rk3399_stbvr.mk \
$(LOCAL_DIR)/rk3399_32.mk \
$(LOCAL_DIR)/rk3399_box.mk \
$(LOCAL_DIR)/rk3399_mid.mk \
$(LOCAL_DIR)/rk3399_64_only.mk
PRODUCT_MAKEFILES := $(LOCAL_DIR)/full_yyd8163_tb_m.mk
device目录下(包括各级子目录)那么多的AndroidProducts.mk文件,然后每个AndroidProducts.mk文件中可以指定很多个mk文件,那么最终是用哪个mk文件呢,就由TARGET_PRODUCT决定,就是选择$(TARGET_PRODUCT).mk。在$(TARGET_PRODUCT).mk中一般需要定义一些全局变量,下面分别看RK3399和mt8163的一个mk:
RK3399_mid.mk
#
# Copyright 2014 The Android Open-Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
$(call inherit-product, $(LOCAL_PATH)/rk3399_64.mk)
PRODUCT_NAME := rk3399_mid
PRODUCT_DEVICE := rk3399_mid
PRODUCT_MODEL := Y150C
PRODUCT_AAPT_CONFIG := normal large mdpi tvdpi hdpi xhdpi
PRODUCT_AAPT_PREF_CONFIG := hdpi
# debug-logs
ifneq ($(TARGET_BUILD_VARIANT),user)
MIXIN_DEBUG_LOGS := true
endif
# google apps
BUILD_WITH_GOOGLE_MARKET := true
BUILD_WITH_GOOGLE_MARKET_ALL := false
BUILD_WITH_GOOGLE_FRP := true
#for data encrypt options
BUILD_WITH_FORCEENCRYPT := true
#for GMS Certification
BUILD_WITH_GMS_CER := false
#for drm widevine
BUILD_WITH_WIDEVINE := true
#for cts requirement
ifeq ($(TARGET_BUILD_VARIANT),user)
PRODUCT_PROPERTY_OVERRIDES += \
ro.adb.secure=1 \
persist.sys.usb.config=mtp
else
PRODUCT_PROPERTY_OVERRIDES += \
ro.adb.secure=0 \
persist.sys.usb.config=mtp,adb
endif
BOARD_NFC_SUPPORT := false
BOARD_HAS_GPS := false
BOARD_GRAVITY_SENSOR_SUPPORT := true
BOARD_COMPASS_SENSOR_SUPPORT := true
BOARD_GYROSCOPE_SENSOR_SUPPORT := true
BOARD_PROXIMITY_SENSOR_SUPPORT := false
BOARD_LIGHT_SENSOR_SUPPORT := true
BOARD_PRESSURE_SENSOR_SUPPORT := false
BOARD_TEMPERATURE_SENSOR_SUPPORT := false
#for bootanimation/shutdown support
BOOT_SHUTDOWN_ANIMATION_RINGING := true
PRODUCT_HAS_CAMERA := true
TARGET_ROCKCHIP_PCBATEST := true
PRODUCT_COPY_FILES += \
device/rockchip/rk3399/rk3399_64/ddr_config.xml:system/etc/ddr_config.xml \
device/rockchip/rk3399/rk3399_64/video_status:system/etc/video_status
PRODUCT_PACKAGES += \
SoundRecorder
full_yyd8163_tb_m.mk
# Inherit for devices that support 64-bit primary and 32-bit secondary zygote startup script
$(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk)
# Inherit from those products. Most specific first.
#$(call inherit-product, $(SRC_TARGET_DIR)/product/full_base_telephony.mk)
# Inherit from those products. Most specific first.
$(call inherit-product, $(SRC_TARGET_DIR)/product/full_base.mk)
# Set target and base project for flavor build
MTK_TARGET_PROJECT := $(subst full_,,$(TARGET_PRODUCT))
MTK_BASE_PROJECT := $(MTK_TARGET_PROJECT)
MTK_PROJECT_FOLDER := $(shell find device/* -maxdepth 1 -name $(MTK_BASE_PROJECT))
MTK_TARGET_PROJECT_FOLDER := $(shell find device/* -maxdepth 1 -name $(MTK_TARGET_PROJECT))
# This is where we'd set a backup provider if we had one
#$(call inherit-product, device/sample/products/backup_overlay.mk)
# Inherit from maguro device
$(call inherit-product, device/yongyida/yyd8163_tb_m/device.mk)
# set locales & aapt config.
PRODUCT_LOCALES := zh_CN #en_US es_ES zh_CN zh_TW ru_RU pt_BR fr_FR de_DE tr_TR it_IT in_ID ms_MY vi_VN ar_EG hi_IN th_TH bn_IN pt_PT ur_PK fa_IR nl_NL el_GR hu_HU tl_PH ro_RO cs_CZ iw_IL my_MM km_KH ko_KR pl_PL es_US bg_BG hr_HR lv_LV lt_LT sk_SK uk_UA de_AT da_DK fi_FI nb_NO sv_SE en_GB ja_JP
#AAPT configuration
PRODUCT_AAPT_CONFIG := normal large xlarge
PRODUCT_AAPT_PREF_CONFIG := hdpi
# Set those variables here to overwrite the inherited values.
PRODUCT_MANUFACTURER := YYD
PRODUCT_NAME := full_yyd8163_tb_m
PRODUCT_DEVICE := yyd8163_tb_m
PRODUCT_MODEL := Y20C
PRODUCT_POLICY := android.policy_phone
PRODUCT_BRAND := YYD
ifeq ($(TARGET_BUILD_VARIANT), eng)
KERNEL_DEFCONFIG ?= yyd8163_tb_m_debug_defconfig
else
KERNEL_DEFCONFIG ?= yyd8163_tb_m_defconfig
endif
PRELOADER_TARGET_PRODUCT ?= yyd8163_tb_m
LK_PROJECT ?= yyd8163_tb_m
TRUSTY_PROJECT ?= yyd8163_tb_m
PRODUCT_CHARACTERISTICS := tablet
在上面两个文件都可以看到,里面定义了一个变量叫PRODUCT_DEVICE := rk3399_mid和PRODUCT_DEVICE := yyd8163_tb_m,而TARGET_DEVICE=PRODUCT_DEVICE。这个就是TARGET_DEVICE_DIR,后面编译时需要找一些target devcie的文件就根据这个名字来找。如:找BoardConfig.mk文件,会这样找:
board_config_mk := \
$(strip $(wildcard \
$(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk \
device/*/$(TARGET_DEVICE)/BoardConfig.mk \
vendor/*/$(TARGET_DEVICE)/BoardConfig.mk \
))
就是在device目录,vendor目录,$(SRC_TARGET_DIR)目录下找一个其上级路径为$(TARGET_DEVICE)的BoardConfig.mk。找其他文件应该也是这样找的。
-----------------------------------------------------------------------------------------------------------------------------
.prop文件
Prop模块本质上来说,是系统运行时内存中保存的一块数据区,读写数据都是对这一块区域进行操作;好处是读写速度快,数据跨进程共享,缺点是突然断电会丢失数据;当然Prop也能保存数据,
Android的启动后,在property_service.c的property_init中完成prop的初始化。系统中存在着几个文件,如build.prop和default.prop等,这些文件在系统构建时候生成的,里面包含很多系统配
置信息。系统开机时回去加载这些文件中的信息并保存到prop模块中去,以便利用其它程序进行使用
system.prop,override.prop,product_override.prop最后override.prop,product_override.prop中的键值对在编译时都会覆盖到system.prop,而最后system.prop放到/system/build.prop。
-----------------------------------------------------------------------------------------------------------------------------
device.mk
device/yongyida/mt8163_tb_m/device.mk
device/mediatek/mt8163/device.mk
device/mediatek/common/device.mk
主要定义了
PRODUCT_PACKAGES,如:
PRODUCT_PACKAGES += YYDRobotBreathLed #YYDRobotBreathLed指的是模块对应的Android.mk文件中对应的LOCAL_PACKAGE_NAME的值
这是控制哪些module(包括so lib,apk)会编译进system.img。LOCAL_MODULE_TAGS 如果指定为debug,eng(默认),当TARGET_BUILD_VARIANT为userdebug或者eng时还是会被编译进来。所以我们为了保险可以在PRODUCT_PACKAGES控制
不把我们不想要的module编译进来,我们一般指定模块的LOCAL_MODULE_TAGS为optional。
PRODUCT_PROPERTY_OVERRIDES,如:
PRODUCT_PROPERTY_OVERRIDES += ro.mtk_volte_support=1
写到/system/build.prop
PRODUCT_COPY_FILES,如:
PRODUCT_COPY_FILES += device/yongyida/yyd8163_tb_m/meta_init.project.rc:root/meta_init.project.rc
在/build/core/Makefile中起作用,就是copy文件的作用。在Module中的Android.mk中不能使用,因为该变量在某个阶段后不能被修改,否则调用assert-product-vars函数会监测到并报错。
PRODUCT_DEFAULT_PROPERTY_OVERRIDES,如:
PRODUCT_DEFAULT_PROPERTY_OVERRIDES += persist.sys.usb.config=mtp
写到/default.prop
DEVICE_PACKAGE_OVERLAYS,如:
DEVICE_PACKAGE_OVERLAYS += device/yongyida/$(MTK_TARGET_PROJECT)/overlay
PRODUCT_PACKAGE_OVERLAYS,如:
PRODUCT_PACKAGE_OVERLAYS += mediatek/operator/$(OPTR)/$(SPEC)/$(SEG)/OverLayResource
有两种不同的overaly目录定义,来影响最终的效果:
PRODUCT_PACKAGE_OVERLAYS: used by a particular product
DEVICE_PACKAGE_OVERLAYS: used several products that share a common device model
如果包含同一资源,那么 PRODUCT_PACKAGE_OVERLAYS 将覆盖 DEVICE_PACKAGE_OVERLAYS 中的,
PRODUCT_PACKAGE_OVERLAYS & DEVICE_PACKAGE_OVERLAYS 功能是一样的,只是优先级不一样:
PRODUCT_PACKAGE_OVERLAYS 优先于 DEVICE_PACKAGE_OVERLAYS。
ADDITIONAL_DEFAULT_PROPERTIES,如:
+= ro.mtk_key_manager_kb_path=1
写到/default.prop
----------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------
Android property系统(prop)
android属性值读取顺序/default.prop,/system/build.prop,/system/default.prop,/data/local.prop
常用的是default.prop与build.prop,下面就对这两个文件内容来源分析一下:
default.prop:
PRODUCT_DEFAULT_PROPERTY_OVERRIDES
ADDITIONAL_DEFAULT_PROPERTIES
以上变量一般会在core/main.mk,device.mk中定义。
还有build/tools/post_process_props.py中会向对应文件追加usb相关的键值对。
/system/build.prop:
1.根据编译服务器的系统,用户名,编译时间获取到。这个部分主要在build/tools/buildinfo.sh通过echo添加到build.prop中(通过输出重定向)
2.产品中定义的prop文件。一般存放device/company name/product name/system.prop文件中。
3.在mk文件中的PRODUCT_PROPERTY_OVERRIDES值,和PRODUCT_DEFAULT_PROPERTY_OVERRIDES,ADDITIONAL_DEFAULT_PROPERTIES类似
特别属性 :
如果属性名称以“ro.”开头,那么这个属性被视为只读属性。一旦设置,属性值不能改变。
如果属性名称以“persist.”开头,当设置这个属性时,其值也将写入/data/property。
如果属性名称以“net.”开头,当设置这个属性时,“net.change”属性将会自动设置,以加入到最后修改的属性名。
(这是很巧妙的。 netresolve模块的使用这个属性来追踪在net.*属性上的任何变化。)
属性“ ctrl.start ”和“ ctrl.stop ”是用来启动和停止服务。每一项服务必须在/init.rc中定义.系统启动时,与init守护
进程将解析init.rc和启动属性服务。一旦收到设置“ ctrl.start ”属性的请求,属性服务将使用该属性值作为服务
名找到该服务,启动该服务。这项服务的启动结果将会放入“ init.svc.<服务名>“属性中。客户端应用程序可以轮询那个属性值,以确定结果。
看这个修改系统属性权限表:
property_perms[] = {
{ "net.dns", AID_RADIO, 0 },
{ "net.", AID_SYSTEM, 0 },
{ "dev.", AID_SYSTEM, 0 },
{ "runtime.", AID_SYSTEM, 0 },
{ "sys.", AID_SYSTEM, 0 },
{ "service.", AID_SYSTEM, 0 },
{ "persist.sys.", AID_SYSTEM, 0 },
{ "persist.service.", AID_SYSTEM, 0 },
……
{ NULL, 0, 0 }
};
所以修改系统属性值一般都要system级别的权限
http://www.cnblogs.com/bastard/archive/2012/10/11/2720314.html (Android System Property)
http://blog.csdn.net/gejun2008/article/details/25978907 (Android属性工作原理解析)
-----------------------------------------------------------------------------------------------------------------------------------------------------------
Android overlay 机制
Android overlay 机制允许在不修改packages中apk的情况下,来自定义 framework和package中的资源文件,实现资源的定制。来达到显示不同的UI得目的
以下几类能够通过该机制定义:
(1),Configurations (string, bool, bool-array)
(2),Localization (string, string-array)
(3),UI Appearance (color, drawable, layout, style, theme, animation)
(4),Raw resources (audio, video, xml)
Product Overlays与Device Overlays
有两种不同的overaly目录定义,来影响最终的效果:
PRODUCT_PACKAGE_OVERLAYS: used by a particular product
DEVICE_PACKAGE_OVERLAYS: used several products that share a common device model
如果包含同一资源,那么 PRODUCT_PACKAGE_OVERLAYS 将覆盖 DEVICE_PACKAGE_OVERLAYS 中的
http://blog.csdn.net/wh_19910525/article/details/39254815 (Android平台Overlay机制)
----------------------------------------------------------------------------------------------------------------------------------
下面这些mk文件都是定义一些变量,供后面编译使用
AndroidProducts.mk include{
full_yyd8163_tb_m.mk include or inherit-product{
device/yongyida/mt8163_tb_m/device.mk include or inherit-product{
device/yongyida/mt8163_tb_m/ProjectConfig.mk #重复1
device/mediatek/mt8163/device.mk incude or inherit-product{
device/mediatek/common/device.mk
}
vendor/yongyida/libs/$(MTK_TARGET_PROJECT)/device-vendor.mk
}
}
}
device/yongyida/mt8163_tb_m/BoardConfig.mk include or inherit-product{
device/yongyida/$(MTK_TARGET_PROJECT)/ProjectConfig.mk #重复1
vendor/yongyida/yyd8163_tb_m/BoardConfigVendor.mk
device/mediatek/mt8163/BoardConfig.mk
device/mediatek/build/build/tools/base_rule_remake.mk
}
------------------------------------------------------------------------------------------------------------------------------------------------------------
rc文件(Android init language)
./init.recovery.mt8163.rc
./meta_init.project.rc
./meta_init.modem.rc
./init.project.rc
./factory_init.project.rc
./init.modem.rc
./init.mt8163.usb.rc
device/yongyida/mt8163_tb_m/下的rc文件全部被拷贝到root/下
.rc文件应该跟boot流程有关,android启动后会去执行.rc,
PRODUCT_COPY_FILES += device/yongyida/yyd8163_tb_m/factory_init.project.rc:root/factory_init.project.rc
PRODUCT_COPY_FILES += device/yongyida/yyd8163_tb_m/init.project.rc:root/init.project.rc
PRODUCT_COPY_FILES += device/yongyida/yyd8163_tb_m/meta_init.project.rc:root/meta_init.project.rc
PRODUCT_COPY_FILES += device/yongyida/yyd8163_tb_m/init.recovery.mt8163.rc:root/init.recovery.mt8163.rc
----------------------------------------------------------------------------------------------------------------------------------
下面关于Android初始化语言转载自:http://blog.csdn.net/hongbochen1223/article/details/56331690 (Android Init Language(android初始化语言))
Android初始化语言
Android初始化语言包含四个广泛的陈述类,为Actions(行为),Commands(命令),
Services(服务)和Options(选项)。
所有的这些都是基于行的,包括空格分隔符。C风格的反斜杠可以用来插入空格到一个
命令中。双引号可以被用来阻止空格将文本分割成多个标记。当反斜杠为一行中的最后
一个字符的时候,可以被用于换行。
以#开始的行为注释。
Actions和Services声明一个新的部分。所有的commands和options属于最近声明
的那个部分。位于第一个部分之前的Commands和Actions是被忽略的。
Actions和Services用于独一无二的名称。如果有一个Action或Service被声明了一个
和之前相同名称,则他被忽略为一个错误。
行为
Actions是被命名的命令序列。Actions有一个触发器用来决定什么时候这个action应该发生。
当一个时间触发了符合一个action的触发器,那么这个action将被添加到要处理队列的
尾部(除非他已经在队列中了)。
在队列中的每一个action都是按照顺序出列的,位于那个action中的每一个command
也是按照顺序执行的。在活动中,初始化处理其他活动(设备创建和销毁,属性设置,
进程重启)介于commands的运行之间。
Actions组织形式位:
on
服务
服务是,当他们退出的时候,init进程启动和重新启动(可选)的程序。Services的形式为:
service