[Guide][Technical]Modifying your rom for alternate layouts

TheManii

Wiki Admin / Recognized Contributor
Dec 8, 2010
3,585
1,649
0
Warning:
This is an advanced level guide! You must already understand how to work with ramdisks and repacking them.
The guide will not cover any of the basics on how to modify and work with kernels and their ramdisks.
Introduction:
This is a guide to modify a rom to be compatable with alternate NVflash layouts.

Roms that are not modified are not able to otherwise take advantage of changes due to using a different layout.
The actual changes needed to be made are primarily in the mounts specificed in the ramdisk and the installer script for flashing the rom.
Changes are required to switch from /data/media and /emmc handling.

IT IS STRONGLY RECOMMENDED THAT ROM AUTHORS ADD THE SYSTEM CHECKS FURTHER IN THE GUIDE
Without the checks users will be able to inadvertantly flash the wrong kernel and thusly end up with a brick/bootloop.
Requirements:
  • Compatable development environment
    • A x86-64 GNU/Linux pc with symlink capable partitions (eg: extx partitions)
    • Perl
    • GZip
    • extract-ramdisk.pl (Link TBA)
    • split-bootimg.pl (Link TBA)
    • mkbootfs (Link TBA)
    • mkbootimg (Link TBA)
  • Strong understanding of command line
  • Understanding how to repack ramdisks
  • Clockworkmod 6.0.1.1+ or TWRP 2.2.1.4+
  • update-binary6 (CWM 6.0/ICS compatable update-binary)

Instructions:
  1. Modifying the ramdisk
    1. Extract and unpack your kernel and ramdisk with extract-ramdisk.pl and split-bootimg.pl
    2. Navigate to the extracted ramdisk and open init.rc
    3. Find the 'on fs' section where the mounting portion of the script is
    4. Change the /system portion to: (See partition layout for list of mountpoints)
      Code:
          mount <desired filesystem> /dev/block/<desired mountpoint> /system
          mount <desired filesystem> /dev/block/<desired mountpoint> /system rw remount
    5. If needed: change the /cache and /data portion to ext4 from ext3
    6. Rebuild the ramdisk with mkbootfs
    7. Rebuild kernel with mkbootimg
  2. Modifying rom for /data/media and /emmc support
    1. (Future versions of guide will include instructions for modifying android to support dual-sds)
  3. Modifying the install script
    1. Strongly recommended: add/modify the first line of the script to: (add as many as supported)
      Code:
          assert(getprop("ro.product.device") == "<desired layout>" || getprop("ro.build.product") == "<desired layout>");
    2. Modify format command to:
      Code:
          format("<desired FS>", "EMMC", "/dev/block/<desired mountpoint>", "0");
    3. Modify mount command to:
      Code:
          run_program("/sbin/busybox", "mount", "/system");
    4. Modify unmount command to:
      Code:
          run_program("/sbin/busybox", "umount", "/system");
    (See example below to dynamically select layout on install)
Changelog:
  • Sep 17 2012: Wrote initial guide
2char
 
Last edited:

TheManii

Wiki Admin / Recognized Contributor
Dec 8, 2010
3,585
1,649
0
Example update script: (Based on CM9mod/S7)
Code:
[COLOR="Red"]assert(getprop("ro.product.device") == "streak7"   || getprop("ro.build.product") == "streak7"  ||
       getprop("ro.product.device") == "streak7ex" || getprop("ro.build.product") == "streak7ex"||
       getprop("ro.product.device") == "streak7dm" || getprop("ro.build.product") == "streak7dm");
[/COLOR]
[COLOR="Silver"]ui_print("----------------------");
ui_print("|  Cyanogen Mod 9.0  |");
ui_print("|       b4-mod       |");
ui_print("|    By  DJ_Steve    |");
ui_print("|   and  Giveen      |");
ui_print("|                    |");
ui_print("|    Modified  by    |");
ui_print("|      TheManii      |");
ui_print("----------------------");
ui_print();
ui_print();
ui_print();
ui_print();
ui_print("Formatting system...");
show_progress(0.100000, 0);
format("ext4", "EMMC", "/dev/block/platform/sdhci-tegra.3/by-name/APP", "0");

