[Guide] How To Create Recovery Flashable .zips / update.zips

Search This thread

hisee

Senior Member
Oct 29, 2010
3,114
247
MUMBAI
Can xda university make tut/instructions for building a rom?

Sent from my GT-I9300 using xda premium
 

demkantor

Inactive Recognized Contributor
Nov 10, 2011
6,861
3,764
mpls
Can xda university make tut/instructions for building a rom?

Sent from my GT-I9300 using xda premium

There are already a couple guides here on xda-u, there is a nice one I was just looking over how to build cm from source, it seems well written and thorough

Sent from my myTouch_4G_Slide using xda premium
 
  • Like
Reactions: hisee

hisee

Senior Member
Oct 29, 2010
3,114
247
MUMBAI
Thks got it.. But I haven't found tut on editing xml file for themes as der r 50+ xml hw we can come to know which xml is use for what purpose ie to change setting background which xml to edit etc....

Sent from my GT-I9300 using xda premium
 

demkantor

Inactive Recognized Contributor
Nov 10, 2011
6,861
3,764
mpls
THIS it wont cover each android version but may help you find what you're looking for.
Unfortunately when it comes to themeing things will change between each android version, i would suggest if you are just starting out to start with an app, theme it to your liking then move on.
older android versions were much easier to change thing like the systemui.apk to your liking but now its more complicated. Im by no means a great themer myself but depending on what youre trying to do i could probably get you in touch with someone who is.
 
  • Like
Reactions: hisee

spc_hicks09

Inactive Recognized Contributor
Jan 23, 2011
3,899
1,858
Marion, OH
www.facebook.com
Ok so i've compiled a ROM from source and am trying to flash it, but every time I flash I get this error:

Code:
E:Error executing updater binary in zip '/external_sd/Flash This/full_xt926.bdh.signed.zip'
Error flashing zip '/external_sd/Flash This/full_xt926.bdh.signed.zip'


I haven't really been able to find much on this through a 3 day google search. I found one topic that suggested it's the recovery but I know this is not the recovery, this is a ROM zip issue.

This is the recovery.log

Code:
Installing '/external_sd/Flash This/full_xt926.bdh.signed.zip'...
Checking for MD5 file...
I:Cannot find file /external_sd/Flash This/full_xt926.bdh.signed.zip.md5
Skipping MD5 check: no MD5 file found.
line 4 col 37: syntax error, unexpected STRING, expecting $end
1 parse errors
E:Error executing updater binary in zip '/external_sd/Flash This/full_xt926.bdh.signed.zip'
Error flashing zip '/external_sd/Flash This/full_xt926.bdh.signed.zip'

Here is the updater-script:

