客制化知识小结--device目录下的文件解析

老罗的文章: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

扫描二维码关注公众号,回复: 6440200 查看本文章
# 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 <trigger>
       <command>
       <command>
       <command>


服务

服务是,当他们退出的时候,init进程启动和重新启动(可选)的程序。Services的形式为:


    service <name> <pathname> [ <argument> ]*
       <option>
       <option>
       ...


选项

选项是服务的调节器。他们影响init进程如何并且何时运行这个服务。

critical
  这是一个设备关键服务。如果他在四分钟内存在超过四次,设备将会重启进入恢复模式。

disabled
  这个服务将不能与他的类自动启动。他必须通过名称被显示启动。

setenv <名称> <值>
  在启动进程中设置环境变量<名称>到<数值>

socket <name> <type> <perm> [ <user> [ <group> [ <seclabel> ] ] ]
  创建一个unix域套接字,命名为 /dev/socket/<name>,并且传递他的文件描述符fd到启动进程中。
  <type>必须是"dgram","stream"或者是"seqpacket"。
  User和group默认为0。
  'seclabel'是这个套接字的SELinux安全上下文。
  他默认为服务安全上下文,由seclabel指定或者是基于服务可执行文件安全上下文计算得来。

user <username>
  在运行这个服务之前改为username(用户名称)。
  当前默认为root.目前,如果你的进程需要linux功能,那么你不能使用这个命令。你必须在进程中
  请求功能但依然root,然后降级到你期望的uid。

group <groupname> [ <groupname> ]*
  在运行这个服务之前修改为groupname。在第一个之前的组名称被用来设置进程的追加的组(通过setgrooups())
  。目前默认为root。

seclabel <seclabel>
  在执行这个服务之前改为seclabel。主要是从rootfs等中被services使用。
  位于系统分区的services可以基于他们的文件安全上下文使用策略定义的转换。
  如果未被指定或者是在策略中没有转换被定义,默认为初始化上下文。

oneshot
  当他退出的时候不要重启服务。

class <name>
  为服务指定一个类名称。位于一个命名的类中的所有服务一起被启动或停止。
  如果服务未被class选项指定,则该服务位于类'default'中。

onrestart
  当services重启的时候运行一个命令。

writepid <file...>
  当子进程被创建的时候,将子进程的pid写入到给定的文件中。意味着cgroup/cpuset
  用法。



触发器

触发器是一系列字符串,被用于匹配确定种类的事件,并且被用于出发一个行为。

boot
   这是第一个触发器,当init进程启动的时候被触发(在/init.conf被加载之后)。

<name>=<value>
   当属性<name>被设置为指定的值<value>的时候,这种形式的触发器被触发。
   这个可以测试多个属性去运行一组命令。例如:

   on property:test.a=1 && property:test.b=1
       setprop test.c 1

   上面的一小段只有当test.a=1和test.b=1都被设置的时候,才会设置test.1为1。



命令

bootchart_init
   如果被配置的话,开启bootcharting。他被默认包含在init.rc中。

chmod <octal-mode> <path>
   修改文件访问权限。

chown <owner> <group> <path>
   修改文件拥有者和组。

class_start <serviceclass>
   如果他们没有运行的话,启动所有指定类的服务。

class_stop <serviceclas
   如果他们当前正在运行的话,停止并且禁用所有指定类的服务。

class_reset <serviceclass>
   如果他们正在运行的话,停止所有指定类的服务,并不禁用他们。后期他们使用
   class_start被重新启动。

copy <src> <dst>
   复制一个文件。类似于写,但是对二进制/大数量数据是有用的。

domainname <name>
   设置域名称。

enable <servicename>
   将一个禁用的服务转换为可用,好像这个服务并没有被指定禁用过。
   如果服务期望去运行,他将会现在被启动。特别是当bootloader设置了一个变量来指示一个指定
   的服务应该在被需要的时候启动。
      on property:ro.boot.myfancyhardware=1
        enable my_fancy_service_for_my_fancy_hardware

exec [ <seclabel> [ <user> [ <group> ]* ] ] -- <command> [ <argument> ]*
   使用给定的参数创建并且执行命令。这个命令在"--"之后运行,所以一个可选的安全上下文,用户,
   和追加的组可以被提供。在这个结束之前没有其他的命令可以被运行。<seclabel>可以被一个-来
   指定为默认。