ui_print("Mounting /system...");
show_progress(0.050000, 0);[/COLOR]
[COLOR="Blue"]run_program("/sbin/busybox", "mount", "/system");[/COLOR]
[COLOR="Silver"]ui_print("Extracting files...");
show_progress(0.500000, 0);
package_extract_dir("system", "/system");
ui_print("Creating symlinks...");
show_progress(0.100000, 0);
symlink("Roboto-Bold.ttf", "/system/fonts/DroidSans-Bold.ttf");
symlink("Roboto-Regular.ttf", "/system/fonts/DroidSans.ttf");
symlink("busybox", "/system/xbin/[", "/system/xbin/[[",
        "/system/xbin/adjtimex", "/system/xbin/arp", "/system/xbin/ash",
        "/system/xbin/awk", "/system/xbin/base64", "/system/xbin/basename",
        "/system/xbin/bbconfig", "/system/xbin/blkid", "/system/xbin/blockdev",
        "/system/xbin/brctl", "/system/xbin/bunzip2", "/system/xbin/bzcat",
        "/system/xbin/bzip2", "/system/xbin/cal", "/system/xbin/cat",
        "/system/xbin/catv", "/system/xbin/chattr", "/system/xbin/chgrp",
        "/system/xbin/chmod", "/system/xbin/chown", "/system/xbin/chroot",
        "/system/xbin/clear", "/system/xbin/cmp", "/system/xbin/comm",
        "/system/xbin/cp", "/system/xbin/cpio", "/system/xbin/crond",
        "/system/xbin/crontab", "/system/xbin/cut", "/system/xbin/date",
        "/system/xbin/dc", "/system/xbin/dd", "/system/xbin/depmod",
        "/system/xbin/devmem", "/system/xbin/df", "/system/xbin/diff",
        "/system/xbin/dirname", "/system/xbin/dmesg", "/system/xbin/dnsd",
        "/system/xbin/dos2unix", "/system/xbin/du", "/system/xbin/echo",
        "/system/xbin/ed", "/system/xbin/egrep", "/system/xbin/env",
        "/system/xbin/expand", "/system/xbin/expr", "/system/xbin/false",
        "/system/xbin/fdisk", "/system/xbin/fgrep", "/system/xbin/find",
        "/system/xbin/flash_lock", "/system/xbin/flash_unlock",
        "/system/xbin/flashcp", "/system/xbin/flock", "/system/xbin/fold",
        "/system/xbin/free", "/system/xbin/freeramdisk", "/system/xbin/fsync",
        "/system/xbin/ftpget", "/system/xbin/ftpput", "/system/xbin/fuser",
        "/system/xbin/getopt", "/system/xbin/grep", "/system/xbin/groups",
        "/system/xbin/gunzip", "/system/xbin/gzip", "/system/xbin/halt",
        "/system/xbin/head", "/system/xbin/hexdump", "/system/xbin/id",
        "/system/xbin/ifconfig", "/system/xbin/insmod", "/system/xbin/install",
        "/system/xbin/iostat", "/system/xbin/ip", "/system/xbin/kill",
        "/system/xbin/killall", "/system/xbin/killall5", "/system/xbin/length",
        "/system/xbin/less", "/system/xbin/ln", "/system/xbin/losetup",
        "/system/xbin/ls", "/system/xbin/lsattr", "/system/xbin/lsmod",
        "/system/xbin/lsusb", "/system/xbin/lzcat", "/system/xbin/lzma",
        "/system/xbin/lzop", "/system/xbin/lzopcat", "/system/xbin/man",
        "/system/xbin/md5sum", "/system/xbin/mesg", "/system/xbin/mkdir",
        "/system/xbin/mke2fs", "/system/xbin/mkfifo", "/system/xbin/mkfs.ext2",
        "/system/xbin/mkfs.vfat", "/system/xbin/mknod", "/system/xbin/mkswap",
        "/system/xbin/mktemp", "/system/xbin/modinfo", "/system/xbin/modprobe",
        "/system/xbin/more", "/system/xbin/mount", "/system/xbin/mountpoint",
        "/system/xbin/mpstat", "/system/xbin/mv", "/system/xbin/nanddump",
        "/system/xbin/nandwrite", "/system/xbin/netstat", "/system/xbin/nice",
        "/system/xbin/nohup", "/system/xbin/nslookup", "/system/xbin/ntpd",
        "/system/xbin/od", "/system/xbin/patch", "/system/xbin/pgrep",
        "/system/xbin/pidof", "/system/xbin/ping", "/system/xbin/pkill",
        "/system/xbin/pmap", "/system/xbin/poweroff", "/system/xbin/printenv",
        "/system/xbin/printf", "/system/xbin/ps", "/system/xbin/pstree",
        "/system/xbin/pwd", "/system/xbin/pwdx", "/system/xbin/rdev",
        "/system/xbin/readlink", "/system/xbin/realpath", "/system/xbin/renice",
        "/system/xbin/reset", "/system/xbin/resize", "/system/xbin/rev",
        "/system/xbin/rm", "/system/xbin/rmdir", "/system/xbin/rmmod",
        "/system/xbin/route", "/system/xbin/run-parts", "/system/xbin/rx",
        "/system/xbin/sed", "/system/xbin/seq", "/system/xbin/setconsole",
        "/system/xbin/setserial", "/system/xbin/setsid", "/system/xbin/sh",
        "/system/xbin/sha1sum", "/system/xbin/sha256sum",
        "/system/xbin/sha512sum", "/system/xbin/sleep", "/system/xbin/sort",
        "/system/xbin/split", "/system/xbin/stat", "/system/xbin/strings",
        "/system/xbin/stty", "/system/xbin/sum", "/system/xbin/swapoff",
        "/system/xbin/swapon", "/system/xbin/sync", "/system/xbin/sysctl",
        "/system/xbin/tac", "/system/xbin/tail", "/system/xbin/tar",
        "/system/xbin/taskset", "/system/xbin/tee", "/system/xbin/telnet",
        "/system/xbin/telnetd", "/system/xbin/test", "/system/xbin/tftp",
        "/system/xbin/tftpd", "/system/xbin/time", "/system/xbin/timeout",
        "/system/xbin/top", "/system/xbin/touch", "/system/xbin/tr",
        "/system/xbin/traceroute", "/system/xbin/true", "/system/xbin/ttysize",
        "/system/xbin/tune2fs", "/system/xbin/umount", "/system/xbin/uname",
        "/system/xbin/uncompress", "/system/xbin/unexpand", "/system/xbin/uniq",
        "/system/xbin/unix2dos", "/system/xbin/unlzma", "/system/xbin/unlzop",
        "/system/xbin/unxz", "/system/xbin/unzip", "/system/xbin/uptime",
        "/system/xbin/usleep", "/system/xbin/uudecode", "/system/xbin/uuencode",
        "/system/xbin/vi", "/system/xbin/watch", "/system/xbin/wc",
        "/system/xbin/wget", "/system/xbin/which", "/system/xbin/whoami",
        "/system/xbin/xargs", "/system/xbin/xz", "/system/xbin/xzcat",
        "/system/xbin/yes",
        "/system/xbin/zcat");