Code:
show_progress(0.500000, 0);
format("ext4", "EMMC", "/dev/block/platform/msm_sdcc.1/by-name/system");
mount("ext4", "EMMC", "/dev/block/platform/msm_sdcc.1/by-name/system", "/system"); "0 /system/
package_extract_file("check_data_app", "/tmp/check_data_app");
set_perm(0, 0, 0777, "/tmp/check_data_app");
run_program("/tmp/check_data_app");
package_extract_dir("data", "/data");
set_perm_recursive(1000, 1000, 0771, 0644, "/data/app");
package_extract_dir("system", "/system");
symlink("/persist/WCNSS_qcom_wlan_nv.bin", "/system/etc/firmware/wlan/prima/WCNSS_qcom_wlan_nv.bin");
symlink("/system/lib/libwiperjni_v02.so", "/system/lib/libwiperjni.so");
symlink("/system/lib/libxt_v02.so", "/system/lib/libxt_native.so");
symlink("Roboto-Bold.ttf", "/system/fonts/DroidSans-Bold.ttf");
symlink("Roboto-Regular.ttf", "/system/fonts/DroidSans.ttf");
symlink("busybox", "/system/xbin/[");
symlink("busybox", "/system/xbin/[[");
symlink("busybox", "/system/xbin/adjtimex");
symlink("busybox", "/system/xbin/arp");
symlink("busybox", "/system/xbin/ash");
symlink("busybox", "/system/xbin/awk");
symlink("busybox", "/system/xbin/base64");
symlink("busybox", "/system/xbin/basename");
symlink("busybox", "/system/xbin/bbconfig");
symlink("busybox", "/system/xbin/blkid");
symlink("busybox", "/system/xbin/blockdev");
symlink("busybox", "/system/xbin/brctl");
symlink("busybox", "/system/xbin/bunzip2");
symlink("busybox", "/system/xbin/bzcat");
symlink("busybox", "/system/xbin/bzip2");
symlink("busybox", "/system/xbin/cal");
symlink("busybox", "/system/xbin/cat");
symlink("busybox", "/system/xbin/catv");
symlink("busybox", "/system/xbin/chattr");
symlink("busybox", "/system/xbin/chgrp");
symlink("busybox", "/system/xbin/chmod");
symlink("busybox", "/system/xbin/chown");
symlink("busybox", "/system/xbin/chroot");
symlink("busybox", "/system/xbin/clear");
symlink("busybox", "/system/xbin/cmp");
symlink("busybox", "/system/xbin/comm");
symlink("busybox", "/system/xbin/cp");
symlink("busybox", "/system/xbin/cpio");
symlink("busybox", "/system/xbin/crond");
symlink("busybox", "/system/xbin/crontab");
symlink("busybox", "/system/xbin/cut");
symlink("busybox", "/system/xbin/date");
symlink("busybox", "/system/xbin/dc");
symlink("busybox", "/system/xbin/dd");
symlink("busybox", "/system/xbin/depmod");
symlink("busybox", "/system/xbin/devmem");
symlink("busybox", "/system/xbin/df");
symlink("busybox", "/system/xbin/diff");
symlink("busybox", "/system/xbin/dirname");
symlink("busybox", "/system/xbin/dmesg");
symlink("busybox", "/system/xbin/dnsd");
symlink("busybox", "/system/xbin/dos2unix");
symlink("busybox", "/system/xbin/du");
symlink("busybox", "/system/xbin/echo");
symlink("busybox", "/system/xbin/ed");
symlink("busybox", "/system/xbin/egrep");
symlink("busybox", "/system/xbin/env");
symlink("busybox", "/system/xbin/expand");
symlink("busybox", "/system/xbin/expr");
symlink("busybox", "/system/xbin/false");
symlink("busybox", "/system/xbin/fbsplash");
symlink("busybox", "/system/xbin/fdisk");
symlink("busybox", "/system/xbin/fgrep");
symlink("busybox", "/system/xbin/find");
symlink("busybox", "/system/xbin/flash_lock");
symlink("busybox", "/system/xbin/flash_unlock");
symlink("busybox", "/system/xbin/flashcp");
symlink("busybox", "/system/xbin/flock");
symlink("busybox", "/system/xbin/fold");
symlink("busybox", "/system/xbin/free");
symlink("busybox", "/system/xbin/freeramdisk");
symlink("busybox", "/system/xbin/fstrim");
symlink("busybox", "/system/xbin/fsync");
symlink("busybox", "/system/xbin/ftpget");
symlink("busybox", "/system/xbin/ftpput");
symlink("busybox", "/system/xbin/fuser");
symlink("busybox", "/system/xbin/getopt");
symlink("busybox", "/system/xbin/grep");
symlink("busybox", "/system/xbin/groups");
symlink("busybox", "/system/xbin/gunzip");
symlink("busybox", "/system/xbin/gzip");
symlink("busybox", "/system/xbin/halt");
symlink("busybox", "/system/xbin/head");
symlink("busybox", "/system/xbin/hexdump");
symlink("busybox", "/system/xbin/id");
symlink("busybox", "/system/xbin/ifconfig");
symlink("busybox", "/system/xbin/inetd");
symlink("busybox", "/system/xbin/insmod");
symlink("busybox", "/system/xbin/install");
symlink("busybox", "/system/xbin/ionice");
symlink("busybox", "/system/xbin/iostat");
symlink("busybox", "/system/xbin/ip");
symlink("busybox", "/system/xbin/kill");
symlink("busybox", "/system/xbin/killall");
symlink("busybox", "/system/xbin/killall5");
symlink("busybox", "/system/xbin/less");
symlink("busybox", "/system/xbin/ln");
symlink("busybox", "/system/xbin/losetup");
symlink("busybox", "/system/xbin/ls");
symlink("busybox", "/system/xbin/lsattr");
symlink("busybox", "/system/xbin/lsmod");
symlink("busybox", "/system/xbin/lsusb");
symlink("busybox", "/system/xbin/lzcat");
symlink("busybox", "/system/xbin/lzma");
symlink("busybox", "/system/xbin/lzop");
symlink("busybox", "/system/xbin/lzopcat");
symlink("busybox", "/system/xbin/man");
symlink("busybox", "/system/xbin/md5sum");
symlink("busybox", "/system/xbin/mesg");
symlink("busybox", "/system/xbin/mkdir");
symlink("busybox", "/system/xbin/mke2fs");
symlink("busybox", "/system/xbin/mkfifo");
symlink("busybox", "/system/xbin/mkfs.ext2");
symlink("busybox", "/system/xbin/mkfs.vfat");
symlink("busybox", "/system/xbin/mknod");
symlink("busybox", "/system/xbin/mkswap");
symlink("busybox", "/system/xbin/mktemp");
symlink("busybox", "/system/xbin/modinfo");
symlink("busybox", "/system/xbin/modprobe");
symlink("busybox", "/system/xbin/more");
symlink("busybox", "/system/xbin/mount");
symlink("busybox", "/system/xbin/mountpoint");
symlink("busybox", "/system/xbin/mpstat");
symlink("busybox", "/system/xbin/mv");
symlink("busybox", "/system/xbin/nanddump");
symlink("busybox", "/system/xbin/nandwrite");
symlink("busybox", "/system/xbin/nbd-client");
symlink("busybox", "/system/xbin/netstat");
symlink("busybox", "/system/xbin/nice");
symlink("busybox", "/system/xbin/nohup");
symlink("busybox", "/system/xbin/nslookup");
symlink("busybox", "/system/xbin/ntpd");
symlink("busybox", "/system/xbin/od");
symlink("busybox", "/system/xbin/patch");
symlink("busybox", "/system/xbin/pgrep");
symlink("busybox", "/system/xbin/pidof");
symlink("busybox", "/system/xbin/ping");
symlink("busybox", "/system/xbin/pipe_progress");
symlink("busybox", "/system/xbin/pkill");
symlink("busybox", "/system/xbin/pmap");
symlink("busybox", "/system/xbin/poweroff");
symlink("busybox", "/system/xbin/printenv");
symlink("busybox", "/system/xbin/printf");
symlink("busybox", "/system/xbin/ps");
symlink("busybox", "/system/xbin/pstree");
symlink("busybox", "/system/xbin/pwd");
symlink("busybox", "/system/xbin/pwdx");
symlink("busybox", "/system/xbin/rdev");
symlink("busybox", "/system/xbin/readlink");
symlink("busybox", "/system/xbin/realpath");
symlink("busybox", "/system/xbin/renice");
symlink("busybox", "/system/xbin/reset");
symlink("busybox", "/system/xbin/resize");
symlink("busybox", "/system/xbin/rev");
symlink("busybox", "/system/xbin/rm");
symlink("busybox", "/system/xbin/rmdir");
symlink("busybox", "/system/xbin/rmmod");
symlink("busybox", "/system/xbin/route");
symlink("busybox", "/system/xbin/run-parts");
symlink("busybox", "/system/xbin/rx");
symlink("busybox", "/system/xbin/sed");
symlink("busybox", "/system/xbin/seq");
symlink("busybox", "/system/xbin/setconsole");
symlink("busybox", "/system/xbin/setserial");
symlink("busybox", "/system/xbin/setsid");
symlink("busybox", "/system/xbin/sh");
symlink("busybox", "/system/xbin/sha1sum");
symlink("busybox", "/system/xbin/sha256sum");
symlink("busybox", "/system/xbin/sha3sum");
symlink("busybox", "/system/xbin/sha512sum");
symlink("busybox", "/system/xbin/sleep");
symlink("busybox", "/system/xbin/sort");
symlink("busybox", "/system/xbin/split");
symlink("busybox", "/system/xbin/stat");
symlink("busybox", "/system/xbin/strings");
symlink("busybox", "/system/xbin/stty");
symlink("busybox", "/system/xbin/sum");
symlink("busybox", "/system/xbin/swapoff");
symlink("busybox", "/system/xbin/swapon");
symlink("busybox", "/system/xbin/sync");
symlink("busybox", "/system/xbin/sysctl");
symlink("busybox", "/system/xbin/tac");
symlink("busybox", "/system/xbin/tail");
symlink("busybox", "/system/xbin/tar");
symlink("busybox", "/system/xbin/taskset");
symlink("busybox", "/system/xbin/tee");
symlink("busybox", "/system/xbin/telnet");
symlink("busybox", "/system/xbin/telnetd");
symlink("busybox", "/system/xbin/test");
symlink("busybox", "/system/xbin/tftp");
symlink("busybox", "/system/xbin/tftpd");
symlink("busybox", "/system/xbin/time");
symlink("busybox", "/system/xbin/timeout");
symlink("busybox", "/system/xbin/top");
symlink("busybox", "/system/xbin/touch");
symlink("busybox", "/system/xbin/tr");
symlink("busybox", "/system/xbin/traceroute");
symlink("busybox", "/system/xbin/true");
symlink("busybox", "/system/xbin/ttysize");
symlink("busybox", "/system/xbin/tune2fs");
symlink("busybox", "/system/xbin/umount");
symlink("busybox", "/system/xbin/uname");
symlink("busybox", "/system/xbin/uncompress");
symlink("busybox", "/system/xbin/unexpand");
symlink("busybox", "/system/xbin/uniq");
symlink("busybox", "/system/xbin/unix2dos");
symlink("busybox", "/system/xbin/unlzma");
symlink("busybox", "/system/xbin/unlzop");
symlink("busybox", "/system/xbin/unxz");
symlink("busybox", "/system/xbin/unzip");
symlink("busybox", "/system/xbin/uptime");
symlink("busybox", "/system/xbin/usleep");
symlink("busybox", "/system/xbin/uudecode");
symlink("busybox", "/system/xbin/uuencode");
symlink("busybox", "/system/xbin/vi");
symlink("busybox", "/system/xbin/watch");
symlink("busybox", "/system/xbin/wc");
symlink("busybox", "/system/xbin/wget");
symlink("busybox", "/system/xbin/which");
symlink("busybox", "/system/xbin/whoami");
symlink("busybox", "/system/xbin/xargs");
symlink("busybox", "/system/xbin/xz");
symlink("busybox", "/system/xbin/xzcat");
symlink("busybox", "/system/xbin/yes");
symlink("busybox", "/system/xbin/zcat");
symlink("mksh", "/system/bin/sh");
symlink("toolbox", "/system/bin/cat");
symlink("toolbox", "/system/bin/chmod");
symlink("toolbox", "/system/bin/chown");
symlink("toolbox", "/system/bin/cmp");
symlink("toolbox", "/system/bin/cp");
symlink("toolbox", "/system/bin/date");
symlink("toolbox", "/system/bin/dd");
symlink("toolbox", "/system/bin/df");
symlink("toolbox", "/system/bin/dmesg");
symlink("toolbox", "/system/bin/du");
symlink("toolbox", "/system/bin/getevent");
symlink("toolbox", "/system/bin/getprop");
symlink("toolbox", "/system/bin/grep");
symlink("toolbox", "/system/bin/hd");
symlink("toolbox", "/system/bin/id");
symlink("toolbox", "/system/bin/ifconfig");
symlink("toolbox", "/system/bin/iftop");
symlink("toolbox", "/system/bin/insmod");
symlink("toolbox", "/system/bin/ioctl");
symlink("toolbox", "/system/bin/ionice");
symlink("toolbox", "/system/bin/kill");
symlink("toolbox", "/system/bin/ln");
symlink("toolbox", "/system/bin/log");
symlink("toolbox", "/system/bin/ls");
symlink("toolbox", "/system/bin/lsmod");
symlink("toolbox", "/system/bin/lsof");
symlink("toolbox", "/system/bin/md5");
symlink("toolbox", "/system/bin/mkdir");
symlink("toolbox", "/system/bin/mount");
symlink("toolbox", "/system/bin/mv");
symlink("toolbox", "/system/bin/nandread");
symlink("toolbox", "/system/bin/netstat");
symlink("toolbox", "/system/bin/newfs_msdos");
symlink("toolbox", "/system/bin/notify");
symlink("toolbox", "/system/bin/printenv");
symlink("toolbox", "/system/bin/ps");
symlink("toolbox", "/system/bin/r");
symlink("toolbox", "/system/bin/reboot");
symlink("toolbox", "/system/bin/renice");
symlink("toolbox", "/system/bin/restart");
symlink("toolbox", "/system/bin/rm");
symlink("toolbox", "/system/bin/rmdir");
symlink("toolbox", "/system/bin/rmmod");
symlink("toolbox", "/system/bin/route");
symlink("toolbox", "/system/bin/schedtop");
symlink("toolbox", "/system/bin/sendevent");
symlink("toolbox", "/system/bin/setconsole");
symlink("toolbox", "/system/bin/setprop");
symlink("toolbox", "/system/bin/sleep");
symlink("toolbox", "/system/bin/smd");
symlink("toolbox", "/system/bin/start");
symlink("toolbox", "/system/bin/stop");
symlink("toolbox", "/system/bin/sync");
symlink("toolbox", "/system/bin/top");
symlink("toolbox", "/system/bin/touch");
symlink("toolbox", "/system/bin/umount");
symlink("toolbox", "/system/bin/uptime");
symlink("toolbox", "/system/bin/vmstat");
symlink("toolbox", "/system/bin/watchprops");
symlink("toolbox", "/system/bin/wipe");
symlink("wiperiface_v02", "/system/bin/wiperiface");
set_perm_recursive(0, 0, 0755, 0644, "/system");
set_perm_recursive(0, 0, 0777, 0777, "/system/etc/init.d");
set_perm_recursive(0, 2000, 0755, 0755, "/system/bin");
set_perm(0, 1000, 0750, "/system/bin/iptables");
set_perm(0, 3003, 02750, "/system/bin/netcfg");
set_perm(0, 3004, 02755, "/system/bin/ping");
set_perm(0, 2000, 06750, "/system/bin/run-as");
set_perm(0, 1000, 0750, "/system/bin/tc");
set_perm(1002, 1002, 0440, "/system/etc/dbus.conf");
set_perm(1014, 2000, 0550, "/system/etc/dhcpcd/dhcpcd-run-hooks");
set_perm(0, 2000, 0550, "/system/etc/init.goldfish.sh");
set_perm_recursive(0, 0, 0755, 0555, "/system/etc/ppp");
set_perm(0, 2000, 0755, "/system/vendor");
set_perm(0, 2000, 0755, "/system/vendor/lib");
set_perm_recursive(0, 2000, 0755, 0644, "/system/vendor/lib/drm");
set_perm(0, 0, 0644, "/system/vendor/lib/drm/libdrmwvmplugin.so");
set_perm_recursive(0, 2000, 0755, 0755, "/system/xbin");
set_perm(0, 0, 06755, "/system/xbin/su");
symlink("/system/xbin/su", "/system/bin/su");
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/tcpdump");
show_progress(0.200000, 0);
show_progress(0.200000, 10);
package_extract_file("boot.img", "/dev/block/platform/msm_sdcc.1/by-name/boot");
show_progress(0.100000, 0);
assert(package_extract_file("boot.img", "/tmp/boot.img"),
       write_raw_image("/tmp/boot.img", "boot"),
       delete("/tmp/boot.img"));
