Android系统开发时,经常会遇到添加或者调整系统分区大小的问题,下面以mstar的一款产品为例进行分析:

(1)mount指令可以查看到板子中挂在的分区,主要关注ext4类型分区,例如tvservice,tvconfig,tvconfig,tvcustomer

|shell@arbutus:/ # mount
rootfs / rootfs ro,relatime
tmpfs /dev tmpfs rw,nosuid,relatime,mode=
devpts /dev/pts devpts rw,relatime,mode=
proc /proc proc rw,relatime
sysfs /sys sysfs rw,relatime
debugfs /sys/kernel/debug debugfs rw,relatime
none /acct cgroup rw,relatime,cpuacct
none /sys/fs/cgroup tmpfs rw,relatime,mode=,gid=
tmpfs /mnt/asec tmpfs rw,relatime,mode=,gid=
tmpfs /mnt/obb tmpfs rw,relatime,mode=,gid=
none /dev/cpuctl cgroup rw,relatime,cpu
tmpfs /mnt/usb tmpfs rw,relatime,mode=,gid=
tmpfs /mnt/iso tmpfs rw,relatime,mode=,gid=
tmpfs /mnt/samba tmpfs rw,relatime,mode=,gid=
tmpfs /var tmpfs rw,relatime,mode=,gid=
/dev/block/platform/mstar_mci./by-name/system /system ext4 ro,relatime,data=ordered
/dev/block/platform/mstar_mci./by-name/cache /cache ext4 rw,nosuid,nodev,noatime,data=ordered
/dev/block/platform/mstar_mci./by-name/userdata /data ext4 rw,nosuid,nodev,noatime,data=ordered
/dev/block/platform/mstar_mci./by-name/tvservice /tvservice ext4 ro,relatime,data=ordered
/dev/block/platform/mstar_mci./by-name/tvconfig /tvconfig ext4 ro,relatime,data=ordered
/dev/block/platform/mstar_mci./by-name/tvdatabase /tvdatabase ext4 rw,nosuid,nodev,noatime,data=ordered
/dev/block/platform/mstar_mci./by-name/tvcustomer /tvcustomer ext4 rw,nosuid,nodev,noatime,data=ordered
/dev/fuse /mnt/sdcard fuse rw,nosuid,nodev,noexec,relatime,user_id=,group_id=,default_permissions,allow_other

  (2)查看分区文件fstab.monet (device/mstar/arbutus/目录下),截取部分信息如下:

/dev/block/platform/mstar_mci./by-name/system          /system             ext4      ro                                                    wait
/dev/block/platform/mstar_mci./by-name/cache /cache ext4 noatime,nosuid,nodev wait,block_validity,nodiscard,data=ordered,journal_checksum
/dev/block/platform/mstar_mci./by-name/userdata /data ext4 noatime,nosuid,nodev wait,block_validity,nodiscard,data=ordered,journal_checksum
/dev/block/platform/mstar_mci./by-name/tvservice /tvservice ext4 ro wait
/dev/block/platform/mstar_mci./by-name/tvconfig /tvconfig ext4 ro wait
/dev/block/platform/mstar_mci./by-name/tvdatabase /tvdatabase ext4 noatime,nosuid,nodev wait,block_validity,nodiscard,data=ordered,journal_checksum
/dev/block/platform/mstar_mci./by-name/tvcustomer /tvcustomer ext4 noatime,nosuid,nodev

android平台不同厂商可能名称不一样,但是都是fstab.xxx的形式

(3)指定各个分区的大小,BoardConfig.mk (device/mstar/arbutus)文件指定各自大小可以根据需要进行修改