symlink("dosfsck", "/system/bin/fsck_msdos");
symlink("mksh", "/system/bin/sh");
symlink("toolbox", "/system/bin/cat", "/system/bin/chmod",
        "/system/bin/chown", "/system/bin/cmp", "/system/bin/date",
        "/system/bin/dd", "/system/bin/df", "/system/bin/dmesg",
        "/system/bin/getevent", "/system/bin/getprop", "/system/bin/hd",
        "/system/bin/id", "/system/bin/ifconfig", "/system/bin/iftop",
        "/system/bin/insmod", "/system/bin/ioctl", "/system/bin/ionice",
        "/system/bin/kill", "/system/bin/ln", "/system/bin/log",
        "/system/bin/ls", "/system/bin/lsmod", "/system/bin/lsof",
        "/system/bin/mkdir", "/system/bin/mount", "/system/bin/mv",
        "/system/bin/nandread", "/system/bin/netstat",
        "/system/bin/newfs_msdos", "/system/bin/notify", "/system/bin/printenv",
        "/system/bin/ps", "/system/bin/r", "/system/bin/reboot",
        "/system/bin/renice", "/system/bin/rm", "/system/bin/rmdir",
        "/system/bin/rmmod", "/system/bin/route", "/system/bin/schedtop",
        "/system/bin/sendevent", "/system/bin/setconsole",
        "/system/bin/setprop", "/system/bin/sleep", "/system/bin/smd",
        "/system/bin/start", "/system/bin/stop", "/system/bin/sync",
        "/system/bin/top", "/system/bin/touch", "/system/bin/umount",
        "/system/bin/uptime", "/system/bin/vmstat", "/system/bin/watchprops",
        "/system/bin/wipe");