unmount("/system");
unmount("/data");
 

demkantor

Inactive Recognized Contributor
Nov 10, 2011
6,861
3,764
mpls
Its hard to tell on my phone, ill relook when I get to a pc, but for now get rid of the format command, rezip, and try again. This should work, if not keep me posted. (Yes I'm sure you want to keep the format command but for now test without)

Sent from my myTouch_4G_Slide using xda premium
 
  • Like
Reactions: spc_hicks09

hisee

Senior Member
Oct 29, 2010
3,114
247
MUMBAI
THIS it wont cover each android version but may help you find what you're looking for.
Unfortunately when it comes to themeing things will change between each android version, i would suggest if you are just starting out to start with an app, theme it to your liking then move on.
older android versions were much easier to change thing like the systemui.apk to your liking but now its more complicated. Im by no means a great themer myself but depending on what youre trying to do i could probably get you in touch with someone who is.

Thks bro... 1st I am planning for make theme for Sammy base so that I can include in my rom (going try) but while making rom I took one rom as base rom but aroma making it harder to understand as a i am comparing 2 rom each having diff structure (both same base and Sammy base) ie one having systemui in system/app folder where as other having it in aroma systemui folder it's damm confusing

Sent from my GT-I9300 using xda premium
 

demkantor

Inactive Recognized Contributor
Nov 10, 2011
6,861
3,764
mpls
Oh so are you porting a rom right now? The guide I first linked you to is to compile from source. If you have never done either I highly recommend trying to port first as it is much easier.
there are guides to port here in xdau as well, or if you need I can link you to others
Aroma isn't bad once you get the hang of it (I've made lots of aroma packages now and will cover briefly in this guide soon) but I recomend you use both a base and a port rom that doesntg use aroma to start, much easier to learn. Even if the rom has been made before and you never post it, just try it out for the learning purpose.
And I can probably link you to other themeing guides if you can't find them, but there are a bunch of good ones on xda. But really, start small like swaping icons and such, then once this is easy move to bigger projects, I really can't stress enough to start with little projects
Best of luck to you!

Sent from my myTouch_4G_Slide using xda premium
 
  • Like
Reactions: hisee

hisee

Senior Member
Oct 29, 2010
3,114
247
MUMBAI
Oh so are you porting a rom right now? The guide I first linked you to is to compile from source. If you have never done either I highly recommend trying to port first as it is much easier.
there are guides to port here in xdau as well, or if you need I can link you to others
Aroma isn't bad once you get the hang of it (I've made lots of aroma packages now and will cover briefly in this guide soon) but I recomend you use both a base and a port rom that doesntg use aroma to start, much easier to learn. Even if the rom has been made before and you never post it, just try it out for the learning purpose.
And I can probably link you to other themeing guides if you can't find them, but there are a bunch of good ones on xda. But really, start small like swaping icons and such, then once this is easy move to bigger projects, I really can't stress enough to start with little projects
Best of luck to you!

Sent from my myTouch_4G_Slide using xda premium

Now days its very difficult to find rom without aroma thats the main issue.. Ya will start with some small project and then move on.. Thks for helping.. Will ping u if i need help :)

Sent from my GT-I9300 using xda premium
 

demkantor

Inactive Recognized Contributor
Nov 10, 2011
6,861
3,764
mpls
@spc_hicks09
Okay just got to a computer, much easier to read than on my phone!
so youre error looks to be a combo of the format and mount commands
format("ext4", "EMMC", "/dev/block/platform/msm_sdcc.1/by-name/system");
mount("ext4", "EMMC", "/dev/block/platform/msm_sdcc.1/by-name/system", "/system"); "0 /system/
Should look more like
format("ext4", "EMMC", "/dev/block/platform/msm_sdcc.1/by-name/system", 0);
mount("ext4", "EMMC", "/dev/block/platform/msm_sdcc.1/by-name/system", "/system");
Changing this should fix your flash, if not let me know.
But i would consider finding out where your partitions are held and then change commands accordingly. Cant say for sure why, but this is the only method i trust.
If your not sure I believe I covered it earlier, but easiest way is to run a terminal emulator on phone or adb shell and type
Then change each command accordingly in your updater script, so some common ones may look like:

format("ext4", "EMMC", "/dev/block/mmcblk0p25", 0);
or
mount("ext3", "EMMC", "/dev/block/mmcblk0p26", "/data");
or
package_extract_file("boot.img", "/dev/block/bml7" /boot");

Of course match to your phone, these are three different command, three different partitions on three different phones
If you need further help dont hesitate to ask!
Happy Flashing!
 

pcarenza

Senior Member
Jan 10, 2013
654
1,348
Chattanooga
Ok so i've compiled a ROM from source and am trying to flash it, but every time I flash I get this error:

Code:
E:Error executing updater binary in zip '/external_sd/Flash This/full_xt926.bdh.signed.zip'
Error flashing zip '/external_sd/Flash This/full_xt926.bdh.signed.zip'


I haven't really been able to find much on this through a 3 day google search. I found one topic that suggested it's the recovery but I know this is not the recovery, this is a ROM zip issue.

This is the recovery.log

Code:
Installing '/external_sd/Flash This/full_xt926.bdh.signed.zip'...
Checking for MD5 file...
I:Cannot find file /external_sd/Flash This/full_xt926.bdh.signed.zip.md5
Skipping MD5 check: no MD5 file found.
line 4 col 37: syntax error, unexpected STRING, expecting $end
1 parse errors
E:Error executing updater binary in zip '/external_sd/Flash This/full_xt926.bdh.signed.zip'
Error flashing zip '/external_sd/Flash This/full_xt926.bdh.signed.zip'

Here is the updater-script:

Code:
show_progress(0.500000, 0);
format("ext4", "EMMC", "/dev/block/platform/msm_sdcc.1/by-name/system");
mount("ext4", "EMMC", "/dev/block/platform/msm_sdcc.1/by-name/system", "/system"); "0 /system/
package_extract_file("check_data_app", "/tmp/check_data_app");
set_perm(0, 0, 0777, "/tmp/check_data_app");
run_program("/tmp/check_data_app");
package_extract_dir("data", "/data");
set_perm_recursive(1000, 1000, 0771, 0644, "/data/app");
package_extract_dir("system", "/system");
symlink("/persist/WCNSS_qcom_wlan_nv.bin", "/system/etc/firmware/wlan/prima/WCNSS_qcom_wlan_nv.bin");
symlink("/system/lib/libwiperjni_v02.so", "/system/lib/libwiperjni.so");
symlink("/system/lib/libxt_v02.so", "/system/lib/libxt_native.so");
symlink("Roboto-Bold.ttf", "/system/fonts/DroidSans-Bold.ttf");
symlink("Roboto-Regular.ttf", "/system/fonts/DroidSans.ttf");
symlink("busybox", "/system/xbin/[");
symlink("busybox", "/system/xbin/[[");
symlink("busybox", "/system/xbin/adjtimex");
symlink("busybox", "/system/xbin/arp");
symlink("busybox", "/system/xbin/ash");
symlink("busybox", "/system/xbin/awk");
symlink("busybox", "/system/xbin/base64");
symlink("busybox", "/system/xbin/basename");
symlink("busybox", "/system/xbin/bbconfig");
symlink("busybox", "/system/xbin/blkid");
symlink("busybox", "/system/xbin/blockdev");
symlink("busybox", "/system/xbin/brctl");
symlink("busybox", "/system/xbin/bunzip2");
symlink("busybox", "/system/xbin/bzcat");
symlink("busybox", "/system/xbin/bzip2");
symlink("busybox", "/system/xbin/cal");
symlink("busybox", "/system/xbin/cat");
symlink("busybox", "/system/xbin/catv");
symlink("busybox", "/system/xbin/chattr");
symlink("busybox", "/system/xbin/chgrp");
symlink("busybox", "/system/xbin/chmod");
symlink("busybox", "/system/xbin/chown");
symlink("busybox", "/system/xbin/chroot");
symlink("busybox", "/system/xbin/clear");
symlink("busybox", "/system/xbin/cmp");
symlink("busybox", "/system/xbin/comm");
symlink("busybox", "/system/xbin/cp");
symlink("busybox", "/system/xbin/cpio");
symlink("busybox", "/system/xbin/crond");
symlink("busybox", "/system/xbin/crontab");
symlink("busybox", "/system/xbin/cut");
symlink("busybox", "/system/xbin/date");
symlink("busybox", "/system/xbin/dc");
symlink("busybox", "/system/xbin/dd");
symlink("busybox", "/system/xbin/depmod");
symlink("busybox", "/system/xbin/devmem");
symlink("busybox", "/system/xbin/df");
symlink("busybox", "/system/xbin/diff");
symlink("busybox", "/system/xbin/dirname");
symlink("busybox", "/system/xbin/dmesg");
symlink("busybox", "/system/xbin/dnsd");
symlink("busybox", "/system/xbin/dos2unix");
symlink("busybox", "/system/xbin/du");
symlink("busybox", "/system/xbin/echo");
symlink("busybox", "/system/xbin/ed");
symlink("busybox", "/system/xbin/egrep");
symlink("busybox", "/system/xbin/env");
symlink("busybox", "/system/xbin/expand");
symlink("busybox", "/system/xbin/expr");
symlink("busybox", "/system/xbin/false");
symlink("busybox", "/system/xbin/fbsplash");
symlink("busybox", "/system/xbin/fdisk");
symlink("busybox", "/system/xbin/fgrep");
symlink("busybox", "/system/xbin/find");
symlink("busybox", "/system/xbin/flash_lock");
symlink("busybox", "/system/xbin/flash_unlock");
symlink("busybox", "/system/xbin/flashcp");
symlink("busybox", "/system/xbin/flock");
symlink("busybox", "/system/xbin/fold");
symlink("busybox", "/system/xbin/free");
symlink("busybox", "/system/xbin/freeramdisk");
symlink("busybox", "/system/xbin/fstrim");
symlink("busybox", "/system/xbin/fsync");
symlink("busybox", "/system/xbin/ftpget");
symlink("busybox", "/system/xbin/ftpput");
symlink("busybox", "/system/xbin/fuser");
symlink("busybox", "/system/xbin/getopt");
symlink("busybox", "/system/xbin/grep");
symlink("busybox", "/system/xbin/groups");
symlink("busybox", "/system/xbin/gunzip");
symlink("busybox", "/system/xbin/gzip");
symlink("busybox", "/system/xbin/halt");
symlink("busybox", "/system/xbin/head");
symlink("busybox", "/system/xbin/hexdump");
symlink("busybox", "/system/xbin/id");
symlink("busybox", "/system/xbin/ifconfig");
symlink("busybox", "/system/xbin/inetd");
symlink("busybox", "/system/xbin/insmod");
symlink("busybox", "/system/xbin/install");
symlink("busybox", "/system/xbin/ionice");
symlink("busybox", "/system/xbin/iostat");
symlink("busybox", "/system/xbin/ip");
symlink("busybox", "/system/xbin/kill");
symlink("busybox", "/system/xbin/killall");
symlink("busybox", "/system/xbin/killall5");
symlink("busybox", "/system/xbin/less");
symlink("busybox", "/system/xbin/ln");
symlink("busybox", "/system/xbin/losetup");
symlink("busybox", "/system/xbin/ls");
symlink("busybox", "/system/xbin/lsattr");
symlink("busybox", "/system/xbin/lsmod");
symlink("busybox", "/system/xbin/lsusb");
symlink("busybox", "/system/xbin/lzcat");
symlink("busybox", "/system/xbin/lzma");
symlink("busybox", "/system/xbin/lzop");
symlink("busybox", "/system/xbin/lzopcat");
symlink("busybox", "/system/xbin/man");
symlink("busybox", "/system/xbin/md5sum");
symlink("busybox", "/system/xbin/mesg");
symlink("busybox", "/system/xbin/mkdir");
symlink("busybox", "/system/xbin/mke2fs");
symlink("busybox", "/system/xbin/mkfifo");
symlink("busybox", "/system/xbin/mkfs.ext2");
symlink("busybox", "/system/xbin/mkfs.vfat");
symlink("busybox", "/system/xbin/mknod");
symlink("busybox", "/system/xbin/mkswap");
symlink("busybox", "/system/xbin/mktemp");
symlink("busybox", "/system/xbin/modinfo");
symlink("busybox", "/system/xbin/modprobe");
symlink("busybox", "/system/xbin/more");
symlink("busybox", "/system/xbin/mount");
symlink("busybox", "/system/xbin/mountpoint");
symlink("busybox", "/system/xbin/mpstat");
symlink("busybox", "/system/xbin/mv");
symlink("busybox", "/system/xbin/nanddump");
symlink("busybox", "/system/xbin/nandwrite");
symlink("busybox", "/system/xbin/nbd-client");
symlink("busybox", "/system/xbin/netstat");
symlink("busybox", "/system/xbin/nice");
symlink("busybox", "/system/xbin/nohup");
symlink("busybox", "/system/xbin/nslookup");
symlink("busybox", "/system/xbin/ntpd");
symlink("busybox", "/system/xbin/od");
symlink("busybox", "/system/xbin/patch");
symlink("busybox", "/system/xbin/pgrep");
symlink("busybox", "/system/xbin/pidof");
symlink("busybox", "/system/xbin/ping");
symlink("busybox", "/system/xbin/pipe_progress");
symlink("busybox", "/system/xbin/pkill");
symlink("busybox", "/system/xbin/pmap");
symlink("busybox", "/system/xbin/poweroff");
symlink("busybox", "/system/xbin/printenv");
symlink("busybox", "/system/xbin/printf");
symlink("busybox", "/system/xbin/ps");
symlink("busybox", "/system/xbin/pstree");
symlink("busybox", "/system/xbin/pwd");
symlink("busybox", "/system/xbin/pwdx");
symlink("busybox", "/system/xbin/rdev");
symlink("busybox", "/system/xbin/readlink");
symlink("busybox", "/system/xbin/realpath");
symlink("busybox", "/system/xbin/renice");
symlink("busybox", "/system/xbin/reset");
symlink("busybox", "/system/xbin/resize");
symlink("busybox", "/system/xbin/rev");
symlink("busybox", "/system/xbin/rm");
symlink("busybox", "/system/xbin/rmdir");
symlink("busybox", "/system/xbin/rmmod");
symlink("busybox", "/system/xbin/route");
symlink("busybox", "/system/xbin/run-parts");
symlink("busybox", "/system/xbin/rx");
symlink("busybox", "/system/xbin/sed");
symlink("busybox", "/system/xbin/seq");
symlink("busybox", "/system/xbin/setconsole");
symlink("busybox", "/system/xbin/setserial");
symlink("busybox", "/system/xbin/setsid");
symlink("busybox", "/system/xbin/sh");
symlink("busybox", "/system/xbin/sha1sum");
symlink("busybox", "/system/xbin/sha256sum");
symlink("busybox", "/system/xbin/sha3sum");
symlink("busybox", "/system/xbin/sha512sum");
symlink("busybox", "/system/xbin/sleep");
symlink("busybox", "/system/xbin/sort");
symlink("busybox", "/system/xbin/split");
symlink("busybox", "/system/xbin/stat");
symlink("busybox", "/system/xbin/strings");
symlink("busybox", "/system/xbin/stty");
symlink("busybox", "/system/xbin/sum");
symlink("busybox", "/system/xbin/swapoff");
symlink("busybox", "/system/xbin/swapon");
symlink("busybox", "/system/xbin/sync");
symlink("busybox", "/system/xbin/sysctl");
symlink("busybox", "/system/xbin/tac");
symlink("busybox", "/system/xbin/tail");
symlink("busybox", "/system/xbin/tar");
symlink("busybox", "/system/xbin/taskset");
symlink("busybox", "/system/xbin/tee");
symlink("busybox", "/system/xbin/telnet");
symlink("busybox", "/system/xbin/telnetd");
symlink("busybox", "/system/xbin/test");
symlink("busybox", "/system/xbin/tftp");
symlink("busybox", "/system/xbin/tftpd");
symlink("busybox", "/system/xbin/time");
symlink("busybox", "/system/xbin/timeout");
symlink("busybox", "/system/xbin/top");
symlink("busybox", "/system/xbin/touch");
symlink("busybox", "/system/xbin/tr");
symlink("busybox", "/system/xbin/traceroute");
symlink("busybox", "/system/xbin/true");
symlink("busybox", "/system/xbin/ttysize");
symlink("busybox", "/system/xbin/tune2fs");
symlink("busybox", "/system/xbin/umount");
symlink("busybox", "/system/xbin/uname");
symlink("busybox", "/system/xbin/uncompress");
symlink("busybox", "/system/xbin/unexpand");
symlink("busybox", "/system/xbin/uniq");
symlink("busybox", "/system/xbin/unix2dos");
symlink("busybox", "/system/xbin/unlzma");
symlink("busybox", "/system/xbin/unlzop");
symlink("busybox", "/system/xbin/unxz");
symlink("busybox", "/system/xbin/unzip");
symlink("busybox", "/system/xbin/uptime");
symlink("busybox", "/system/xbin/usleep");
symlink("busybox", "/system/xbin/uudecode");
symlink("busybox", "/system/xbin/uuencode");
symlink("busybox", "/system/xbin/vi");
symlink("busybox", "/system/xbin/watch");
symlink("busybox", "/system/xbin/wc");
symlink("busybox", "/system/xbin/wget");
symlink("busybox", "/system/xbin/which");
symlink("busybox", "/system/xbin/whoami");
symlink("busybox", "/system/xbin/xargs");
symlink("busybox", "/system/xbin/xz");
symlink("busybox", "/system/xbin/xzcat");
symlink("busybox", "/system/xbin/yes");
symlink("busybox", "/system/xbin/zcat");
symlink("mksh", "/system/bin/sh");
symlink("toolbox", "/system/bin/cat");
symlink("toolbox", "/system/bin/chmod");
symlink("toolbox", "/system/bin/chown");
symlink("toolbox", "/system/bin/cmp");
symlink("toolbox", "/system/bin/cp");
symlink("toolbox", "/system/bin/date");
symlink("toolbox", "/system/bin/dd");
symlink("toolbox", "/system/bin/df");
symlink("toolbox", "/system/bin/dmesg");
symlink("toolbox", "/system/bin/du");
symlink("toolbox", "/system/bin/getevent");
symlink("toolbox", "/system/bin/getprop");
symlink("toolbox", "/system/bin/grep");
symlink("toolbox", "/system/bin/hd");
symlink("toolbox", "/system/bin/id");
symlink("toolbox", "/system/bin/ifconfig");
symlink("toolbox", "/system/bin/iftop");
symlink("toolbox", "/system/bin/insmod");
symlink("toolbox", "/system/bin/ioctl");
symlink("toolbox", "/system/bin/ionice");
symlink("toolbox", "/system/bin/kill");
symlink("toolbox", "/system/bin/ln");
symlink("toolbox", "/system/bin/log");
symlink("toolbox", "/system/bin/ls");
symlink("toolbox", "/system/bin/lsmod");
symlink("toolbox", "/system/bin/lsof");
symlink("toolbox", "/system/bin/md5");
symlink("toolbox", "/system/bin/mkdir");
symlink("toolbox", "/system/bin/mount");
symlink("toolbox", "/system/bin/mv");
symlink("toolbox", "/system/bin/nandread");
symlink("toolbox", "/system/bin/netstat");
symlink("toolbox", "/system/bin/newfs_msdos");
symlink("toolbox", "/system/bin/notify");
symlink("toolbox", "/system/bin/printenv");
symlink("toolbox", "/system/bin/ps");
symlink("toolbox", "/system/bin/r");
symlink("toolbox", "/system/bin/reboot");
symlink("toolbox", "/system/bin/renice");
symlink("toolbox", "/system/bin/restart");
symlink("toolbox", "/system/bin/rm");
symlink("toolbox", "/system/bin/rmdir");
symlink("toolbox", "/system/bin/rmmod");
symlink("toolbox", "/system/bin/route");
symlink("toolbox", "/system/bin/schedtop");
symlink("toolbox", "/system/bin/sendevent");
symlink("toolbox", "/system/bin/setconsole");
symlink("toolbox", "/system/bin/setprop");
symlink("toolbox", "/system/bin/sleep");
symlink("toolbox", "/system/bin/smd");
symlink("toolbox", "/system/bin/start");
symlink("toolbox", "/system/bin/stop");
symlink("toolbox", "/system/bin/sync");
symlink("toolbox", "/system/bin/top");
symlink("toolbox", "/system/bin/touch");
symlink("toolbox", "/system/bin/umount");
symlink("toolbox", "/system/bin/uptime");
symlink("toolbox", "/system/bin/vmstat");
symlink("toolbox", "/system/bin/watchprops");
symlink("toolbox", "/system/bin/wipe");
symlink("wiperiface_v02", "/system/bin/wiperiface");
set_perm_recursive(0, 0, 0755, 0644, "/system");
set_perm_recursive(0, 0, 0777, 0777, "/system/etc/init.d");
set_perm_recursive(0, 2000, 0755, 0755, "/system/bin");
set_perm(0, 1000, 0750, "/system/bin/iptables");
set_perm(0, 3003, 02750, "/system/bin/netcfg");
set_perm(0, 3004, 02755, "/system/bin/ping");
set_perm(0, 2000, 06750, "/system/bin/run-as");
set_perm(0, 1000, 0750, "/system/bin/tc");
set_perm(1002, 1002, 0440, "/system/etc/dbus.conf");
set_perm(1014, 2000, 0550, "/system/etc/dhcpcd/dhcpcd-run-hooks");
set_perm(0, 2000, 0550, "/system/etc/init.goldfish.sh");
set_perm_recursive(0, 0, 0755, 0555, "/system/etc/ppp");
set_perm(0, 2000, 0755, "/system/vendor");
set_perm(0, 2000, 0755, "/system/vendor/lib");
set_perm_recursive(0, 2000, 0755, 0644, "/system/vendor/lib/drm");
set_perm(0, 0, 0644, "/system/vendor/lib/drm/libdrmwvmplugin.so");
set_perm_recursive(0, 2000, 0755, 0755, "/system/xbin");
set_perm(0, 0, 06755, "/system/xbin/su");
symlink("/system/xbin/su", "/system/bin/su");
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/tcpdump");
show_progress(0.200000, 0);
show_progress(0.200000, 10);
package_extract_file("boot.img", "/dev/block/platform/msm_sdcc.1/by-name/boot");
show_progress(0.100000, 0);
assert(package_extract_file("boot.img", "/tmp/boot.img"),
       write_raw_image("/tmp/boot.img", "boot"),
       delete("/tmp/boot.img"));
unmount("/system");
unmount("/data");

For those who are learning this process, the error is on line 3. There should be nothing after the semicolon, which terminates a command line.
 
  • Like
Reactions: kuma82

demkantor

Inactive Recognized Contributor
Nov 10, 2011
6,861
3,764
mpls
@pcarenza
Sorry, you are limited to 8 thanks per day .... I hate seeing this!
Anyway, thanks for popping in, Its nice to have others help out in this thread as well!
 

Oba-artefact

New member
May 30, 2013
3
0
Brussels
Hi,
The SignApk.rar file you give is password locked in mediafire...
Can you give the password?
Sorry if I missed it in the thread but can't find it.
 

spc_hicks09

Inactive Recognized Contributor
Jan 23, 2011
3,899
1,858
Marion, OH
www.facebook.com
For those who are learning this process, the error is on line 3. There should be nothing after the semicolon, which terminates a command line.

I appreciate it pcarenza! However, after deleting that line and flashing again, i get the same error "error executing updater binary"

This is the latest recovery.log:

Code:
script aborted: format() expects 5 args, got 3
format() expects 5 args, got 3
E:Error executing updater binary in zip '/external_sd/Flash This/full_xt926.bdh.signed.zip'
Error flashing zip '/external_sd/Flash This/full_xt926.bdh.signed.zip'
Updating partition details...
 

demkantor

Inactive Recognized Contributor
Nov 10, 2011
6,861
3,764
mpls
@spc_hicks09
Did you see my previous post? Were you able to try this? Also check you have the proper update-binary. This is what's doing the checks and may change between different versions

Sent from my Nexus 7 using xda premium
 

spc_hicks09

Inactive Recognized Contributor
Jan 23, 2011
3,899
1,858
Marion, OH
www.facebook.com
@spc_hicks09
Did you see my previous post? Were you able to try this? Also check you have the proper update-binary. This is what's doing the checks and may change between different versions

Sent from my Nexus 7 using xda premium

Yes, everything is correct with the update-binary now, the only issues now are in the updater-script, which i'm guess is what my above errors are about.

I'm not sure what to do about those errors. I feel i'm getting closer to having this thing boot though.
 

demkantor

Inactive Recognized Contributor
Nov 10, 2011
6,861
3,764
mpls
Did you try what I said from a few posts back? Did you find your mount points?

Sent from my Nexus 7 using xda premium
 

spc_hicks09

Inactive Recognized Contributor
Jan 23, 2011
3,899
1,858
Marion, OH
www.facebook.com
Did you try what I said from a few posts back? Did you find your mount points?

Sent from my Nexus 7 using xda premium

I deleted the mount point you pointed out but haven't gotten around to adding them back in yet. I repo sync'd again and am building again in hopes that maybe it was just a bad sync. I'll still keep you updated though sir. Thank you so much for all your help by the way, lots of people have been A LOT less helpful.
 

pcarenza

Senior Member
Jan 10, 2013
654
1,348
Chattanooga
I deleted the mount point you pointed out but haven't gotten around to adding them back in yet. I repo sync'd again and am building again in hopes that maybe it was just a bad sync. I'll still keep you updated though sir. Thank you so much for all your help by the way, lots of people have been A LOT less helpful.

Check the syntax of the 'formatt' command and make sure yuour parameters match. This is just like any scripting language - picky and unforgiving, but rewarding in the end.
I could swear by looking up the init language for format, it only takes one parameter...
 
Last edited:

spc_hicks09

Inactive Recognized Contributor
Jan 23, 2011
3,899
1,858
Marion, OH
www.facebook.com
Check the syntax of the 'formatt' command and make sure yuour parameters match. This is just like any scripting language - picky and unforgiving, but rewarding in the end.
I could swear by looking up the init language for format, it only takes one parameter...

Getting ready to go to the beach lol but will definitely get this going when I get back. SO hard to not give up haha.
 

Top Liked Posts

  • There are no posts matching your filters.
  • 63
    Introduction
    Hello Again! I have decided to make a series of tutorials for the XDA-University posted into this forum.
    These guides will be geared toward the novice but will involve tips and instructions I hope seasoned users will find helpful as well.

    Current list of guides
    Fastboot Installation and Usage

    All of my guides are to be considered a work in progress, only because I never consider any guide complete and will continue to update and answer questions for a long time to come.

    What To Expect From This Guide
    The basics on how to create a .zip to be flashed in recovery
    *This will include a series of commands executed in the updater-script
    And of course this means you will learn at least some basics of Edify, the basic script you will write these commands in.
    I also will be adding a short section on Aroma Installer but am willing to answer questions on it use as well.

    This Guide will be for Linux and Windows (Sorry Apple fanboys, not trying to be a jerk but I got to stick to my principles)

    **As always I encourage questions as I am not always clear and I can easily overlook something.
    33
    What Is an update.zip?

    Although this guide will cover the basics, I hope you don't need an answer to this question. I am to go over how to make one starting with some basics you will need to understand.

    File Structure
    There aren't many ways to setup the basic file structure and I have included a sample.zip for you to use. I find looking at one is the easiest way to understand.
    To create your own it is as simple as creating a new folder named whatever you would like. Inside this folder create another new folder named exactly
    Now inside this folder you will create another folder named
    Now another folder named
    And lastly one more folder within it named
    Here inside the android folder you will have two files, these need to be named exactly again
    and
    The update-binary is best to be taken from the latest OTA update from your device, chances are you are not the first to make a ROM or mod or whatever else needs to be flashed in recovery
    So feel free to take this from one of those as well (these by in large are not custom made by a dev and no permission should be needed)
    Structure of your update.zip should be as such:
    update/META-INF/com/google/android and in this last folder will be the two scripts.
    example.png


    Edify

    This is the language used in the scripts we are writing, It is simple, straight forward, and much more forgiving then Java for example.
    This is the syntax we will use in the updater-script, the update-binary will not be edited and only will need to be copy and pasted. It is best to seek out the latest for your device
    The next post will be filled with samples of commands you can use in your updater-script that will perform various functions to your device

    Tools Needed
    There is no heavy computing here, old and new computers alike can handle this sort of task. I have made update.zips in both Linux and Windows with both super fast and terribly slow machines.
    No I will not go over how to create your ROM or mod or whatever you are attempting to flash to your phone, I am only going to explain how to flash it.
    So the list of tools needed is very small for the basics here.

    Windows
    I highly recommend using 7zip but yes there are other options
    Another must have will be notepad ++, This really should have a tutorial for itself but I'll help with the basics
    There are many tools to sign and i have just used THIS ONE forever so I'll recommend this, there are however easier ones that allow you to right click a file to sign it.
    Which is amazing and I use one for my Linux box, now that I'm writing this maybe its time I change my windows one... to THIS MAYBE?
    Also be sure to have the latest Java installed found HERE
    And really that should cover us, there are lots of helpful apps and programs to make life easier but this will do just fine!

    Linux
    There are loads of tools I can recommend and variations on each one, so I will just list a few must haves to make your basic update.zip
    There is a 7zip variant for Linux, use the terminal and type:
    Code:
    sudo apt-get install p7zip
    Now you can use gedit as your text editor or i personally like Sublime Text there is a Windows compatible version too that i have yet to check out.
    And we need to sign these .zips, for Linux i use This One created by Amon_RA
    You will need to add this script to your nautilus script directory and name it sign
    Code:
    #!/bin/sh
    # Update the Loc var to where YOU stored the testsign.jar file !
    
    Loc=/home/demkantor/adt-bundle-linux-x86_64-20130219/sdk/tools
    
    for arg
    do
    
    java -classpath "$Loc"testsign.jar testsign "$arg" "$arg"-signed
    gdialog --title "signapk" --msgbox ""$arg"-signed created" 200 200
    
    done
    Be sure to change Loc=/home/demkantor/adt-bundle-linux-x86_64-20130219/sdk/tools to the proper path as yours will be different.

    *note* in 13.04 this is moved to ~/.local/share/nautilus/scripts/ but in previous Ubuntu releases it was in ~/.gnome2/nautilus-scripts
    This had me pulling my hair out and looking for a nice new tool and am currently trying THIS OUT (the old way still works though)

    Also get the most up to date Java, from a terminal type
    Code:
    sudo add-apt-repository ppa:webupd8team/java
    sudo apt-get update
    sudo apt-get install oracle-java7-installer
    sudo update-java-alternatives -s java-7-oracle
    *If doing lots of android development you may want to look into an older java version... but thats another story, see a guide on developing if thats your bag


    So now you understand the basics, you have all the tools you need, got may sample.zip and are ready to learn how to.
    The next post be available commands to use in your updater-script

    *See post #12 to understand a common problem people (sometime even myself) make with the sample.zip below
    24
    Let's Start!

    Now We Have Our Tools And A Basic Understanding
    But we need to know how to have our update.zip do what we would like!
    We need to see the various functions available to us, this I copied from the XDA wiki as it is precise and simple, (Normally I wouldn't copy and paste but this is what you need exactly) I will next give examples:

    Need To Know!
    Syntax
    The script file must use UNIX newlines as EOL.
    Whitespace (space, tab, LF 0x0a, but not CR 0x0d) may be freely used.
    Comments are any line prefaced with #
    All commands are terminated with a semicolon. Clauses (in ifelse) may contain any number of commands, each terminated with a semicolon.
    Strings are usually delimited with double quotation marks.
    Numbers are really just strings and are usually not delimited.
    Logical values are "t" for true or "" for false.
    The comparison operators are == (string equal), != (string not equal).
    The logical operators are || (logical or), && (logical and), ! (logical not).
    The concatenation operator is +. (Caution: 2+2==22)
    The conditional keywords if, then, else and endif operate as expected. The ifelse macro may be used instead.

    Disk operations
    format(type, device)
    mount(type, device, mountpoint)
    unmount(mountpoint)
    is_mounted(mountpoint)

    Image operations
    write_raw_image
    write_firmware_image

    File operations
    package_extract_file(source, destination)
    package_extract_dir(source, destination)
    delete(file) – deletes a file
    delete_recursive(directory) – completely deletes a directory
    symlink(target, link0, ...) – create any number of links to a target
    set_perm(user, group, mode, file) – performs a chown, chmod on a file
    set_perm_recursive(user, group, mode, directory) – performs a chown, chmod on all contents of a directory
    getprop(key) – returns a string value of the associated key from the system properties
    file_getprop(file, key) – returns a string value of the associated key from a specific file

    Patching operations
    apply_patch
    apply_patch_check
    apply_patch_space
    run_program(program, arg0, ...)

    Control
    assert(condition0, ...) – aborts and prints on any false condition
    abort(message)
    ifelse(condition, trueclause, falseclause) – conditional, falseclause is optional

    Predicates
    is_substring(substring, string) – checks to see if string constains substring anywhere
    less_than_int(x, y) – checks to see if x<y when considered as integers
    greater_than_int(x, y) – checks to see if x>y when considered as integers

    User feedback
    show_progress(fraction, seconds) – advance progress bar a fractional amount over a period of seconds
    set_progress(fraction) – advance progress bar a fractional amount
    ui_print(message0, ...) – print any number of strings
    sleep(seconds) – pause a number of seconds


    Having a list of the available commands is great but we need to understand what they do, consider the above a reference point and below and understanding of the commands


    How To begin the Process
    First find out what you want to do, get your apps, images, what ever you are trying to do in order and then open your text editor (Windows notepad ++ and Linux gedit)
    Then make sure the file structure in your folders are correct and have the update-binary specific to your device and be ready to write your updater-script
    I will go deeper into the setup in a moment but for now we need to understand how to write the updater-script

    Basic Usage
    Often you will start this script with a ui_print(" "); to explain the purpose of the package you made. There are many ways to go about this but a simple start maybe:
    Code:
    ui_print("Modded Google Play App By demkantor");
    This can be as complex or simple as you want and include as many lines as you would like. We just want to tell the user what is happening to their phone.
    We also want to have the progress show, this will help the user know when everything will finish, especially bigger packages that can take some time, don't want people to think its stuck!
    There are a couple ways to do this, I tend to use a series of set_progress(0.1); starting in the beginning and working to set_progress(1.0); when complete. you may also use time as in show_progress(fraction, seconds) choice is yours:
    Code:
    set_progress(0.1)
    # Something going on
    set_progress(0.5)
    # Some more stuff is happening
    set_progress(1)
    # Indicates completed task
    Now you may have notice I used # symbols in front of some lines, these are used to comment lines that aren't part of your script and for you and only you by and large.
    Any line that begins with # will not be read by the script, here is a short example of usage:
    Code:
    set_progress(0.1)
    ui_print("Modded Google App By demkantor");
    ui_print(" ");
    # Need to mount system
    ui_print("mounting system partition");
    set_progress(0.3)
    mount("ext4", "EMMC", "/dev/block/mmcblk0p25", "/system");
    # Flash modded google app
    ui_print("Flashing App!");
    set_progress(0.5)
    package_extract_dir("system/app/com.modded.app", "/system/app");
    # Don't Forget to set Permissions
    ui_print("Setting Permissions");
    set_progress(0.7)
    set_perm(0, 0, 0644, "/system/app/ModdedGoogleApp.apk");
    # Unmount system before we finish
    ui_print("Unmounting System");
    unmount("/system");
    ui_print("You're Finished! Thanks For Using My App!");
    set_progress(1)

    Explaining the Above
    This would be a very basic setup, and the comments, extra uiprints, and set progress are not really necessary in such a basic flash, but it will be good practice to use all this as you progress
    I need to explain a few things in that script quickly:
    You notices i commented out a line (# Need to mount system) and underneath a line read <mount("ext4", "EMMC", "/dev/block/mmcblk0p25", "/system");>
    This will change from device to device but you need to mount your system or data or whatever to flash to it.
    The first bit "ext4" is the type of file system, there are many options here but use what your phone is partitioned to.
    Some common file systems: rfs yaffs2 ext2 ext3 ext4 vfat
    Next is the partition type: "EMMC" or "MTD" for the most part
    Next is the location of the file system; This is key as you don't want to flash an app to your EFS partition or whatever. "/dev/block/mmcblk0p25" is the system partition location for the device in this example, to find yours do this:
    Open a terminal emulator on your devices and type: mount
    Or
    Open an adb shell and type : mount
    these are just two quick and simple ways but there are many others
    Last is the mount point, or name of this partition, the example above was "/system"); The more common partitions you will mount will be system and data but you can of course do others, just make sure everything matches.

    You also noticed this line: # Flash modded google app , and the comment is just telling you what command you want to do next, in this case:
    package_extract_dir("system/app/com.modded.app", "/system/app");
    This is taking everything in the folder /com.modded.app from within the update.zip and installing it in /system/app on the device.
    **Note understand if an app installed is best as a system app or userdata app**
    package_extract_dir("data/app/myspecialapp", "/data/app");
    this may be a more common example.

    You also saw the commented line: # Don't Forget to set Permissions
    and permissions that were set: set_perm(0, 0, 0644, "/system/app/ModdedGoogleApp.apk");
    This set rw- r-- r-- with no special permissions to ModdedGoogleApp.apk
    This is important to do as not setting the proper permissions will to allow the app to function as you intend.
    If you are familiar with Linux/Unix chmod commands (change mode) then this is all we are doing. Or if you ever user Root Explorer or any other root access file manager in Android you may be familiar
    If not I suggest to read up on THIS as its important to know

    And The last piece in there was unmount("/system"); which I'm sure wont need any explaining.
    You also notice progress and ui prints helping the user along, These were not placed well or really all too needed in such a simple script,
    but I wanted you to see an example and learn to use them along with comments for yourself as your scripts become more complex.
    Lets do some of this more complex stuff now!


    The last chunk should have helped you understand some simple scripting, but really this is far from enough unless you are only ever planing to flash one app!
    So lets dig deeper into Edify and see if we can create an ever better update.zip!


    Erase Commands
    Format, delete, and delete_recursive can be very helpful, I'm a huge supporter of wiping clean before flashing a new ROM and occasionally wiping cache and dalvik after.
    It will be handy for you to add these functions in to lets say a ROM you made before a flash if you deem it necessary or wipe cache and dalvik after your mod.
    No matter the reason you should understand how and when you should do this.
    Code:
    delete("/data/app/googlePlayMusic.apk");
    delete("/system/app/Provision.apk","/system/app/QuickSearchBox.apk","/system/app/SetupWizard.apk");
    The above is doing two things, first it is deleting a single app from data partition (googlePlayMusic.apk)
    Next it is deleteing a series of apps from system partition (Provision.apk, QuickSearchBox.apk, and SetupWizard.apk)
    The reasoning why you want to delete a single file or app is up to you to decide, but the above will do it easily. If you want to delete a full directory then:
    Code:
    delete_recursive("/system"); 
    delete_recursive("/cache"); 
    delete_recursive("/data");
    So this is a series of three commands to delete everything in system, cache and data. You may also string them together into one command separating each with a comma.
    Code:
    ui_print("Formatting system");
    format("ext4", "EMMC", "/dev/block/mmcblk0p25", 0);
    The above will completely format and erase system, you could also do data, cache, boot, whatever. Just be careful as this will make all data unrecoverable.
    You would need to unmount the partition before you run any format command
    Code:
    unmount("/system");
    unmount("/data");
    Know the partition to unmount, then know the partition to format (ie mmcbl0p25 is not always system!)
    when you are ready to flash something to a partition go back and mount it (this I covered earlier)


    So now we have an idea on how to use some basic commands, lets put together a couple simple scripts and try to flash them!
    Once you are confident with do this we will create our own more complicated flashable .zips


    Lets try something simple
    So most everyone who is bothering to read this enjoys flashing ROMs and probably does this a lot. But as we all know setting up a new ROM is time consuming!
    One of the first update.zips I ever wrote was to flash about 20 apps I always used and each time I flashed a new ROM I would have to redownload them or use an app like Titanium Backup to reinstall them.
    I found it just far easier to make a flashable .zip and keep in on SD card so after each wipe and ROM flash I could just flash this next and all would be there.
    So lets do it together!

    First
    Make the file structure I showed before, or download my sample.zip from previous post. If its a new folder lets name it apps2install, If you have the .zip extract contents and name the main folder apps2install.

    Second
    Now we need some apps, lets take a couple free apps (never share paid apps in this forum! or anywhere really) For simplicity sake lets take three apps:
    ADW Launcher, Dropbox, and Pandora... all are free on the market and for simplicity sake I suggest you take these same apps.
    Download from market and bring the .apks to your computer, do this with either copying them with a file explorer and saving them to sd card, then transferring to computer or I prefer to use ADB. Your choice:
    *Method 1... File Explorer
    Open any file explorer after downloading apps, go to /data/app , and now copy the three .apks and transfer to sd card.
    Now go back to /data/app-lib and copy com.dropbox.android-1 folder to SD card
    ScreenshotCombo.jpg
    Once you have the 3 .apks and one app-lib, connect phone to USB and transfer to computer. Then we need to put them in proper folders, again there are multiple ways but play along for learning purposes.
    FileStructure.jpg
    Your file structure should now look like the above, orange is folders, green .apks, and grey files

    *Important, most apps store themselves to /data partition, some need to be in /system. Some apps are downloaded to /mnt/asec and not always do libs go into data/app-lib
    My point is to know where your apps are to pull them and know if there are any needed libs to make them function properly. This is on an app by app and ROM by ROM basis


    *Method 2... using adb
    For me adb is faster and I like the command line so if your good with adb I say go this route, if not I suggest reading up on it and then using it or use previous method
    So download the apps to your phone I mentioned above, now connect phone to PC and open terminal/cmd and type
    Code:
    adb pull /data/app /pulled
    adb pull /data/app-lib /pulled
    This will pull all apps store on /data/app and all app libs stored on /data/app-lib to your PC into a folder called pulled.
    If you only want to pull the apps in question the add com.dropbox.android-1 after /app and /app-lib (or whatever the app / lib is titled you want to pull)
    And if you want a differemt folder to be stored on pc change the /pulled to whatever you like, maybe C:\Users\youraccount\Desktop\pulled (for windows)
    Or /home/youraccount/pulled (for Linux) your choice on all this

    Third
    Lets write the script, I'm using notepad++ in windows here (currently booted in windows so...), use gedit or what you prefer in Linux, just be sure to write in UNIX format.
    Code:
    ui_print("Flasing Your First update.zip.....");
    set_progress(0.1);
    # Mount System Partition
    ui_print("Mounting System");
    mount("/system");
    # Mount Data Partition
    ui_print("Mounting Data");
    mount("/data");
    set_progress(0.3);
    ui_print("Flashing Apps!");
    ui_print("....");
    package_extract_dir("system/app", "/system/app");
    set_perm(0, 0, 0644, "/system/app/org.adw.launcher-1.apk");
    package_extract_dir("data", "/data");
    set_perm(0, 0, 0644, "/data/app/com.dropbox.android-1.apk");
    set_perm(0, 0, 0644, "/data/app/com.pandora.android-1.apk");
    ui_print("....");
    set_progress(0.6);
    # Set Permissions
    ui_print("Setting Permissions");
    set_perm_recursive(0, 0, 0755, 0644, "/system/app");
    set_perm_recursive(1000, 1000, 0771, 0644, "/data/app");
    set_progress(0.8);
    # Unmount System & Data
    ui_print("Unmounting System");
    unmount("/system");
    ui_print("Unmounting Data");
    unmount("/data");
    ui_print("****Hope You Learned Something New Today!****");
    set_progress(1);
    This Is an example of your updater-script, it should look similar but it does not have to be the same. Let me explain further:
    The first few lines in this script we have gone over, the ui_prints and the mounts, do what you want with ui_prints and use mounts for your devices
    #comments - we talked about these too, these will not be read by the script, rather for your purpose.
    You also should be familiar with the set_progress, use at your will, not needed
    Now you see package_extract_dir("system/app", "/system/app"); this, like before is dumping everything from system/app in your update.zip to /system/app on device
    Now the permissions again, set_perm is for a single file, in this case rw- r-- r--to adw launcher, which was just flashed as a system app.

    Then there is package_extract_dir("data", "/data");
    This is taking everything from the data folder in your update.zip and transferring it to /data on your device.
    Remember we had 2 apps and 1 lib in data, but with this one command we put all on device in proper places. We could have separated the commands, but why bother!

    Speaking of why bother you may have noticed that after each transfer from update.zip to device there were permissions set at the end.
    Then toward the end of this script more permissions? Why? Well, to learn!

    The first command <set_perm> is for a single file and the last commands <set_perm_recursive> were for an entire directory.
    So you can set up each individual app or whatever with permissions, or just change a full directory. Each case is different and you will need to asses what is best in your situation.
    But yes, there was no need to do it twice here ;)

    The last bit in this script is unmounting partitions and some ui_prints and set_progress, these we have covered.
    And being this the end, lets move on to our next steps! (save your work!)

    Forth
    Now we should look over our script for errors, check for proper encoding, and make sure everything is saved to proper directory.
    Once all is correct we need to zip it, I prefer 7zip but do as you please.
    In windows, highlight the 3 folders (system,data,META-INF) > right click > 7zip > add to archive
    sevenzipexample.jpg
    Now make sure you set compression level to store, pretty much make sure it looks like pic bellow
    7zipExample.png
    Now that this is done, you will see your new zip (apps2install.zip) Great but it is still best to now sign this zip, but not needed depending on your recovery setup.

    **Note will soon add photos for Linux (just need to reboot!)

    Fifth
    Signing the zip, again there are multiple ways, I will show two signing methods, one in Windows and one in Linux. Choose one of these or another method, use what works for you!

    **Windows**
    I am choosing to use SignApk to sign apps in windows, the link is above and why not, HERE IT IS AGAIN
    Unzip it, put the contents where you want (directly on (C:) or creating a path in environmental variables is nice but unneeded)
    Put the apps2install.zip in this folder then open CMD in the same location as contents and type:
    Code:
    java -jar signapk.jar certificate.pem key.pk8 apps2install.zip apps2install-signed.zip
    And now you will see two copies (of course the one titled apps2install-signed.zip is the one to flash)
    As a side note you can change apps2install-signed.zip to what you want, no need for the -signed but at first it is nice to know which is which

    **Linux**
    So on both my Linux boxes I use @Amon_RA's right click to sign script, but have recently been trying out another by @lithid-cm which is quite nice.
    See the second post for a quick guide on how to set up and know that nautilus-scripts have moved in Ubuntu 13.04!
    So simply right click on the .zip, navigate to scripts, choose sign, profit


    All right! Now transfer your newly made update.zip to your recovery and give it a flash! When complete see if your new apps appear and if they work!
    If all is good try your to make your own, if you get errors, post here and I'll try to help!

    Happy Flashing!
    7
    Well I'm glad to know I'm wanted :D
    Learning to make your own modifications, kernel, ROMs, whathaveyou can get to be tricky. I would really recommend to start real small
    start with some easy stuff like take a ROM you like in a .zip, extract it, and dig through each folder so you see what types of things are in there.
    Grab an app and do the same thing, don't bother to decomplie it just use 7zip or something to extract its contents and just peer.
    Learn some coding, code.org and code academy is great for simple stuff, I just love Marakana TechTV (a Youtube channel)

    When you get your head around the simple things, try a small task, don't try to
    here is some sage advice from one of the top dev's ever Read

    I'm not saying this to stop or slow you down, just want to say be ready to do a lot (seriously a lot) of reading and research and be ready to fail a few times for sure. I am more to teach you what i know but I cant say I'm an expert in android coding, but as always, ask questions and ill do my best to answer!
    6
    How To Make An Aroma Installer Package

    Now it seems like every ROM or mod is flashed with aroma rather than a simple .zip, and for good reason.
    Aroma is a handy tool to allow users to flash what they want, be it a ROM, kernel, Mod, whatever, it just makes things simple. Not to mention a customizable UI.
    In truth this is very easy to set up and only requires a few more steps than making you standard flashable .zip, it will be only as complicated as you make it.
    The best advice I have for anyone wanting to use Aroma is to download the demo from HERE and see how it works.
    Then download a few other Aroma Packages to see how the file structure differs, and how the updater-script and aroma-config are used.
    Here are a couple I have made for different devices, feel free to download and look them over.
    An Aroma Package for any ROM for the Samsung Sidekick 4G This one flashes no ROM just basic apps and mods
    Splash Screen and Bootanimation Aroma for the HTC VISION This only flashes new splash screens and Bootanimations
    An Aroma Package for the HTC Vision for a specific ROM This one is ROM specific as it contains mods for only one ROM
    A ROM Using Aroma To Install Various Features This one is a ROM specific to the HTC Vision that uses Aroma to customize the install

    As you can see there are many ways to use Aroma to your benefit, and its up to you how to use it. I will be keeping this short but will try to help you understand the basics.
    As Always i encourage questions whenever you have them! Another Great Place To Ask Questions

    File Structure
    So once you download any Aroma package (be it from a ROM or the demo) you should see something similar to this:
    AromaFileStructure.jpg
    Create any folder you need in the same level as META-INF, such as system, data, or whatever you want really. You just will need to organize it in a way to tell the updater-script where to look.

    To Start
    Take an update-binary from your device and rename it to update-binary-installer, replace this in the one in the aroma demo.
    Now the two main files we will cover here are the aroma-config and updater-script.
    Think of aroma-config as the script for how you want aroma to look and what options to flash.
    Then think of the updater-script as what actually does the installation after user choose what he/she wants. This is written in the same syntax as covered before but a few extras are added.

    aroma-config
    Lets begin with editing the aroma-config (if using windows we need to use notepad++, in Linux use your favorite editor)
    We will create something simple, an Aroma package to flash a choice between four kernels, four launchers, and four apps. (of course we could do a lot more but this will do for a start)

    Lets Begin!
    Open a new file in notepad++ or your Linux text editor and name it aroma-config. Or feel free to take the one in the demo package, but we are going to start fresh so make sure you are on a blank page.
    The beginning should look like this
    Code:
    # Demo Aroma Script, Make changes accordingly.
    # ---------------------------------------------
    ini_set("rom_name",		"MyFirstAromaInstaller");
    ini_set("rom_version",		"1.0");
    ini_set("rom_author",		"demkantor");
    ini_set("rom_device",		"MyDevice");
    ini_set("rom_date",		"CurrentDate");
    Of Course name it as you please, change the version as necessary, best to use your name over mine, use your device and add the date.
    These are all variables that can be set throughout the install process and by adding this in the script you can just change date, build, etc at the top of the script rather than searching... some of my scripts are well over 1000 lines and this is a nice feature.

    Ok, next lets add a blank line to separate (hit enter) and start line 9 like so
    Code:
    # Splash screen "3000" = "3" secs , "cyan_splash"=filename of splash png
    # --------------------------------------------------------------------
    splash(4000, "cyan_splash");
    This will be the splash screen when aroma first starts up, I am directing it to a .png image named cyan_splash.png and have it set for 4 seconds (change accordingly)
    this image is to be place in the aroma folder, in the demo there is one named sample_splash - feel free to edit this at your will

    The next two chunks in the script will be for the font and theme, we aren't going to get fancy here so adding this to the script will suffice
    Code:
    # Font size declaration. "0" = Small Font. "1" = Big Font.
    # --------------------------------------------------------
    fontresload( "0", "ttf/Roboto-Regular.ttf", "12" );
    fontresload( "1", "ttf/Roboto-Regular.ttf", "18" );
    
    # Theme used for aroma interface
    # ------------------------------
    theme("ics");
    This is to use the already made Robot font, and we have both the large and small set, then a space and we are using the premade ics theme.
    If you want to change any of this feel free to use whats already in the aroma demo (look in the folders) or create your own. But for now lets move on

    The first page of your aroma package should be a welcome/explanatory page. It should inform your users what the will be flashing, what device it is meant for and anything else you may want to convey.
    Here is a sample and just change accordingly:
    Code:
    # First page info
    # ---------------
    viewbox("Welcome!","You are about to install <b>XXX.AromaPackage</b> for your <b>Name Of DEvice</b>, built by <b>demkantor</b>.\n\n"+
    	"Proceed with the installation only if you're <b>Ready to be wowed by my amazingness!</b>\n\n"+
    	"You May Leave Aroma Installation At Any Time Using The <b>Menu Button</b>.\n\n"+
    		" Version: \t<b><#selectbg_g>"+ini_get("rom_version")+"</#></b>\n"+
            " Built: \t\t<b><#selectbg_g>"+ini_get("rom_date")+"</#></b>\n"+
            "\n\n"+
        "Press Next to Continue the Installation",
      
        "@welcome"
    );
    A couple things to note here, <b> </b> boldens the chosen text, the \n\n"+ ends the line, the @welcome tells aroma what the screen should be setup like, the viewbox( begins the code and the ); ends the code for this section.
    I will go over viewbox, checkbox, and selectbox in more depth later.

    Remember the ini_set variables from the beginning, this will automatically add the proper date and version to the welcome screen... nice!
    And now lets add
    Code:
    setvar("installer_title",
           "You are about to install <b>MyAromaPackage</b> "+
           "with the following choices:");
    Rename as you see fit, oh and this next piece is optional but i throw it in many of my packages, here is a good time for:
    Code:
    # ---------------
    # Generic Warning
    # ---------------
    alert(
    	"Warning!",
    	"Please Make Sure You Know What You Are Doing And Can Recover Your Device, What You Do To Your Phone Is Your Own Choice!",
    	"@alert"
    );
    This is a small alertbox that flashes on the users screen, you can have it say whatever you'd like and change the style, font, colors, etc. You can also add a yes/no button or view changelog, etc etc, but we're keeping this simple
    On to the real codding!
    Code:
    # -------------------------------
    # Kernel choices using selectbox.
    # -------------------------------
        selectbox(
          "Kernel Choices",
          "Choose the Kernel to install to your device",
          "@personalize",
          
          "kernel_choices.prop",
          
          #------------------------------------[ selectbox With Groups ]---------------------------------#
          # TITLE            |  SUBTITLE                                                 | Initial Value #
          #------------------+-----------------------------------------------------------+---------------#
    
          "Kernel Choices",					"",								2,      #-- Group 1. key = "selected.1"
            "Kernel Choice 1",				"A Kernel as boot.img",				0,      #-- selected.1 = 1
            "Kernel Choice 2",				"A Kernel as zImage",				0,      #-- selected.1 = 2
            "Leave Kernel as is",			"Not Touching Kernel",				1       #-- selected.1 = 3
        );
    
            appendvar("installer_title", "\n\n<b>Kernel Choices</b>");
            appendvar("installer_title", iif(prop("kernel_choices.prop", "selected.1")=="1", "- Flash Kernel 1 ", ""));
            appendvar("installer_title", iif(prop("kernel_choices.prop", "selected.1")=="2", "- Flash Kernel 2 ", ""));
            appendvar("installer_title", iif(prop("kernel_choices.prop", "selected.1")=="3", "- Skip Kernel Installation ", ""));
    Ok, lets explain this chunk. The first three lines you see are commented out, this is just for anyone looking at the code to know what is happening.
    the next line gives us the aroma ui option of select box, this allows user to select one and only one option (as you may have guesses you don't want to flash two kernels)
    It starts from selectbox( and ends the ui at );
    The next line will be the header on the ui "Kernel Choices", after this an explanation in the ui "Choose the Kernel to install to your device",
    and the following "@personalize", is the style aroma will use, for the most part "@personalize", will be used at all user install screens within aroma
    And next we have "kernel_choices.prop", which the updater script uses to know what option the user want to flash from the category Kernel Choices

    Now we have some more commented lines, again this is just for reference to make life easier
    And know you see 4 more lines, the first is giving the header for the category, and the next three are the two kernel options and the third is to not flash a kernel.
    "Kernel Choices", is your header "", is an empty subtitle that could be filled for added info to the user the 2, explains to aroma its the header
    The #-- Group 1. key = "selected.1" is telling aroma this is the first group and to write the choice to kernel_choices.prop as selected.1
    If we wanted to we could have multiple groups within this category but were keeping this small.
    The two kernel choices have subtitles saying as a boot.img or zImage, I'm just giving two common options on how the kernel will be installed in the updater-script
    And the three choice in this ui has #-- selected.1 = 1 or 2 or 3, these will be what is written to the kernel_choices.prop to allow the updater-script to chose the right option
    As you can see the final option has a 1 instead of a 0 after it, this makes it the default selected and although not needed "do nothing options" I feel should be defaulted to
    And the last two important thing that many new scripters miss are the absence of , after the 1 this is to let aroma know there are no more options and the next line will be the end of this section, signaled by );

    I cant think of an easy explanation for appendvar if your unfamiliar with coding, but it is adding a string to a variable.
    This is for the updater-script and will be come more clear when we get to this part. So for now copy and paste...