# mmc part
# : type name (size)
#. misc (512K)
#. recovery (19M)
#. boot (15M)
#. tee (6M)
#. rtpm (256K)
#. dtb (1M)
#. system (800M)
#. userdata (900M)
#. cache (1G)
#. tvservice (160M)
#. tvconfig (10M)
#. tvdatabase (8M)
#. tvcustomer (16M)
BOARD_RECOVERYIMAGE_PARTITION_SIZE := 0x01300000
BOARD_BOOTIMAGE_PARTITION_SIZE := 0x00F00000
BOARD_TEEIMAGE_PARTITION_SIZE := 0x00600000
BOARD_RTPMIMAGE_PARTITION_SIZE := 0x00040000
BOARD_DTBIMAGE_PARTITION_SIZE := 0x00100000
BOARD_SYSTEMIMAGE_PARTITION_SIZE := 0x33C00000
BOARD_USERDATAIMAGE_PARTITION_SIZE := 0x38000000
BOARD_CACHEIMAGE_PARTITION_SIZE := 0x40000000
BOARD_TVSERVICEIMAGE_PARTITION_SIZE := 0x0A000000
BOARD_TVCONFIGIMAGE_PARTITION_SIZE := 0x00A00000
BOARD_TVDATABASEIMAGE_PARTITION_SIZE := 0x00800000
BOARD_TVCUSTOMERIMAGE_PARTITION_SIZE := 0x01000000 BOARD_FLASH_BLOCK_SIZE :=

  (4)启动脚本加载,init.monet.rc脚本中on fs 模块中启动

on fs
mkdir /tvservice
mkdir /tvconfig
mkdir /tvdatabase
mkdir /tvcustomer
mount_all /fstab.monet

  

(5)init进程解析fstab.monet文件

keywords.h文件中注册mount_all操作方法

enum {
K_UNKNOWN,
#endif
KEYWORD(capability, OPTION, , )
KEYWORD(chdir, COMMAND, , do_chdir)
KEYWORD(chroot, COMMAND, , do_chroot)
KEYWORD(class, OPTION, , )
KEYWORD(class_start, COMMAND, , do_class_start)
KEYWORD(class_stop, COMMAND, , do_class_stop)
KEYWORD(class_reset, COMMAND, , do_class_reset)
KEYWORD(console, OPTION, , )
KEYWORD(critical, OPTION, , )
KEYWORD(disabled, OPTION, , )
KEYWORD(domainname, COMMAND, , do_domainname)
KEYWORD(enable, COMMAND, , do_enable)
KEYWORD(exec, COMMAND, , do_exec)
KEYWORD(export, COMMAND, , do_export)
KEYWORD(group, OPTION, , )
KEYWORD(hostname, COMMAND, , do_hostname)
KEYWORD(ifup, COMMAND, , do_ifup)
KEYWORD(insmod, COMMAND, , do_insmod)
KEYWORD(import, SECTION, , )
KEYWORD(keycodes, OPTION, , )
KEYWORD(mkdir, COMMAND, , do_mkdir)
KEYWORD(mount_all, COMMAND, , do_mount_all)
KEYWORD(mount, COMMAND, , do_mount)
KEYWORD(on, SECTION, , )
KEYWORD(oneshot, OPTION, , )
KEYWORD(onrestart, OPTION, , )
KEYWORD(powerctl, COMMAND, , do_powerctl)
KEYWORD(restart, COMMAND, , do_restart)
KEYWORD(restorecon, COMMAND, , do_restorecon)
KEYWORD(restorecon_recursive, COMMAND, , do_restorecon_recursive)
KEYWORD(rm, COMMAND, , do_rm)
KEYWORD(rmdir, COMMAND, , do_rmdir)
KEYWORD(seclabel, OPTION, , )
KEYWORD(service, SECTION, , )
KEYWORD(setcon, COMMAND, , do_setcon)
KEYWORD(setenforce, COMMAND, , do_setenforce)
KEYWORD(setenv, OPTION, , )
KEYWORD(setkey, COMMAND, , do_setkey)
KEYWORD(setprop, COMMAND, , do_setprop)
KEYWORD(setrlimit, COMMAND, , do_setrlimit)
KEYWORD(setsebool, COMMAND, , do_setsebool)
KEYWORD(socket, OPTION, , )
KEYWORD(start, COMMAND, , do_start)
KEYWORD(stop, COMMAND, , do_stop)
KEYWORD(swapon_all, COMMAND, , do_swapon_all)
KEYWORD(trigger, COMMAND, , do_trigger)
KEYWORD(symlink, COMMAND, , do_symlink)
KEYWORD(sysclktz, COMMAND, , do_sysclktz)
KEYWORD(user, OPTION, , )
KEYWORD(wait, COMMAND, , do_wait)
KEYWORD(write, COMMAND, , do_write)
KEYWORD(copy, COMMAND, , do_copy)
KEYWORD(chown, COMMAND, , do_chown)
KEYWORD(chmod, COMMAND, , do_chmod)
KEYWORD(loglevel, COMMAND, , do_loglevel)
KEYWORD(load_persist_props, COMMAND, , do_load_persist_props)
KEYWORD(load_all_props, COMMAND, , do_load_all_props)
KEYWORD(ioprio, OPTION, , )
#ifdef __MAKE_KEYWORD_ENUM__
KEYWORD_COUNT,
}