ui_print("Setting permissions...");
show_progress(0.100000, 0);
set_perm_recursive(0, 0, 0755, 0644, "/system");
set_perm_recursive(0, 0, 0755, 0755, "/system/addon.d");
set_perm_recursive(0, 2000, 0755, 0755, "/system/bin");
set_perm(0, 3003, 02750, "/system/bin/netcfg");
set_perm(0, 3004, 02755, "/system/bin/ping");
set_perm(0, 1000, 06750, "/system/bin/rebootcmd");
set_perm(0, 2000, 06750, "/system/bin/run-as");
set_perm_recursive(1002, 1002, 0755, 0440, "/system/etc/bluetooth");
set_perm(0, 0, 0755, "/system/etc/bluetooth");
set_perm(1000, 1000, 0640, "/system/etc/bluetooth/auto_pairing.conf");
set_perm(3002, 3002, 0444, "/system/etc/bluetooth/blacklist.conf");
set_perm(1002, 1002, 0440, "/system/etc/dbus.conf");
set_perm(1014, 2000, 0550, "/system/etc/dhcpcd/dhcpcd-run-hooks");
set_perm_recursive(0, 2000, 0755, 0755, "/system/etc/init.d");
set_perm(0, 0, 0755, "/system/etc/init.d");
set_perm(0, 2000, 0550, "/system/etc/init.goldfish.sh");
set_perm_recursive(0, 0, 0755, 0555, "/system/etc/ppp");
set_perm_recursive(0, 2000, 0755, 0644, "/system/vendor");
set_perm(0, 0, 0644, "/system/vendor/etc/audio_effects.conf");
set_perm_recursive(0, 2000, 0755, 0755, "/system/xbin");
set_perm(0, 0, 06755, "/system/xbin/librank");
set_perm(0, 0, 06755, "/system/xbin/procmem");
set_perm(0, 0, 06755, "/system/xbin/procrank");
set_perm(0, 0, 06755, "/system/xbin/su");
ui_print("Flashing boot...");
show_progress(0.100000, 0);[/COLOR]

[COLOR="Blue"]if getprop("ro.product.device") == "streak7" 
then 
#{
      assert(package_extract_file("boot.img", "/dev/block/platform/sdhci-tegra.3/by-name/LNX"));
      ui_print("streak7")
#}
else if getprop("ro.product.device") == "streak7ex" 
then
#{
      assert(package_extract_file("bootex.img", "/dev/block/platform/sdhci-tegra.3/by-name/LNX"));
      ui_print("streak7ex")
#}
else if getprop("ro.product.device") == "streak7dm"
then
#{
      assert(package_extract_file("bootdm.img", "/dev/block/platform/sdhci-tegra.3/by-name/LNX"));
      ui_print("streak7dm")
#}
else
#{
   abort("unknown device")
#}
endif; endif; endif;[/COLOR]

[COLOR="Silver"]ui_print("Unmounting /system...");
show_progress(0.050000, 0);[/COLOR]
[COLOR="Blue"]run_program("/sbin/busybox", "umount", "/system");[/COLOR]
[COLOR="Silver"]ui_print("Installation complete!");[/COLOR]
Legend:
  • Red: Optional, but strongly recommended
  • Blue: Required code changes
  • Gray: Underlying script
Details:
Example script includes support for:
  • streak7
  • streak7ex
  • streak7dm

Also:
  • { and } are not actually supported in edify, they are merely comments to help script authors visualise the script's organization
  • If you are unable to support a specific layout, simply remove the associated lines for that layout
  • The script will echo what layout the device is at the end of the install

New layout for update.zip
  • META-INF
  • system
  • <any other dirs>
  • boot.img - streak7
  • bootex.img - streak7ex
  • bootdm.img - streak7dm
  • <any other files>
2char
 
Last edited:

TheManii

Wiki Admin / Recognized Contributor
Dec 8, 2010
3,585
1,649
0
Recommended naming scheme:
It is recommended to standardize the naming scheme of your update zips.
This is the naming scheme I use (and applies for all my releases across all dell devices):

update-<device>-<title>-<version>-<revision>.zip

  • <device>: only used if update being flashed contains device specific contents, otherwise left out
  • <title>: name of update, without version number
  • <version>: actual version number (major)
  • <revision>: revision number (minor)

Examples would be:
  • update-S5-S5ex-S5sd-paranoidandroid-1.1-b1.zip
    • device: S5 or S5ex or S5sd
    • version: 1.1
    • revision: b1
  • update-S10-CM9-120715-mod-1.zip
    • device: S10
    • version: 120715-mod
    • revision: 1
  • update-Gapps-Opt-GB-20712.zip
    • device: any
    • version: GB
    • revision: 20172

Standardized date stamp I use is: YmmDD
  • Where Y is the last digit of the year
  • MM is the month
  • DD is the day
2char
 
Last edited: