I already posted on this topic specifically related to Angry Birds, but I figured it’s worth putting a more general version of it up.
I’ve seen a few reasons why one might need to restore the saved states of a game on an Android device. This could be necessary when moving to a new device, updating the OS on a device, or restoring after some sort of failure (I’ve seen Angry Birds data get corrupted as well as Temple Run).
In principle, Google provides a way for developers to store information with the user’s Google account so data gets restores just like calendar and contact data. This would be nice, but it depends on the developer actually updating their device to use this relatively new Android feature (and I have yet to encounter a non-google app that uses it).
The startup FTW is working on a similar solution only it is platform independent as well as device independent. Even better, unlike the Google solution, this one actually lets you see what data you have (along with other cool features). (And to be totally transparent, I’ve had some involvement with the FTW guys, so I’m not 100% objective here). This is a really nice way to deal with game data, but it still has the same issue where if a developer doesn’t use it, you data is trapped on a device.
So, until more developers use one of those two solutions (hopefully FTW) for backing up game states on mobile devices, Android uses need to take matters into their own hands.
I’ve tested this on a Droid Incredible, Droid, Xoom, and Galaxy Nexus. I’ve done it with Android 2.3 and 4.0. There is no need for the device to be rooted although that make some things easier.
Apps on Android can save files to their own directory on the /data partition and possibly to a similar directory on the sdcard if present (/mnt/sdcard/).
The first thing you need is the Android SDK (you really just need the adb tool that comes with it). It can be downloaded (along with instructions on how to make it work) from the Android development site.
Once you have that installed on your computer and can see your device when plugged in with the command:
john@yoshi ~ $ adb devices
(Note, all of this must be done from a command line of some kind. My examples were done in an xterm on GNU/Linux, but any terminal, including the DOS command prompt on Windows should work with at most minor changes).
It is now necessary to put your device “USB Debug Mode”. The option for that is either in the Applications part of the settings or the Developer Options. This varies with different versions of Android.
You now need to figure out the directory where the game is storing the data. This name will match the java package name of the application (which isn’t actually made readily available anywhere).
Open a shell on the device:
adb shell
This will connect you directly to the device. Then type the command:
ls /data/data/
This will show a list of directories. You need to figure out the directory for the app you are looking for. Usually it will be obvious, although if not, google can help.
The apps I know for sure are:
- Angry Birds: com.rovio.angrybirds
- Angry Birds Rio: com.rovio.angrybirdsrio
- Angry Birds Space: com.rovio.angrybirdsseasons
- Angry Birds Space (Free): com.rovio.angrybirdsspace.ads
- Cut The Rope: com.zeptolab.ctr.paid
- Temple Run: com.imangi.templerun
Now check the sdcard in the same way:
ls /mnt/sdcard/Android/data
for a similar directory. Of the games I listed above, only Temple Run stores data on the sdcard.
Once you have come up with a list of files, for each one you must execute the command:
adb pull /data/data/PATHTOFILE LOCAL_PATH_TO_FILE
If you need to restore, the command is:
adb push LOCAL_PATH_TO_FILE /data/data/PATHTOFILE.
Generally, you need to start up the game (and in the case of Angry Birds) play a level so it will create its directories and save files before you put you backup copy back.
The files I know about are:
Angry Birds
/data/data/com.rovio.angrybirds/settings.lua
/data/data/com.rovio.angrybirds/highscores.lua
(Only the directory changes for the different angry birds versions.)
Cut the Rope
/data/data/com.zeptolab.ctr.paid/databases/achievements.db
/data/data/com.zeptolab.ctr.paid/databases/webviewCache.db
/data/data/com.zeptolab.ctr.paid/databases/webview.db
/data/data/com.zeptolab.ctr.paid/databases/scores.db
/data/data/com.zeptolab.ctr.paid/databases/webviewCache.db-journal
/data/data/com.zeptolab.ctr.paid/shared_prefs/com.scoreloop.achievements.store_bd7eceaa-009d-4d58-beb8-1753e5412b54_data.xml
/data/data/com.zeptolab.ctr.paid/shared_prefs/com.scoreloop.achievements.store_bd7eceaa-009d-4d58-beb8-1753e5412b54.xml
/data/data/com.zeptolab.ctr.paid/shared_prefs/com.scoreloop.ui.login.xml
/data/data/com.zeptolab.ctr.paid/shared_prefs/CtrAppPaid.xml
Temple Run
/data/data/com.imangi.templerun/shared_prefs/P31Prefs.xml
/data/data/com.imangi.templerun/shared_prefs/RTA.xml
/data/data/com.imangi.templerun/shared_prefs/com.imangi.templerun.xml
/mnt/sdcard/Android/data/com.imangi.templerun/files/recordmanager.dat
/mnt/sdcard/Android/data/com.imangi.templerun/files/SpaceHolder.dat
For other games, you’ll have to figure out the files yourself, but the general idea will always be the same.
All of the above can just as easily be done for apps other than games, I just haven’t found the need for it myself.
I would love to write a program to automate this process on the Android device itself (and either save the files to the sdcard or mail them to the user). Unfortunately, the security policy on Android prevents this. Each application is assigned a user name and group when installed. It is the only application (with the possible exception of some system processes I think although I haven’t experimented with that enough) that has permission to read or write to its own directories and files. Another app by the same developer (with the same signing key) can get permission to them, but that really doesn’t help me. So on devices that haven’t been rooted, it seems that this method where the computer is also used is necessary.