builtins.c文件中do_mount_all,启动一个进程调用fs_mgr_read_fstab,fs_mgr_mount_all启动解析,其中system\core\fs_mgr有被vold,adb等模块用来解析

fstab.xxx等分区文件。

(6)根据第三步中指定的分区大小,进行打包对应分区的img文件

releaseimage.sh, mkimage.sh, build_image.sh, make_usb_upgrade.sh等脚本中,会根据第三步设置的大小来制作img文件

如mkimage.sh

function make-images()
{
mkdir -p $RELEASE_OUT
mkdir -p $RELEASE_OUT/scripts gernerate-script-start # Raw partition must be first.
make-raw-partition
make-split-fs-partition system $BOARD_SYSTEMIMAGE_PARTITION_SIZE true
make-fs-partition userdata $BOARD_USERDATAIMAGE_PARTITION_SIZE true
make-fs-partition cache $BOARD_CACHEIMAGE_PARTITION_SIZE true
make-fs-partition tvservice $BOARD_TVSERVICEIMAGE_PARTITION_SIZE false
make-fs-partition tvconfig $BOARD_TVCONFIGIMAGE_PARTITION_SIZE false
make-fs-partition tvdatabase $BOARD_TVDATABASEIMAGE_PARTITION_SIZE false
make-fs-partition tvcustomer $BOARD_TVCUSTOMERIMAGE_PARTITION_SIZE false
......
...... }

buiild_image.sh文件

#make-fs-partition $PARTITION_NAME $PARTITION_SIZE $PARTITION_LZO
function make-fs-partition()
{
echo -e "\033[31mMake fs $1 partition...\033[0m"
local PARTITION_NAME=$
local PARTITION_SIZE=$
local PARTITION_LZO=$ # Generate image
gernerate-fs-image $PARTITION_NAME $PARTITION_SIZE $PARTITION_LZO release-fs-partition $PARTITION_NAME $PARTITION_SIZE $PARTITION_LZO
} function gernerate-fs-image()
{
local PARTITION_NAME=$
local PARTITION_SIZE=$
local PARTITION_LZO=$ if [ "$PARTITION_NAME" == "userdata" ]; then
local MOUNT_POINT=data
else
local MOUNT_POINT=$PARTITION_NAME
fi local TARGET_OUT=$PRODUCT_OUT/$MOUNT_POINT
if [ ! -d "$TARGET_OUT" ]; then
echo "No $TARGET_OUT directory to gernerate image."
return
fi if [ "$PARTITION_NAME" == "system" -o "$PARTITION_NAME" == "userdata" -o "$PARTITION_NAME" == "cache" -o "$PARTITION_NAME" == "systembackup" ]; then
if [ $PARTITION_NAME == "system" ]; then
local IMAGE_INFO=$PRODUCT_OUT/obj/PACKAGING/systemimage_intermediates/system_image_info.txt
else
local IMAGE_INFO=$PRODUCT_OUT/obj/PACKAGING/"$PARTITION_NAME"_intermediates/"$PARTITION_NAME"_image_info.txt
fi generate-userimage-prop-dictionary $IMAGE_INFO
./build/tools/releasetools/build_image.py $TARGET_OUT $IMAGE_INFO $PRODUCT_OUT/$PARTITION_NAME.img
else
<span style="background-color: rgb(0, 102, 0);">make_ext4fs -S $PRODUCT_OUT/root/file_contexts -l $PARTITION_SIZE -a $MOUNT_POINT $PRODUCT_OUT/$PARTITION_NAME.img $TARGET_OUT</span>
fi
}

