Implement 'multirom_zip' make target

* This will create install ZIP file to flash via recovery.
This commit is contained in:
Vojtech Bocek
2013-07-23 22:55:54 +02:00
parent 375dd9a0b0
commit 1a0c76e6e0
24 changed files with 1486 additions and 3 deletions

View File

@@ -53,3 +53,6 @@ include $(BUILD_EXECUTABLE)
# Trampoline
include $(multirom_local_path)/trampoline/Android.mk
# ZIP installer
include $(multirom_local_path)/install_zip/Android.mk

View File

@@ -11,4 +11,8 @@ Clone repo to some folder inside Android 4.1.x source tree, I use `/system/extra
. build/envsetup.h
lunch full_grouper-userdebug
make multirom trampoline -j4
make -j4 multirom trampoline
To build installation ZIP file, use `multirom_zip` target:
make -j4 multirom_zip

View File

@@ -1,3 +1,4 @@
# MultiROM device file for Nexus 7
MULTIROM_THEMES := 800x1280 1280x800
BOOT_DEV := /dev/block/platform/sdhci-tegra.3/by-name/LNX

30
install_zip/Android.mk Normal file
View File

@@ -0,0 +1,30 @@
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
install_zip_path := $(multirom_local_path)/install_zip
MULTIROM_ZIP_TARGET := $(PRODUCT_OUT)/multirom
MULTIROM_INST_DIR := $(PRODUCT_OUT)/multirom_installer
multirom_binary := $(TARGET_ROOT_OUT)/multirom
trampoline_binary := $(TARGET_ROOT_OUT)/trampoline
# include device file
include $(multirom_local_path)/device_$(TARGET_DEVICE).mk
$(MULTIROM_ZIP_TARGET): multirom trampoline signapk
@echo ----- Making MultiROM ZIP installer ------
rm -rf $(MULTIROM_INST_DIR)
mkdir -p $(MULTIROM_INST_DIR)
cp -a $(install_zip_path)/prebuilt/* $(MULTIROM_INST_DIR)/
cp -a $(TARGET_ROOT_OUT)/multirom $(MULTIROM_INST_DIR)/multirom/
cp -a $(TARGET_ROOT_OUT)/trampoline $(MULTIROM_INST_DIR)/multirom/
echo $(BOOT_DEV) > $(MULTIROM_INST_DIR)/scripts/bootdev
$(install_zip_path)/make_updater_script.sh $(TARGET_DEVICE) $(MULTIROM_INST_DIR)/META-INF/com/google/android
rm -f $(MULTIROM_ZIP_TARGET).zip $(MULTIROM_ZIP_TARGET)-unsigned.zip
cd $(MULTIROM_INST_DIR) && zip -qr ../$(notdir $@)-unsigned.zip *
java -jar $(HOST_OUT_JAVA_LIBRARIES)/signapk.jar $(DEFAULT_SYSTEM_DEV_CERTIFICATE).x509.pem $(DEFAULT_SYSTEM_DEV_CERTIFICATE).pk8 $(MULTIROM_ZIP_TARGET)-unsigned.zip $(MULTIROM_ZIP_TARGET).zip
@echo ----- Made MultiROM ZIP installer -------- $@.zip
.PHONY: multirom_zip
multirom_zip: $(MULTIROM_ZIP_TARGET)

9
install_zip/README.md Normal file
View File

@@ -0,0 +1,9 @@
# MultiROM ZIP installer
This folder contains prebuilt part of the ZIP installer for MultiROM - the file
which is flashed in recovery and it installs MultiROM to the device.
To build the ZIP file, use target `multirom_zip`.
make multirom_zip
The zip file is automatically signed with testkey.

View File

@@ -0,0 +1,39 @@
#!/bin/sh
DEVICES=$1
SCRIPT_PATH=$2
CHECK_PROPS="ro.product.device ro.build.product"
if [ "$#" -ne "2" ]; then
echo "Usage: $0 [device] [path to folder with updater-script]"
exit 1
fi
# Some devices have multiple variants, which are almost the same,
# Example: grouper and tilapia (WiFi and 3G versions of Nexus 7)
case "$DEVICES" in
"grouper")
DEVICES="${DEVICES} tilapia"
;;
esac
fail()
{
echo make_updater_script.sh has failed: $1
exit 1
}
mv ${SCRIPT_PATH}/updater-script ${SCRIPT_PATH}/updater-script-base || fail "Failed to copy updater-script base"
assert_str="assert("
for dev in $DEVICES; do
for prop in $CHECK_PROPS; do
assert_str="${assert_str}getprop(\"$prop\") == \"$dev\" || "
done
assert_str="${assert_str}\n "
done
assert_str="${assert_str% || \\n *});\n"
echo -e "$assert_str" > ${SCRIPT_PATH}/updater-script || fail "Failed to write assert line into updater-script!"
cat ${SCRIPT_PATH}/updater-script-base >> ${SCRIPT_PATH}/updater-script || fail "Failed to add base updater-script file!"
rm ${SCRIPT_PATH}/updater-script-base

View File

@@ -0,0 +1,40 @@
# Assert check for appropriate device is added during build,
# see ../make_updater_script.sh and ../Android.mk
ui_print("MultiROM for Nexus 7");
show_progress(1.00000, 10);
ui_print("Extracting binaries...");
run_program("/sbin/busybox", "mount", "/data");
delete_recursive("/tmp/multirom");
run_program("/sbin/busybox", "mkdir", "/tmp/multirom");
package_extract_dir("multirom", "/tmp/multirom/");
package_extract_dir("scripts", "/tmp/");
set_perm(0, 0, 0777, "/tmp/multirom/busybox");
set_perm(0, 0, 0777, "/tmp/mkbootimg");
set_perm(0, 0, 0777, "/tmp/unpackbootimg");
set_perm(0, 0, 0777, "/tmp/lz4");
set_perm(0, 0, 0777, "/tmp/extract_multirom.sh");
set_perm(0, 0, 0777, "/tmp/inject_boot.sh");
assert(run_program("/tmp/extract_multirom.sh") == 0);
ui_print("Injecting boot image...");
assert(run_program("/tmp/inject_boot.sh") == 0);
ui_print("Cleaning up...");
delete_recursive("/tmp/boot");
delete_recursive("/tmp/multirom");
delete("/tmp/mkbootimg");
delete("/tmp/lz4");
delete("/tmp/boot.img-cmdline");
delete("/tmp/boot.img-ramdisk.gz");
delete("/tmp/boot.img-zImage");
delete("/tmp/unpackbootimg");
delete("/tmp/boot.img");
delete("/tmp/newboot.img");
delete("/tmp/extract_multirom.sh");
delete("/tmp/inject_boot.sh");
ui_print("Installation complete!");

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,44 @@
# This file contains info about ROMs capabilites and boot process.
# It should be placed in ROM's folder (eg. /media/multirom/roms/*rom_name*)
# and must be named "rom_info.txt".
# Make sure you got the syntax correct, as the parser is probably pretty
# dumb. Lines with comments must start with #. Beware the whitespaces.
# If you need to use " character in string, just use it, no need to escape it
# MultiROM searches for first and last " on the line.
# These comments should not be deleted.
# So far, the only supported ROM type for these files is kexec-based linux
type="kexec"
# Paths to root of the ROM.
# Both image and folder can be specified at one time, MultiROM will use
# the one which it can find. If both are present, folder is used.
# Must _not_ contain spaces.
# Path is from root of the root partition, but you will usually want
# to use following alias:
# - %m - ROM's folder (eg. /media/multirom/roms/*rom_name*)
root_dir="%m/root"
root_img="%m/root.img"
root_img_fs="ext4"
# Path to kernel and initrd. Kernel path _must_ be specified.
# Paths are relative to the folder in which is this file
# Those can be outside the root folder/image, or use %r if it is in there:
# kernel_path="%r/boot/vmlinuz"
# If ROM is in images, it will mount the image and load it from there.
# You can use * _at the end of the filename_ as wildcard character.
kernel_path="%r/boot/vmlinuz"
initrd_path="%r/boot/initrd.img"
# Set up the cmdline
# img_cmdline and dir_cmdline are appended to base_cmdline.
# Several aliases are used:
# - %b - base command line from bootloader. You want this as first thing in cmdline.
# - %d - root device. is either "UUID=..." (USB drive) or "/dev/mmcblk0p9" or "/dev/mmcblk0p10"
# - %r - root fs type
# - %s - root directory, from root of the root device
# - %i - root image, from root of the root device
# - %f - fs of the root image
base_cmdline="%b root=%d rootfstype=%r rw console=tty0 access=m2 quiet splash rootflags=defaults,noatime,nodiratime"
img_cmdline="loop=%i loopfstype=%f"
dir_cmdline="rootsubdir=%s"

View File

@@ -0,0 +1,44 @@
# This file contains info about ROMs capabilites and boot process.
# It should be placed in ROM's folder (eg. /media/multirom/roms/*rom_name*)
# and must be named "rom_info.txt".
# Make sure you got the syntax correct, as the parser is probably pretty
# dumb. Lines with comments must start with #. Beware the whitespaces.
# If you need to use " character in string, just use it, no need to escape it
# MultiROM searches for first and last " on the line.
# These comments should not be deleted.
# So far, the only supported ROM type for these files is kexec-based linux
type="kexec"
# Paths to root of the ROM.
# Both image and folder can be specified at one time, MultiROM will use
# the one which it can find. If both are present, folder is used.
# Must _not_ contain spaces.
# Path is from root of the root partition, but you will usually want
# to use following alias:
# - %m - ROM's folder (eg. /media/multirom/roms/*rom_name*)
root_dir="%m"
root_img="%m/data.img"
root_img_fs="ext4"
# Path to kernel and initrd. Kernel path _must_ be specified.
# Paths are relative to the folder in which is this file
# Those can be outside the root folder/image, or use %r if it is in there:
# kernel_path="%r/boot/vmlinuz"
# If ROM is in images, it will mount the image and load it from there.
# You can use * _at the end of the filename_ as wildcard character.
kernel_path="zImage"
initrd_path="initrd.img"
# Set up the cmdline
# img_cmdline and dir_cmdline are appended to base_cmdline.
# Several aliases are used:
# - %b - base command line from bootloader. You want this as first thing in cmdline.
# - %d - root device. is either "UUID=..." (USB drive) or "/dev/mmcblk0p9" or "/dev/mmcblk0p10"
# - %r - root fs type
# - %s - root directory, from root of the root device
# - %i - root image, from root of the root device
# - %f - fs of the root image
base_cmdline="%b console=tty1 root=%d rootfstype=%r rw rootflags=defaults,noatime,nodiratime"
img_cmdline="loop=%s loopfstype=%f"
dir_cmdline="rootsubdir=%s"

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,357 @@
#!/bin/sh
[ -d /dev ] || mkdir -m 0755 /dev
[ -d /root ] || mkdir -m 0700 /root
[ -d /sys ] || mkdir /sys
[ -d /proc ] || mkdir /proc
[ -d /tmp ] || mkdir /tmp
mkdir -p /var/lock
mount -t sysfs -o nodev,noexec,nosuid sysfs /sys
mount -t proc -o nodev,noexec,nosuid proc /proc
# Some things don't work properly without /etc/mtab.
ln -sf /proc/mounts /etc/mtab
grep -q '\<quiet\>' /proc/cmdline || echo "Loading, please wait..."
# Note that this only becomes /dev on the real filesystem if udev's scripts
# are used; which they will be, but it's worth pointing out
if ! mount -t devtmpfs -o mode=0755 udev /dev; then
echo "W: devtmpfs not available, falling back to tmpfs for /dev"
mount -t tmpfs -o mode=0755 udev /dev
[ -e /dev/console ] || mknod -m 0600 /dev/console c 5 1
[ -e /dev/null ] || mknod /dev/null c 1 3
fi
mkdir /dev/pts
mount -t devpts -o noexec,nosuid,gid=5,mode=0620 devpts /dev/pts || true
mount -t tmpfs -o "noexec,nosuid,size=10%,mode=0755" tmpfs /run
mkdir /run/initramfs
# compatibility symlink for the pre-oneiric locations
ln -s /run/initramfs /dev/.initramfs
# Export the dpkg architecture
export DPKG_ARCH=
. /conf/arch.conf
# Set modprobe env
export MODPROBE_OPTIONS="-qb"
# Export relevant variables
export ROOT=
export ROOTDELAY=
export ROOTFLAGS=
export ROOTFSTYPE=
export IP=
export BOOT=
export BOOTIF=
export UBIMTD=
export break=
export init=/sbin/init
export quiet=n
export readonly=y
export rootmnt=/root
export debug=
export panic=
export blacklist=
export resume=
export resume_offset=
export recovery=
export FLASH_KERNEL_SKIP=1
# mdadm needs hostname to be set. This has to be done before the udev rules are called!
if [ -f "/etc/hostname" ]; then
/bin/hostname -b -F /etc/hostname 2>&1 1>/dev/null
fi
# Bring in the main config
. /conf/initramfs.conf
for conf in conf/conf.d/*; do
[ -f ${conf} ] && . ${conf}
done
. /scripts/functions
# Parse command line options
for x in $(cat /proc/cmdline); do
case $x in
init=*)
init=${x#init=}
;;
root=*)
ROOT=${x#root=}
case $ROOT in
LABEL=*)
ROOT="${ROOT#LABEL=}"
# support any / in LABEL= path (escape to \x2f)
case "${ROOT}" in
*/*)
if command -v sed >/dev/null 2>&1; then
ROOT="$(echo ${ROOT} | sed 's,/,\\x2f,g')"
else
if [ "${ROOT}" != "${ROOT#/}" ]; then
ROOT="\x2f${ROOT#/}"
fi
if [ "${ROOT}" != "${ROOT%/}" ]; then
ROOT="${ROOT%/}\x2f"
fi
IFS='/'
newroot=
for s in $ROOT; do
newroot="${newroot:+${newroot}\\x2f}${s}"
done
unset IFS
ROOT="${newroot}"
fi
esac
ROOT="/dev/disk/by-label/${ROOT}"
;;
UUID=*)
ROOT="/dev/disk/by-uuid/${ROOT#UUID=}"
;;
/dev/nfs)
[ -z "${BOOT}" ] && BOOT=nfs
;;
esac
;;
rootflags=*)
ROOTFLAGS="-o ${x#rootflags=}"
;;
rootfstype=*)
ROOTFSTYPE="${x#rootfstype=}"
;;
rootdelay=*)
ROOTDELAY="${x#rootdelay=}"
case ${ROOTDELAY} in
*[![:digit:].]*)
ROOTDELAY=
;;
esac
;;
resumedelay=*)
RESUMEDELAY="${x#resumedelay=}"
;;
loop=*)
LOOP="${x#loop=}"
;;
loopflags=*)
LOOPFLAGS="-o ${x#loopflags=}"
;;
loopfstype=*)
LOOPFSTYPE="${x#loopfstype=}"
;;
rootsubdir=*)
ROOTSUBDIR="${x#rootsubdir=}"
;;
cryptopts=*)
cryptopts="${x#cryptopts=}"
;;
nfsroot=*)
NFSROOT="${x#nfsroot=}"
;;
netboot=*)
NETBOOT="${x#netboot=}"
;;
ip=*)
IP="${x#ip=}"
;;
boot=*)
BOOT=${x#boot=}
;;
ubi.mtd=*)
UBIMTD=${x#ubi.mtd=}
;;
resume=*)
RESUME="${x#resume=}"
;;
resume_offset=*)
resume_offset="${x#resume_offset=}"
;;
noresume)
noresume=y
;;
panic=*)
panic="${x#panic=}"
case ${panic} in
*[![:digit:].]*)
panic=
;;
esac
;;
quiet)
quiet=y
;;
ro)
readonly=y
;;
rw)
readonly=n
;;
debug)
debug=y
quiet=n
exec >/run/initramfs/initramfs.debug 2>&1
set -x
;;
debug=*)
debug=y
quiet=n
set -x
;;
break=*)
break=${x#break=}
;;
break)
break=premount
;;
blacklist=*)
blacklist=${x#blacklist=}
;;
netconsole=*)
netconsole=${x#netconsole=}
;;
BOOTIF=*)
BOOTIF=${x#BOOTIF=}
;;
hwaddr=*)
BOOTIF=${x#BOOTIF=}
;;
recovery)
recovery=y
;;
esac
done
if [ -n "${noresume}" ]; then
export noresume
unset resume
else
resume=${RESUME:-}
fi
maybe_break top
# export BOOT variable value for compcache,
# so we know if we run from casper
export BOOT
# Don't do log messages here to avoid confusing graphical boots
run_scripts /scripts/init-top
maybe_break modules
[ "$quiet" != "y" ] && log_begin_msg "Loading essential drivers"
load_modules
[ "$quiet" != "y" ] && log_end_msg
[ -n "${netconsole}" ] && modprobe netconsole netconsole="${netconsole}"
maybe_break premount
[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/init-premount"
run_scripts /scripts/init-premount
[ "$quiet" != "y" ] && log_end_msg
maybe_break mount
log_begin_msg "Mounting root file system"
. /scripts/${BOOT}
parse_numeric ${ROOT}
maybe_break mountroot
mountroot
log_end_msg
maybe_break bottom
[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/init-bottom"
run_scripts /scripts/init-bottom
[ "$quiet" != "y" ] && log_end_msg
# Preserve information on old systems without /run on the rootfs
if [ -d ${rootmnt}/run ]; then
mount -n -o move /run ${rootmnt}/run
else
# The initramfs udev database must be migrated:
if [ -d /run/udev ] && [ ! -d /dev/.udev ]; then
mv /run/udev /dev/.udev
fi
# The initramfs debug info must be migrated:
if [ -d /run/initramfs ] && [ ! -d /dev/.initramfs ]; then
mv /run/initramfs /dev/.initramfs
fi
umount /run
fi
# Move virtual filesystems over to the real filesystem
mount -n -o move /sys ${rootmnt}/sys
mount -n -o move /proc ${rootmnt}/proc
validate_init() {
checktarget="${1}"
# Work around absolute symlinks
if [ -d "${rootmnt}" ] && [ -h "${rootmnt}${checktarget}" ]; then
case $(readlink "${rootmnt}${checktarget}") in /*)
checktarget="$(chroot ${rootmnt} readlink ${checktarget})"
;;
esac
fi
# Make sure the specified init can be executed
if [ ! -x "${rootmnt}${checktarget}" ]; then
return 1
fi
# Upstart uses /etc/init as configuration directory :-/
if [ -d "${rootmnt}${checktarget}" ]; then
return 1
fi
}
# Check init bootarg
if [ -n "${init}" ]; then
if ! validate_init "$init"; then
echo "Target filesystem doesn't have requested ${init}."
init=
fi
fi
# Common case: /sbin/init is present
if [ ! -x "${rootmnt}/sbin/init" ]; then
# ... if it's not available search for valid init
if [ -z "${init}" ] ; then
for inittest in /sbin/init /etc/init /bin/init /bin/sh; do
if validate_init "${inittest}"; then
init="$inittest"
break
fi
done
fi
# No init on rootmount
if ! validate_init "${init}" ; then
panic "No init found. Try passing init= bootarg."
fi
fi
maybe_break init
# don't leak too much of env - some init(8) don't clear it
# (keep init, rootmnt)
unset debug
unset MODPROBE_OPTIONS
unset DPKG_ARCH
unset ROOTFLAGS
unset ROOTFSTYPE
unset ROOTDELAY
unset ROOT
unset IP
unset BOOT
unset BOOTIF
unset UBIMTD
unset blacklist
unset break
unset noresume
unset panic
unset quiet
unset readonly
unset resume
unset resume_offset
# Chain to real filesystem
exec run-init ${rootmnt} ${init} "$@" ${recovery:+--startup-event=recovery} <${rootmnt}/dev/console >${rootmnt}/dev/console 2>&1
panic "Could not execute run-init."

View File

@@ -0,0 +1,170 @@
# Local filesystem mounting -*- shell-script -*-
pre_mountroot()
{
[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-top"
run_scripts /scripts/local-top
[ "$quiet" != "y" ] && log_end_msg
# Don't wait for a root device that doesn't have a corresponding
# device in /dev (ie, mtd0)
if [ "${ROOT#/dev}" = "${ROOT}" ]; then
return
fi
while [ -z "${FSTYPE}" ]; do
FSTYPE=$(wait-for-root "${ROOT}" ${ROOTDELAY:-30})
# Load ubi with the correct MTD partition and return since
# fstype doesn't work with a char device like ubi.
if [ -n "$UBIMTD" ]; then
modprobe ubi mtd=$UBIMTD
return
fi
# Run failure hooks, hoping one of them can fix up the system
# and we can restart the wait loop. If they all fail, abort
# and move on to the panic handler and shell.
if [ -z "${FSTYPE}" ] && ! try_failure_hooks; then
break
fi
done
# We've given up, but we'll let the user fix matters if they can
while [ -z "${FSTYPE}" -a ! -e "${ROOT}" ]; do
# give hint about renamed root
case "${ROOT}" in
/dev/hd*)
suffix="${ROOT#/dev/hd}"
major="${suffix%[[:digit:]]}"
major="${major%[[:digit:]]}"
if [ -d "/sys/block/sd${major}" ]; then
echo "WARNING bootdevice may be renamed. Try root=/dev/sd${suffix}"
fi
;;
/dev/sd*)
suffix="${ROOT#/dev/sd}"
major="${suffix%[[:digit:]]}"
major="${major%[[:digit:]]}"
if [ -d "/sys/block/hd${major}" ]; then
echo "WARNING bootdevice may be renamed. Try root=/dev/hd${suffix}"
fi
;;
esac
echo "Gave up waiting for root device. Common problems:"
echo " - Boot args (cat /proc/cmdline)"
echo " - Check rootdelay= (did the system wait long enough?)"
echo " - Check root= (did the system wait for the right device?)"
echo " - Missing modules (cat /proc/modules; ls /dev)"
panic "ALERT! ${ROOT} does not exist. Dropping to a shell!"
done
}
mountroot()
{
pre_mountroot
# Get the root filesystem type if not set
if [ -z "${ROOTFSTYPE}" ]; then
[ -n "${FSTYPE}" ] || FSTYPE=$(blkid -s TYPE -o value "${ROOT}")
ROOTFSTYPE="${FSTYPE}"
else
FSTYPE=${ROOTFSTYPE}
fi
[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-premount"
run_scripts /scripts/local-premount
[ "$quiet" != "y" ] && log_end_msg
if [ "${readonly}" = "y" ] && \
[ -z "$LOOP" ]; then
roflag=-r
else
roflag=-w
fi
# FIXME This has no error checking
[ -n "${FSTYPE}" ] && modprobe ${FSTYPE}
# FIXME This has no error checking
# Mount root
mount ${roflag} ${FSTYPE:+-t ${FSTYPE} }${ROOTFLAGS} ${ROOT} ${rootmnt}
mountroot_status="$?"
if [ "$LOOP" ]; then
if [ "$mountroot_status" != 0 ]; then
if [ ${FSTYPE} = ntfs ] || [ ${FSTYPE} = vfat ]; then
panic "
Could not mount the partition ${ROOT}.
This could also happen if the file system is not clean because of an operating
system crash, an interrupted boot process, an improper shutdown, or unplugging
of a removable device without first unmounting or ejecting it. To fix this,
simply reboot into Windows, let it fully start, log in, run 'chkdsk /r', then
gracefully shut down and reboot back into Windows. After this you should be
able to reboot again and resume the installation.
(filesystem = ${FSTYPE}, error code = $mountroot_status)
"
fi
fi
mkdir -p /host
mount -o move ${rootmnt} /host
while [ ! -e "/host/${LOOP#/}" ]; do
panic "ALERT! /host/${LOOP#/} does not exist. Dropping to a shell!"
done
# Get the loop filesystem type if not set
if [ -z "${LOOPFSTYPE}" ]; then
eval $(fstype < "/host/${LOOP#/}")
else
FSTYPE="${LOOPFSTYPE}"
fi
if [ "$FSTYPE" = "unknown" ] && [ -x /sbin/blkid ]; then
FSTYPE=$(/sbin/blkid -s TYPE -o value "/host/${LOOP#/}")
[ -z "$FSTYPE" ] && FSTYPE="unknown"
fi
if [ ${readonly} = y ]; then
roflag=-r
else
roflag=-w
fi
# FIXME This has no error checking
modprobe loop
modprobe ${FSTYPE}
# FIXME This has no error checking
mount ${roflag} -o loop -t ${FSTYPE} ${LOOPFLAGS} "/host/${LOOP#/}" ${rootmnt}
if [ -d ${rootmnt}/host ]; then
mount -o move /host ${rootmnt}/host
fi
elif [ "$ROOTSUBDIR" ]; then
if [ "$mountroot_status" != 0 ]; then
panic "
Could not mount the partition ${ROOT}.
This could also happen if the file system is not clean because of an operating
system crash, an interrupted boot process, an improper shutdown, or unplugging
of a removable device without first unmounting or ejecting it.
(filesystem = ${FSTYPE}, error code = $mountroot_status)
"
fi
mkdir -p /host
mount -o move ${rootmnt} /host
if [ ! -d "/host/$ROOTSUBDIR" ]; then
panic "Failed to bind folder ${ROOTSUBDIR} as root: folder does not exist."
fi
mount -o bind /host/$ROOTSUBDIR ${rootmnt}
if [ -d ${rootmnt}/host ]; then
mount -o move /host ${rootmnt}/host
fi
fi
[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-bottom"
run_scripts /scripts/local-bottom
[ "$quiet" != "y" ] && log_end_msg
}

View File

@@ -0,0 +1,356 @@
#!/bin/sh
[ -d /dev ] || mkdir -m 0755 /dev
[ -d /root ] || mkdir -m 0700 /root
[ -d /sys ] || mkdir /sys
[ -d /proc ] || mkdir /proc
[ -d /tmp ] || mkdir /tmp
mkdir -p /var/lock
mount -t sysfs -o nodev,noexec,nosuid sysfs /sys
mount -t proc -o nodev,noexec,nosuid proc /proc
# Some things don't work properly without /etc/mtab.
ln -sf /proc/mounts /etc/mtab
grep -q '\<quiet\>' /proc/cmdline || echo "Loading, please wait..."
# Note that this only becomes /dev on the real filesystem if udev's scripts
# are used; which they will be, but it's worth pointing out
if ! mount -t devtmpfs -o mode=0755 udev /dev; then
echo "W: devtmpfs not available, falling back to tmpfs for /dev"
mount -t tmpfs -o mode=0755 udev /dev
[ -e /dev/console ] || mknod -m 0600 /dev/console c 5 1
[ -e /dev/null ] || mknod /dev/null c 1 3
fi
mkdir /dev/pts
mount -t devpts -o noexec,nosuid,gid=5,mode=0620 devpts /dev/pts || true
mount -t tmpfs -o "noexec,nosuid,size=10%,mode=0755" tmpfs /run
mkdir /run/initramfs
# compatibility symlink for the pre-oneiric locations
ln -s /run/initramfs /dev/.initramfs
# Export the dpkg architecture
export DPKG_ARCH=
. /conf/arch.conf
# Set modprobe env
export MODPROBE_OPTIONS="-qb"
# Export relevant variables
export ROOT=
export ROOTDELAY=
export ROOTFLAGS=
export ROOTFSTYPE=
export IP=
export BOOT=
export BOOTIF=
export UBIMTD=
export break=
export init=/sbin/init
export quiet=n
export readonly=y
export rootmnt=/root
export debug=
export panic=
export blacklist=
export resume=
export resume_offset=
export recovery=
# mdadm needs hostname to be set. This has to be done before the udev rules are called!
if [ -f "/etc/hostname" ]; then
/bin/hostname -b -F /etc/hostname 2>&1 1>/dev/null
fi
# Bring in the main config
. /conf/initramfs.conf
for conf in conf/conf.d/*; do
[ -f ${conf} ] && . ${conf}
done
. /scripts/functions
# Parse command line options
for x in $(cat /proc/cmdline); do
case $x in
init=*)
init=${x#init=}
;;
root=*)
ROOT=${x#root=}
case $ROOT in
LABEL=*)
ROOT="${ROOT#LABEL=}"
# support any / in LABEL= path (escape to \x2f)
case "${ROOT}" in
*/*)
if command -v sed >/dev/null 2>&1; then
ROOT="$(echo ${ROOT} | sed 's,/,\\x2f,g')"
else
if [ "${ROOT}" != "${ROOT#/}" ]; then
ROOT="\x2f${ROOT#/}"
fi
if [ "${ROOT}" != "${ROOT%/}" ]; then
ROOT="${ROOT%/}\x2f"
fi
IFS='/'
newroot=
for s in $ROOT; do
newroot="${newroot:+${newroot}\\x2f}${s}"
done
unset IFS
ROOT="${newroot}"
fi
esac
ROOT="/dev/disk/by-label/${ROOT}"
;;
UUID=*)
ROOT="/dev/disk/by-uuid/${ROOT#UUID=}"
;;
/dev/nfs)
[ -z "${BOOT}" ] && BOOT=nfs
;;
esac
;;
rootflags=*)
ROOTFLAGS="-o ${x#rootflags=}"
;;
rootfstype=*)
ROOTFSTYPE="${x#rootfstype=}"
;;
rootdelay=*)
ROOTDELAY="${x#rootdelay=}"
case ${ROOTDELAY} in
*[![:digit:].]*)
ROOTDELAY=
;;
esac
;;
resumedelay=*)
RESUMEDELAY="${x#resumedelay=}"
;;
loop=*)
LOOP="${x#loop=}"
;;
loopflags=*)
LOOPFLAGS="-o ${x#loopflags=}"
;;
loopfstype=*)
LOOPFSTYPE="${x#loopfstype=}"
;;
rootsubdir=*)
ROOTSUBDIR="${x#rootsubdir=}"
;;
cryptopts=*)
cryptopts="${x#cryptopts=}"
;;
nfsroot=*)
NFSROOT="${x#nfsroot=}"
;;
netboot=*)
NETBOOT="${x#netboot=}"
;;
ip=*)
IP="${x#ip=}"
;;
boot=*)
BOOT=${x#boot=}
;;
ubi.mtd=*)
UBIMTD=${x#ubi.mtd=}
;;
resume=*)
RESUME="${x#resume=}"
;;
resume_offset=*)
resume_offset="${x#resume_offset=}"
;;
noresume)
noresume=y
;;
panic=*)
panic="${x#panic=}"
case ${panic} in
*[![:digit:].]*)
panic=
;;
esac
;;
quiet)
quiet=y
;;
ro)
readonly=y
;;
rw)
readonly=n
;;
debug)
debug=y
quiet=n
exec >/run/initramfs/initramfs.debug 2>&1
set -x
;;
debug=*)
debug=y
quiet=n
set -x
;;
break=*)
break=${x#break=}
;;
break)
break=premount
;;
blacklist=*)
blacklist=${x#blacklist=}
;;
netconsole=*)
netconsole=${x#netconsole=}
;;
BOOTIF=*)
BOOTIF=${x#BOOTIF=}
;;
hwaddr=*)
BOOTIF=${x#BOOTIF=}
;;
recovery)
recovery=y
;;
esac
done
if [ -n "${noresume}" ]; then
export noresume
unset resume
else
resume=${RESUME:-}
fi
maybe_break top
# export BOOT variable value for compcache,
# so we know if we run from casper
export BOOT
# Don't do log messages here to avoid confusing graphical boots
run_scripts /scripts/init-top
maybe_break modules
[ "$quiet" != "y" ] && log_begin_msg "Loading essential drivers"
load_modules
[ "$quiet" != "y" ] && log_end_msg
[ -n "${netconsole}" ] && modprobe netconsole netconsole="${netconsole}"
maybe_break premount
[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/init-premount"
run_scripts /scripts/init-premount
[ "$quiet" != "y" ] && log_end_msg
maybe_break mount
log_begin_msg "Mounting root file system"
. /scripts/${BOOT}
parse_numeric ${ROOT}
maybe_break mountroot
mountroot
log_end_msg
maybe_break bottom
[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/init-bottom"
run_scripts /scripts/init-bottom
[ "$quiet" != "y" ] && log_end_msg
# Preserve information on old systems without /run on the rootfs
if [ -d ${rootmnt}/run ]; then
mount -n -o move /run ${rootmnt}/run
else
# The initramfs udev database must be migrated:
if [ -d /run/udev ] && [ ! -d /dev/.udev ]; then
mv /run/udev /dev/.udev
fi
# The initramfs debug info must be migrated:
if [ -d /run/initramfs ] && [ ! -d /dev/.initramfs ]; then
mv /run/initramfs /dev/.initramfs
fi
umount /run
fi
# Move virtual filesystems over to the real filesystem
mount -n -o move /sys ${rootmnt}/sys
mount -n -o move /proc ${rootmnt}/proc
validate_init() {
checktarget="${1}"
# Work around absolute symlinks
if [ -d "${rootmnt}" ] && [ -h "${rootmnt}${checktarget}" ]; then
case $(readlink "${rootmnt}${checktarget}") in /*)
checktarget="$(chroot ${rootmnt} readlink ${checktarget})"
;;
esac
fi
# Make sure the specified init can be executed
if [ ! -x "${rootmnt}${checktarget}" ]; then
return 1
fi
# Upstart uses /etc/init as configuration directory :-/
if [ -d "${rootmnt}${checktarget}" ]; then
return 1
fi
}
# Check init bootarg
if [ -n "${init}" ]; then
if ! validate_init "$init"; then
echo "Target filesystem doesn't have requested ${init}."
init=
fi
fi
# Common case: /sbin/init is present
if [ ! -x "${rootmnt}/sbin/init" ]; then
# ... if it's not available search for valid init
if [ -z "${init}" ] ; then
for inittest in /sbin/init /etc/init /bin/init /bin/sh; do
if validate_init "${inittest}"; then
init="$inittest"
break
fi
done
fi
# No init on rootmount
if ! validate_init "${init}" ; then
panic "No init found. Try passing init= bootarg."
fi
fi
maybe_break init
# don't leak too much of env - some init(8) don't clear it
# (keep init, rootmnt)
unset debug
unset MODPROBE_OPTIONS
unset DPKG_ARCH
unset ROOTFLAGS
unset ROOTFSTYPE
unset ROOTDELAY
unset ROOT
unset IP
unset BOOT
unset BOOTIF
unset UBIMTD
unset blacklist
unset break
unset noresume
unset panic
unset quiet
unset readonly
unset resume
unset resume_offset
# Chain to real filesystem
exec run-init ${rootmnt} ${init} "$@" ${recovery:+--startup-event=recovery} <${rootmnt}/dev/console >${rootmnt}/dev/console 2>&1
panic "Could not execute run-init."

View File

@@ -0,0 +1,264 @@
# Local filesystem mounting -*- shell-script -*-
pre_mountroot()
{
[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-top"
run_scripts /scripts/local-top
[ "$quiet" != "y" ] && log_end_msg
# Don't wait for a root device that doesn't have a corresponding
# device in /dev (ie, mtd0)
if [ "${ROOT#/dev}" = "${ROOT}" ]; then
return
fi
while [ -z "${FSTYPE}" ]; do
FSTYPE=$(wait-for-root "${ROOT}" ${ROOTDELAY:-30})
# Load ubi with the correct MTD partition and return since
# fstype doesn't work with a char device like ubi.
if [ -n "$UBIMTD" ]; then
modprobe ubi mtd=$UBIMTD
return
fi
# Run failure hooks, hoping one of them can fix up the system
# and we can restart the wait loop. If they all fail, abort
# and move on to the panic handler and shell.
if [ -z "${FSTYPE}" ] && ! try_failure_hooks; then
break
fi
done
# We've given up, but we'll let the user fix matters if they can
while [ -z "${FSTYPE}" -a ! -e "${ROOT}" ]; do
# give hint about renamed root
case "${ROOT}" in
/dev/hd*)
suffix="${ROOT#/dev/hd}"
major="${suffix%[[:digit:]]}"
major="${major%[[:digit:]]}"
if [ -d "/sys/block/sd${major}" ]; then
echo "WARNING bootdevice may be renamed. Try root=/dev/sd${suffix}"
fi
;;
/dev/sd*)
suffix="${ROOT#/dev/sd}"
major="${suffix%[[:digit:]]}"
major="${major%[[:digit:]]}"
if [ -d "/sys/block/hd${major}" ]; then
echo "WARNING bootdevice may be renamed. Try root=/dev/hd${suffix}"
fi
;;
esac
echo "Gave up waiting for root device. Common problems:"
echo " - Boot args (cat /proc/cmdline)"
echo " - Check rootdelay= (did the system wait long enough?)"
echo " - Check root= (did the system wait for the right device?)"
echo " - Missing modules (cat /proc/modules; ls /dev)"
panic "ALERT! ${ROOT} does not exist. Dropping to a shell!"
done
}
process_ubuntu()
{
mrom_dir=$1
if [ -e /tmpmnt/system.img ]; then
# Prepare the root filesystem
if [ -e /tmpmnt/.developer_mode ]; then
echo "initrd: mounting system.img (developer mode)" >/dev/kmsg || true
mount -o loop,rw /tmpmnt/system.img ${rootmnt}
mountroot_status="$?"
else
echo "initrd: mounting system.img (user mode)" >/dev/kmsg || true
mount -o loop,ro /tmpmnt/system.img ${rootmnt}
mountroot_status="$?"
fi
mount --move /tmpmnt ${rootmnt}/data
# Create any missing persistent directory
for dir in system-data system-data/dbus \
system-data/network-manager/connections \
system-data/network-manager/lib \
system-data/log system-data/log/upstart userdata android-data; do
mkdir -p ${rootmnt}/data/$dir
done
# Move some data to persistant storage (first-boot)
if [ ! -d ${rootmnt}/data/phablet ]; then
cp -Ra ${rootmnt}/home/phablet ${rootmnt}/data/phablet
fi
# Mount all the Android partitions
mkdir -p ${rootmnt}/android/cache
mkdir -p ${rootmnt}/android/system
mount -o bind $mrom_dir/cache ${rootmnt}/android/cache
mount -o loop,ro ${rootmnt}/var/lib/lxc/android/system.img ${rootmnt}/android/system
# Apply device-specific udev rules
device=$(grep ^ro.product.device= ${rootmnt}/android/system/build.prop |sed -e 's/.*=//')
if [ -n "$device" ]; then
echo "initrd: identified device as $device" >/dev/kmsg || true
mount --bind ${rootmnt}/usr/lib/lxc-android-config/70-$device.rules ${rootmnt}/lib/udev/rules.d/70-android.rules
fi
# Bind-mount /lib/modules from Android
[ -e /system/lib/modules ] && mount --bind /system/lib/modules /lib/modules
# Bind-mount the fstab
mount --bind ${rootmnt}/usr/lib/lxc-android-config/image-fstab ${rootmnt}/etc/fstab
elif [ -d /tmpmnt/ubuntu ]; then
mount --bind /tmpmnt/ubuntu ${rootmnt}
mountroot_status="$?"
# Possibly a re-partitioned device
else
echo "initrd: Couldn't find a system partition." >/dev/kmsg || true
panic "Couldn't find a system partition. Spawning adbd ..."
fi
}
mountroot()
{
pre_mountroot
# Make sure the device has been created by udev before we try to mount
udevadm settle
# Get the root filesystem type if not set
if [ -z "${ROOTFSTYPE}" ]; then
[ -n "${FSTYPE}" ] || FSTYPE=$(blkid -s TYPE -o value "${ROOT}")
ROOTFSTYPE="${FSTYPE}"
else
FSTYPE=${ROOTFSTYPE}
fi
[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-premount"
run_scripts /scripts/local-premount
[ "$quiet" != "y" ] && log_end_msg
if [ "${readonly}" = "y" ] && \
[ -z "$LOOP" ]; then
roflag=-r
else
roflag=-w
fi
# FIXME This has no error checking
[ -n "${FSTYPE}" ] && modprobe ${FSTYPE}
# FIXME This has no error checking
# Mount root
mount ${roflag} ${FSTYPE:+-t ${FSTYPE} }${ROOTFLAGS} ${ROOT} ${rootmnt}
mountroot_status="$?"
if [ "$LOOP" ]; then
if [ "$mountroot_status" != 0 ]; then
if [ ${FSTYPE} = ntfs ] || [ ${FSTYPE} = vfat ]; then
panic "
Could not mount the partition ${ROOT}.
This could also happen if the file system is not clean because of an operating
system crash, an interrupted boot process, an improper shutdown, or unplugging
of a removable device without first unmounting or ejecting it. To fix this,
simply reboot into Windows, let it fully start, log in, run 'chkdsk /r', then
gracefully shut down and reboot back into Windows. After this you should be
able to reboot again and resume the installation.
(filesystem = ${FSTYPE}, error code = $mountroot_status)
"
fi
fi
mkdir -p /host
mount -o move ${rootmnt} /host
if [ ! -d "/host/${LOOP}" ]; then
panic "LOOP folder does not exit on the device, ${LOOP}"
fi
# Get the loop filesystem type if not set
if [ -z "${LOOPFSTYPE}" ]; then
panic "LOOPFSTYPE was not set!"
else
FSTYPE="${LOOPFSTYPE}"
fi
if [ "$FSTYPE" = "unknown" ]; then
panic "LOOPFSTYPE was set to unknown!"
fi
if [ ${readonly} = y ]; then
roflag=-r
else
roflag=-w
fi
# FIXME This has no error checking
modprobe loop
modprobe ${FSTYPE}
mkdir -p /tmpmnt
mount ${roflag} -o loop -t ${FSTYPE} ${LOOPFLAGS} "/host/${LOOP}/data.img" /tmpmnt
echo "initrd: mounted all loops" >/dev/kmsg || true
process_ubuntu "/mrom_dir/"
echo "process_ubuntu complete" >/dev/kmsg || true
mkdir -p ${rootmnt}/host
mount -o move /host ${rootmnt}/host
mkdir -p ${rootmnt}/mrom_dir/data
mkdir -p ${rootmnt}/mrom_dir/system
mkdir -p ${rootmnt}/mrom_dir/cache
mkdir -p ${rootmnt}/data
mkdir -p ${rootmnt}/system
mount ${roflag} -o loop -t ${FSTYPE} ${LOOPFLAGS} "${rootmnt}/host/${LOOP}/system.img" ${rootmnt}/mrom_dir/system
mount ${roflag} -o loop -t ${FSTYPE} ${LOOPFLAGS} "${rootmnt}/host/${LOOP}/cache.img" ${rootmnt}/mrom_dir/cache
mount ${roflag} -o loop -t ${FSTYPE} ${LOOPFLAGS} "${rootmnt}/host/${LOOP}/data.img" ${rootmnt}/mrom_dir/data
mount -o bind ${rootmnt}/mrom_dir/system ${rootmnt}/system
mount -o bind ${rootmnt}/mrom_dir/data ${rootmnt}/data
elif [ "$ROOTSUBDIR" ]; then
if [ "$mountroot_status" != 0 ]; then
panic "
Could not mount the partition ${ROOT}.
This could also happen if the file system is not clean because of an operating
system crash, an interrupted boot process, an improper shutdown, or unplugging
of a removable device without first unmounting or ejecting it.
(filesystem = ${FSTYPE}, error code = $mountroot_status)
"
fi
mkdir -p /host
mount -o move ${rootmnt} /host
if [ ! -d "/host/$ROOTSUBDIR" ]; then
panic "Failed to bind folder ${ROOTSUBDIR} as root: folder does not exist."
fi
if [ ! -d "/host/$ROOTSUBDIR/data" ]; then
panic "Failed to bind folder ${ROOTSUBDIR}/data: folder does not exist."
fi
mkdir -p /tmpmnt
mount -o bind "/host/$ROOTSUBDIR/data" /tmpmnt
process_ubuntu "/host/$ROOTSUBDIR/"
mkdir -p ${rootmnt}/host
mount -o move /host ${rootmnt}/host
mrom_dir="${rootmnt}/host/$ROOTSUBDIR"
mkdir -p ${rootmnt}/system
mkdir -p ${rootmnt}/data
mkdir -p ${rootmnt}/mrom_dir
mount -o bind ${mrom_dir}/system ${rootmnt}/system
mount -o bind ${mrom_dir}/data ${rootmnt}/data
mount -o bind ${mrom_dir} ${rootmnt}/mrom_dir
fi
[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-bottom"
run_scripts /scripts/local-bottom
[ "$quiet" != "y" ] && log_end_msg
}

View File

@@ -0,0 +1,44 @@
#!/sbin/sh
base=""
if [ -d "/data/media/multirom" ] ; then
base="/data/media/multirom"
elif [ -d "/data/media/0/multirom" ] ; then
base="/data/media/0/multirom"
else
if [ -d "/data/media/0" ] ; then
base="/data/media/0/multirom"
else
base="/data/media/multirom"
fi
mkdir "$base"
chown root:root "$base"
chmod 770 "$base"
mkdir "$base/roms"
chown media_rw:media_rw "$base/roms"
chmod 777 "$base/roms"
touch "$base/.nomedia"
chown media_rw:media_rw "$base/.nomedia"
# remove internal ROM in order to regenerate boot.img
rm -r "$base/roms/Internal"
fi
rm "$base/boot.img-ubuntu"*
cp -r /tmp/multirom/* "$base/"
chmod 755 "$base/multirom"
chmod 755 "$base/busybox"
chmod 750 "$base/trampoline"
chmod 755 "$base/kexec"
chmod 755 "$base/ntfs-3g"
chmod 755 "$base/ubuntu-init/init"
chmod 644 "$base/ubuntu-init/local"
chmod 755 "$base/ubuntu-touch-init/init"
chmod 644 "$base/ubuntu-touch-init/scripts/touch"
# This makes does not allows access for media scanner on android, but
# still is enough for ubuntu
chmod 770 "$base"
chown root:root "$base"

View File

@@ -0,0 +1,80 @@
#!/sbin/sh
BUSYBOX="/tmp/multirom/busybox"
LZ4="/tmp/lz4"
BOOT_DEV="$(cat /tmp/bootdev)"
CMPR_GZIP=0
CMPR_LZ4=1
if [ ! -e "$BOOT_DEV" ]; then
echo "BOOT_DEV \"$BOOT_DEV\" does not exist!"
return 1
fi
dd if=$BOOT_DEV of=/tmp/boot.img
/tmp/unpackbootimg -i /tmp/boot.img -o /tmp/
if [ ! -f /tmp/boot.img-zImage ] ; then
echo "Failed to extract boot.img"
return 1
fi
rm -r /tmp/boot
mkdir /tmp/boot
cd /tmp/boot
rd_cmpr=-1
magic=$($BUSYBOX hexdump -n 4 -v -e '/1 "%02X"' "../boot.img-ramdisk.gz")
case "$magic" in
1F8B*) # GZIP
$BUSYBOX gzip -d -c "../boot.img-ramdisk.gz" | $BUSYBOX cpio -i
rd_cmpr=CMPR_GZIP;
;;
02214C18) # LZ4
$LZ4 -d "../boot.img-ramdisk.gz" stdout | $BUSYBOX cpio -i
rd_cmpr=CMPR_LZ4;
;;
*)
echo "invalid ramdisk magic $magic"
;;
esac
if [ rd_cmpr == -1 ] || [ ! -f /tmp/boot/init ] ; then
echo "Failed to extract ramdisk!"
return 1
fi
# copy trampoline
if [ ! -e /tmp/boot/main_init ] ; then
mv /tmp/boot/init /tmp/boot/main_init
fi
cp /tmp/multirom/trampoline /tmp/boot/init
chmod 750 /tmp/boot/init
# crete ueventd symlink
if [ -L /tmp/boot/sbin/ueventd ] ; then
ln -sf ../main_init /tmp/boot/sbin/ueventd
fi
# pack the image again
cd /tmp/boot
case $rd_cmpr in
CMPR_GZIP)
find . | $BUSYBOX cpio -o -H newc | $BUSYBOX gzip > "../boot.img-ramdisk.gz"
;;
CMPR_LZ4)
find . | $BUSYBOX cpio -o -H newc | $LZ4 stdin "../boot.img-ramdisk.gz"
;;
esac
cd /tmp
/tmp/mkbootimg --kernel boot.img-zImage --ramdisk boot.img-ramdisk.gz --cmdline "$(cat boot.img-cmdline)" --base $(cat boot.img-base) --output /tmp/newboot.img
if [ ! -e "/tmp/newboot.img" ] ; then
echo "Failed to inject boot.img!"
return 1
fi
echo "Writing new boot.img..."
dd bs=4096 if=/tmp/newboot.img of=$BOOT_DEV
return $?

BIN
install_zip/prebuilt/scripts/lz4 Executable file

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,8 +1,6 @@
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
multirom_local_path := $(LOCAL_PATH)
LOCAL_SRC_FILES:= \
trampoline.c \
devices.c \