export <name> <value>
   在全局环境中设置环境变量<name>等于<value>。(这个命令执行之后启动的所有
   进程都将继承他。)

hostname <name>
   设置主机名

ifup <interface>
   将网络接口<interface>联机。

import <filename>
   解析一个初始化配置文件,扩展当前的配置。

insmod <path>
   在<path>中安装模块

load_all_props
   从/system,/vendor等中加载属性。这个被包含在默认的init.rc中。

load_persist_props
   当/data被加密之后,加载持久化的属性。
   这个被包含在默认的init.rc中。

loglevel <level>
   一层一层的设置内核日志。属性被扩展到<level>中。

mkdir <path> [mode] [owner] [group]
   在路径<path>中创建一个目录,可选的使用给定的模式,所有者和组。如果没有提供,该目录则
   以权限755被创建并且以root用户为拥有者和以root为组。如果提供了,模式,所有者和组将会被
   更新,如果该目录已经存在的话。

mount_all <fstab>
   在给定的fs_mgr-format fstab中调用fs_mgr_mount_all。

mount <type> <device> <dir> [ <flag> ]* [<options>]
   尝试在目录<dir>中挂载命名的设备。<device>可以是mtd@name的形式来通过名称
   指定一个mtd块设备。
   <flag>s包含"ro","rw","remount","noatime"等。
   <options>包含"barrier=1", "noauto_da_alloc", "discard"等作为一个逗号分离的字符串。例如,
    barrier=1,noauto_da_alloc

powerctl
   内部实现系统用来响应改变"sys.powerctl"属性,用于实现重启。

restart <service>
   类似于stop,但是并不禁用服务。

restorecon <path> [ <path> ]*
   重新以file_contexts配置中指定的安全上下文来将文件重新以<path>存储。
   不需要被init.rc创建的目录,因为这些都是被init初始化进程自动正确标记的。

restorecon_recursive <path> [ <path> ]*
   递归的重新以名称<path>将目录树保存到安全上下文中,这个安全上下文由
   file_contexts配置指定。

rm <path>
   在指定的路径调用unlink(2)。你可能想要使用"exec -- rm ..."(提供的系统
   分区已经被挂载了)。

rmdir <path>
   对给定的目录调用rmdir(2)

setprop <name> <value>
   这是系统属性<name>到<value>。属性被扩展到<value>。

setrlimit <resource> <cur> <max>
   为一个资源设置rlimit。

start <service>
   开启一个服务运行,如果这个服务没有运行的话。

stop <service>
   从运行的服务中停止一个服务,如果这个服务正在运行的话。

swapon_all <fstab>
   对给定的fstab文件执行fs_mgr_swapon_all

symlink <target> <path>
   使用值<target>在<path>中创建一个符号链接。

sysclktz <mins_west_of_gmt>
   设置系统时钟基础(如果系统时钟在格林尼治时间为0)

trigger <event>
    触发一个事件。用于从另一个动作中排队一个动作。

verity_load_state
   内部实现细节用于加载dm-verity状态。

verity_update_state <mount_point>
  内部实现细节用于更新dm-verity状态并且设置分区。<mount_point>被adb remount
   使用来验证属性,因为fm_mgr不能直接自己设置他们。

wait <path> [ <timeout> ]
   轮询给定文件的存在性,并且当找到的时候返回,或者是到达超时状态。
   如果超时未被指定,则默认为5秒。

write <path> <content>
   在路径<path>中打开文件,并且使用write(2)写一个字符串进去。
   如果文件不存在,他将被创建。如果文件存在,他将被覆盖。属性在<content>
    被扩展。

 

属性

init进程更新一些系统属性,并且提供一些他要干什么的信息:

init.action
   相当于当前被执行的action的名称,如果不存在则为""。

init.command
   相当于当前被运行的command,如果没有则为""。

init.svc.<name>
   一个被命名的服务的状态("停止","运行","重启")。

Bootcharting

init的这个版本包含运行”bootcharting”的代码:生成一个日志文件,后期能够被 www.bootchart.org
提供的工具处理。

在虚拟机中,使用-bootchart 选项来使启动的时候带有bootcharting持续秒。

