Android "Birds of Australia" unpacker

For our recent trip to Australia, we purchased the Birds of Australia app; it was really handy during our travels when we were trying to identify birds (though there are some things about the UI which could be better).

As a tinkerer, I was interested in finding out how the app stores the bird data and what modification opportunities may exist.

Mainly, I discovered that the bird database is in an sqlite file (/data/data/com.coolideas.eproducts.ausbirds/databases/ausbirds.s3db) and the bird images, bird sounds, bird ranges, and descriptive texts are packed into "edf" files (e.g., /data/data/com.coolideas.eproducts.ausbirds/files/eProducts/AusBirds/712.edf for bird 712)

All these results are on a rooted Nexus7 tablet running Android 4.2.1 and a Linux system running Debian "Squeeze". If you don't know what it means to do things like "adb pull" a file to your computer then please do not ask for help using the unpacker.

First, it was necessary to copy the file from the application's data directory to a directory readable by 'adb pull':

$ adb shell
shell@android:/ $ su
shell@android:/ # cp /data/data/com.coolideas.eproducts.ausbirds/databases/ausbirds.s3db /sdcard
shell@android:/ # cp /data/data/com.coolideas.eproducts.ausbirds/files/eProducts/AusBirds/712.edf /sdcard
next, pull them over with 'adb pull on the Linux side:
$ adb pull /sdcard/ausbirds.s3db
$ adb pull /sdcard/712.edf

Now you can look at the database to find out what bird 712 even is:

$ sqlite
sqlite> select CommonName from Birds where _id=712;  
Grey Butcherbird
sqlite> select ScientificName from Birds where _id=712;
Cracticus torquatus

And run the attached script to split out its data files:

$ python unedf.py 712.edf
After unpacking, the bird images have names like 712-1-*.jpg; the bird calls have names like 712-1-*.mp3; the range map has a name like 712-2-0.jpg; and the descriptive text (which is a fragment of HTML) has a name like 712-3-0.htmlf. (in principle the container can accomodate multiple range images or multiple html fragments, but I didn't yet observe any files to have more than one)

The packed format is quite simple and does not involve any compression or encryption (jpg and mp3 are quite compressed already so there would be no practical benefit to compressing the .edf file). It consists of a header and then all the files one after another. The header consists of 4 sub-headers (one for bird images, one for bird sounds, one for range map, and one for descriptive text). Each sub-header consists of a count of files as a 32-bit big-endian number, followed by that many (start, length) pairs, also 32-bit big-endian numbers.

Files currently attached to this page:

unedf.py779 bytes



Entry first conceived on 1 December 2012, 1:12 UTC, last modified on 3 October 2013, 13:13 UTC
Website Copyright © 2004-2017 Jeff Epler