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. vscode编辑器自定义配置

    { //删除文件确认 "explorer.confirmDelete": false, // 主题 "workbench.iconTheme": "v ...

  2. 将Centos7的yum配置为阿里云的镜像(完美解决yum下载太慢的问题)

    2017-02-17 16:02:30 张老湿 阅读数 13768     http://mirrors.aliyun.com/help/centos?spm=5176.bbsr150321.0.0. ...

  3. LeetCode - 92、反转链表 II

    反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明:    1 ≤ m ≤ n ≤ 链表长度. 示例: 输入: 1->2->3->4->5->NULL, m ...

  4. python模块统计

    .处理日期和时间 datetime/time/pytz/dateutil/calendar 注:calendar有很广泛的方法用来处理年历和月历,例如打印某月的月历 .处理字符串 re .处理字符集编 ...

  5. 使用SikuliX定位Object(flash)元素

    先说一下背景,这个是我们测试的系统上的一个上传文件的地方,但是用传统的selenium方法很难定位的到.具体的样子是下面这样的. 使用id等属性定位做点击操作好像不能直接操作.无奈之下,只好从网上找找 ...

  6. readme.txt 为什么我们不重视

    1.很多源码项目下面都有编译说明,readme 2.我们的电脑上每个目录都有很多文件,我们似乎可以建立一个readme.txt 知道是什么 节约一些时间

  7. DT开发笔记-Cookie作用域的设置

    当网站任意一个模块绑定了二级域名或者会员公司主页开启了二级域名时,必须设置cookie作用域,否则会导致二级域名站点不能显示正确的登录状态,js权限错误等问题(例如评论框显示不完全的现象). 进入网站 ...

  8. javaweb-servlet获取给定文件在服务器上的绝对路径的方法

    1.通过ServletContext获取 在tomcat5,6,7版本中我们可以通过ServletContext来获取给定文件在服务器上的绝对路径. ServletContext context = ...

  9. js弹窗输入

    <html> <head> <title>js输入对话框</title> </head> <body> <script l ...

  10. 创建型模式(四) 建造者\生成器模式(Builder)

    一.动机(Motivation) 在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成:由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们 ...