[Java for Android App Development] Androguide.fr:
What is Flash Gordon ?

Basically, Flash Gordon is an app which allows you to flash any flashable zip (except for Roms) without having a recovery installed.

You just point it to the zip you want to flash, (be it a kernel, a mod, gapps...) and it will interpret the updater-script of this package and install its content just like a recovery would.

How does it work ?

Here is what happens step by step :

You tap the "select a zip" button, select the built-in file explorer to select the zip you want to flash

Flash Gordon will first extract this zip, depending on its size it can take a little time

When you press the "Flash Now" button, Flash Gordon will locate the updater-script and start translating it into shell code, line by line

It will output the resulting translated bash script on your sdcard and execute it, thus installing the zip's content

The app creates a notification, just tap on it to reboot

In order to achieve those last 2 steps, I'm writing a full Edify to Bash parser and translator.

Here is the list of all the Edify commands this parser can currently process and what their respective bash translation is (in green), using examples:

(more will be added over time, this is really just a draft)

By no means am I a bash expert, so if you have suggestions for better bash equivalents of any edify commands please post them

package_extract_file("path/to/source/file.txt", "/path/to/destination/file.txt");
[COLOR="DarkGreen"]busybox cp -fp /path/to/source/file.txt /path/to/destination/file.txt[/COLOR]

package_extract_dir("/source/folder", "/destination/folder");
[COLOR="DarkGreen"]busybox cp -rfp /source/folder/* /destination/folder[/COLOR]

set_perm(0, 2000, 0755, "/file/or/folder");
[COLOR="DarkGreen"]chown 0:2000 /file/or/folder
chmod 0755 /file/or/folder[/COLOR]

set_perm_recursive(0, 2000, 0644, 0755, "/path/to/set/permissions/recursively);
[COLOR="DarkGreen"]chown 0:2000 /path/to/set/permissions/recursively
chown 0:2000 /path/to/set/permissions
chown 0:2000 /path/to/set
chown 0:2000 /path/to
chown 0:2000 /path
chmod 0644 /path/to/set/permissions/recursively
chmod 0755 /path/to/set/permissions
chmod 0755 /path/to/set
chmod 0755 /path/to
chmod 0755 /path[/COLOR]

delete("file/to/delete");
[COLOR="DarkGreen"]busybox rm -f /file/to/delete[/COLOR]

run_program("/script/to/run.sh");
[COLOR="DarkGreen"]sh /script/to/run.sh[/COLOR]

mount("ext4", "EMMC", "/dev/block/mmcblk0p9", "/system");
[COLOR="DarkGreen"]busybox mount -o rw,remount -t auto /system [I](will soon change to -t mmcblk0p9 or whichever mount point is in the updater-script)[/I][/COLOR]

unmount("/system");
[COLOR="DarkGreen"]busybox mount -o remount,ro /system[/COLOR]

symlink("busybox", "/system/xbin/[", "/system/xbin/[[",
"/system/xbin/adjtimex", "/system/xbin/arp", "/system/xbin/ash",
"/system/xbin/awk", "/system/xbin/base64", "/system/xbin/basename",
"/system/xbin/bbconfig", "/system/xbin/blkid", "/system/xbin/blockdev",
"/system/xbin/brctl", "/system/xbin/bunzip2", "/system/xbin/bzcat",
"/system/xbin/bzip2", "/system/xbin/cal", "/system/xbin/cat",
"/system/xbin/catv", "/system/xbin/chattr", "/system/xbin/chgrp",
"/system/xbin/chmod", "/system/xbin/chown", "/system/xbin/chroot",
"/system/xbin/clear", "/system/xbin/cmp", "/system/xbin/comm",
"/as/many/lines/as/you/want");
[COLOR="DarkGreen"]ln -s busybox /system/xbin/[ /system/xbin/[[
/system/xbin/adjtimex /system/xbin/arp /system/xbin/ash
/system/xbin/awk /system/xbin/base64 /system/xbin/basename
/system/xbin/bbconfig /system/xbin/blkid /system/xbin/blockdev
/system/xbin/brctl /system/xbin/bunzip2 /system/xbin/bzcat
/system/xbin/bzip2 /system/xbin/cal /system/xbin/cat
/system/xbin/catv /system/xbin/chattr /system/xbin/chgrp
/system/xbin/chmod /system/xbin/chown /system/xbin/chroot
/system/xbin/clear /system/xbin/cmp /system/xbin/comm
/as/many/lines/as/you/want
(not sure about this one, please correct me if I'm wrong, I could change to [I]ln -s argument/number/1 argument/number/2[/I] as many times as required if needed)[/COLOR]

write_raw_image("/tmp/boot.img", "mmcblk0p5");
[COLOR="DarkGreen"]dd if=/tmp/boot.img of=/dev/block/mmcblk0p5[/COLOR]

This is just a proof of concept for the moment, I'm aiming at adding all the possible Edify commands, and maybe do it backwards (Bash2Edify) in the future, too.

Screenshots

This is from the apk I use for debugging, so the UI is pretty barebones atm, it will quickly evolve to something more fancy and featureful

Contribute

Flash Gordon is fully Open-Source, and contributions are more than welcome!

You can check-out the full source code on my github at : https://github.com/Androguide/FlashGordon

This app depends on the following Open-Source libraries :

My fork of the CardsUI library by [URL="https://plus.google.com/101314917101345770417/posts"]Nadav Fima[/URL]

aFileChooser by Paul Burke

This project is at a very early stage of development, and I'm looking for help, especially if you're good at one of these things :

regex

java

bash

edify

Even if you're not, don't hesitate to jump in or ask questions about the code if you don't understand.

This is basically the "dev" thread, the general thread is here : http://xdaforums.com/showthread.php?t=2250555