在一个设备中,使用命令创建 /data/bootchart/start:
  adb shell 'echo $TIMEOUT > /data/bootchart/start'

$TIMEOUT的值对应着期望bootchart持续的秒数。当这些时间过后,Bootcharting将会停止。

你可以通过下面的命令在任何时候停bootcharting:
  adb shell 'echo 1 > /data/bootchart/stop'

注意,/data/bootchart/stop会在bootcharting最后被init自动删除。对于/data/bootchart/start
情况并非如此,所以当你收集完数据之后,不要忘记删除他。

日志文件被写入/data/bootchart中。一个脚本被提供去恢复他们,并且创建一个bootchart.tgz文件
,这个文件可以被bootchart命令行工具使用:


      sudo apt-get install pybootchartgui
      # grab-bootchart.sh uses $ANDROID_SERIAL.
      $ANDROID_BUILD_TOP/system/core/init/grab-bootchart.sh



一个需要注意的事情就是,bootchart将会显示init好像是他从0s的时候开始运行。当内核
开始init的时候,你必须查看dmesg的工作。
Debugging init

默认的,由init执行的程序将会把标准输出和标准错误丢入到/dev/null。为了帮助调试,
你可以通过安卓程序日志封装程序运行你的程序。这个将会重定向标准输出/标准错误到
安卓日志系统中。

例如
service akmd /system/bin/logwrapper /sbin/akmd

当在init中自己运行的时候,为了快速的转变,使用:


      mm -j
      m ramdisk-nodeps
      m bootimage-nodeps
      adb reboot bootloader
      fastboot boot $ANDROID_PRODUCT_OUT/boot.img

   
可选的,使用虚拟机:

emulator -partition-size 1024 -verbose -show-kernel -no-window

在klog_init()调用之后,你可能想要调用klog_set_level(6),所以你需要在
dmesg或者是虚拟机输出中查看内核日志。






----------------------------------------------------------------------------------------------------------------------------------
device/yongyida/yyd8163_tb_m/下的其他文件
./android.hardware.camera.xml
./android.hardware.telephony.gsm.xml
./handheld_core_hardware.xml
./dolby/ds1-default.xml
./android.hardware.microphone.xml
./android.hardware.usb.host.xml
为特定的设备的每个特定feature定义一个permission,android.hardware.camera.xml的内容如下:
<!-- This is the standard set of features for an camera. -->

<permissions>

    <feature name="android.hardware.camera" />

    <!-- unmark following line if the hardware supports autofocus -->

    <feature name="android.hardware.camera.autofocus" />

    <feature name="android.hardware.camera.flash" />

    <feature name="android.hardware.camera.front" />

    <feature name="android.hardware.camera.any" />

</permissions>


下面是特定设备模块的配置文件,由驱动去解析。
./nfcse.cfg   #nfc的驱动
./srs_processing.cfg   #可能跟安全有关
./egl.cfg            #图形渲染,EGL/ELES库
./nfc.cfg            #nfc的驱动
./thermal.off.conf   #散热有关,通过调整cpu频率控制处理器的温度
./audio_policy.conf  #音频模块配置文件
./thermal.conf       #散热有关,通过调整cpu频率控制处理器的温度


下面的文件跟keylayout有关,即键盘布局
mtk-kpd.kl
sbk-kpd.kl
sbk-kpd.kcm


----------------------------------------------------------------------------------------------------------------------------------
分区 文件系统
vold
ptgen
df
cat /proc/mtd
cat /proc/partitions
device/yongyida/yyd8163_tb_m/BoardConfig.mk         修改分区大小可以在这个文件中配置
out/target/product/yyd8163_tb_m/obj/PTGEN/partition_size.mk        看编译后已经生成的分区大小
device/mediatek/build/build/tools/ptgen/MT8163/partition_table_MT8163.xls    #看分区的原始分配及有哪些分区


vendor/mediatek/proprietary/hardware/fstab/mt8163/fstab.in
/devices/soc/11230000.mmc* auto vfat defaults voldmanaged=sdcard0:auto,encryptable=userdata

/devices/soc/11240000.mmc* auto vfat defaults voldmanaged=sdcard1:auto,encryptable=userdata





 

猜你喜欢

转载自blog.csdn.net/b1480521874/article/details/79280733