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. Android笔记(六十九) 仿微信界面(一)

          综合之前的Fragment和自定义组件的知识,实现微信界面 MainActivity.java package cn.lixyz.test; import android.app.Acti ...

  2. mac中git使用

    配置用户名及邮箱在使用Git提交前,必须配置用户名和邮箱,这些信息会永久保存到历史记录中.git config --global user.name "xxxxxx"git con ...

  3. 2013.4.24 - KDD第六天

    今天早上,中秋给我发了一个压缩包,里面有战德臣的课件,昨天我说我SQL没学好,他说给我发战徳臣课件,然后说我SQL不会的话可以看这个,还有两篇文 章<LDA数学八卦>以及<A Not ...

  4. Java精通并发-透过openjdk源码分析wait与notify方法的本地实现

    上一次https://www.cnblogs.com/webor2006/p/11442551.html中通过openjdk从c++的底层来审视了ObjectMonitor的底层实现,这次继续来探究底 ...

  5. P3225 [HNOI2012]矿场搭建[割点]

    题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之 ...

  6. Java volatile关键字实现原理

    场景引入 可见性问题 先来看一张图: 上面的图,是简化版的Java内存模型,一个线程有自己的工作内存,同时还有一个共享的主内存. 线程1和线程2读取数据data时,先从主内存里加载data变量的值到工 ...

  7. 神经网络(4)---神经网络是如何帮助我们学习复杂的nonlinear hypotheses

    神经网络是如何一步步进行计算的,以及对计算过程的向量化 Z1(2),Z2(2),Z3(2) are just weighted linear combination of input value x1 ...

  8. vue3 RFC初尝试

    由于vue3.x还没有正式发布,所以可以通过安装包vue-function-api提前尝试 npm install vue-function-api --save main.js import Vue ...

  9. quiver()函数

    1.quiver函数 一般用于绘制二维矢量场图,函数调用方法如下: 1 quiver(x,y,u,v) 该函数展示了点(x,y)对应的的矢量(u,v).其中,x的长度要求等于u.v的列数,y的长度要求 ...

  10. 初学 Size Balanced Tree(bzoj3224 tyvj1728 普通平衡树)

    SBT(Size Balance Tree), 即一种通过子树大小(size)保持平衡的BST SBT的基本性质是:每个节点的size大小必须大于等于其兄弟的儿子的size大小: 当我们插入或者删除一 ...