Android系统分区的更多相关文章

  1. Android系统分区理解及分区目录细解

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  2. Android系统分区理解及分区目录细解【转】

    本文转载自:https://blog.csdn.net/u010001503/article/details/51853822 Android 通常有以下分区: System分区: 就是我们刷ROM的 ...

  3. Android系统定制和源码开发以及源码编译(附视频)

    Android系统定制配套视频: 为了把Android系统源码定制和编译的课程讲完,从准备到录制完所有的视频,一共花去了近半年的时间,前前后后各种下载源码,编译源码,系统不兼容,版本适配,虚拟机配置困 ...

  4. 深入学习Android系统上mount命令的使用

    博客链接:http://blog.csdn.net/qq1084283172/article/details/52493227 在Android系统的预装apk病毒和elf病毒的清除时,经常需要先获取 ...

  5. Android 系统开发学习杂记(转)

    http://blog.csdn.net/shagoo/article/details/6709430 > 开发环境1.安装 Eclipse 和 android-sdk 并解压安装2.Eclip ...

  6. Android系统在超级终端下必会的命令大全(adb shell命令大全)

    . 显示系统中全部Android平台: android list targets . 显示系统中全部AVD(模拟器): android list avd . 创建AVD(模拟器): android c ...

  7. Android系统Recovery工作原理之使用update.zip升级过程分析(一)

    通过分析update.zip包在具体Android系统升级的过程,来理解Android系统中Recovery模式服务的工作原理.我们先从update.zip包的制作开始,然后是Android系统的启动 ...

  8. Android系统Root原理初探(转)

    http://www.imooc.com/learn/126 chkconfig setup 解压update.zip这个文件,可发现它一般打包了如下这几个文件: 或者没有updates而是syste ...

  9. Android系统Recovery工作原理之使用update.zip升级过程---updater-script脚本语法简介以及执行流程(转)

    目前update-script脚本格式是edify,其与amend有何区别,暂不讨论,我们只分析其中主要的语法,以及脚本的流程控制. 一.update-script脚本语法简介: 我们顺着所生成的脚本 ...

随机推荐

  1. iview表单数字验证

    sort: [ {required: true, message: '请填写栏目排序', trigger: 'blur'}, {type: 'number', message: '请输入数字', tr ...

  2. CentOS7编译安装httpd-2.4.41 php7.3

    CentOS7编译安装httpd-2.4.41 php7.3 安装参考环境: CentOS Linux release 7.5.1804 (Core) 一.安装依赖包 httpd安装的依赖包 # yu ...

  3. HTML&CSS基础-边框简写属性

    HTML&CSS基础-边框简写属性 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.HTML源代码 <!DOCTYPE html> <html> ...

  4. Python_Day2_共享你的代码

    一.编写简单的函数,保存一下. # coding=utf-8 """ 这是“nester.py”模块,提供了一个名为print_lol的函数,这个函数的作用是打印列表,其 ...

  5. Eclips+ADT+SDK构建android开发环境及android自动化测试开发环境

    一. 需要用到的包: 1.adt-bundle-windows-x86_64-20140702.zip+JDK+ant 2.ant下载地址:http://ant.apache.org/bindownl ...

  6. 个性化排序算法实践(二)——FFM算法

    场感知分解机(Field-aware Factorization Machine ,简称FFM)在FM的基础上进一步改进,在模型中引入类别的概念,即field.将同一个field的特征单独进行one- ...

  7. python算法与数据结构-选择排序算法(33)

    一.选择排序的介绍 选择排序(Selection sort)是一种简单直观的排序算法.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素, ...

  8. 创建数据库表时,如何设置mysql中时间的默认值

    应用场景: 1.在数据表中,要记录每条数据是什么时候创建的,不需要应用程序去特意记录,而由数据数据库获取当前时间自动记录创建时间: 2.在数据库中,要记录每条数据是什么时候修改的,不需要应用程序去特意 ...

  9. 十四.Protobuf3扩展

    在您发布使用Protocol Buffer区的代码后,您迟早会因为业务需求变更想要“改进”Protocol Buffer的定义.如果你想让你的新Protocol Buffer向后兼容,让你的旧Prot ...

  10. 二.protobuf3数据类型

    定义数据类型 首先让我们看一个非常简单的例子.假设您想要定义搜索请求消息格式,其中每个搜索请求都有一个查询字符串.您感兴趣的特定结果页面以及每页的结果数量.这是用来定义消息类型的.proto文件. s ...