Time Machine for Android

Aus C3MAWiki
Dies ist ein Projekt, an dem momentan aktiv gearbeitet wird. Wenn du Fragen hast oder mitarbeiten möchtest, wende dich an Ollo.


Motivation

Das Ziel dieses Projektes war es die Android Debug Tools (adb) auf dem Dokstar zu installieren. Dadurch soll ein kleiner intelligenter Netzstecker möglich sein. Der Dockstar benötigt nur wenig Energie und verfügt über USB-Anschlüsse, diese Hardware macht ihn zum idealen Server. Außerdem war er relativ günstig zu erwerben.

Als Hürde stellte sich heraus, dass in dem System ein ARM-Prozessor verbaut ist, und somit die fertig von Google erstellten Pakete nicht einfach darauf installieren lassen. Die folgende Dokumentation beschreibt, meinen Erfolg eine Version von ADB für ARM-Prozessoren zu erstellen.

Version Android Debug Bridge version 1.0.26

Voodoo Skripte

nandroid

netcat muss installiert sein. Folgende Dateien müssen von http://svn.infernix.net/nandroid/ heruntergeladen werden:

  • nandroid.sh
  • dump_image-arm
  • mkyaffs2image-arm-uclibc (ist in mkyaffs2image umzubenennen)
  • dump_image-arm-uclibc

Erstellt ein Backup des Handys und speichert es auf dem Dockstar unter backup-ordner :

android-auto-backup.sh backup-ordner

Im Laufe des Skripts wird das Handy neu gestartet um das Backup zu erstellen:

#!/bin/bash
# Script: android-auto-backup.sh
# 'adb' must be in $PATH

if [ $# -ne 1 ]; then
 echo -e "Usage $0 <Backup target path>\t(Will be created if not exists)"
 exit 1
fi

adb devices | grep -v devices | grep device >> /dev/null
if [ $? -ne 0 ]; then
 echo "No Device was added"
 exit 1
fi

FOLDER=$1/`date +%Y-%m-%d`
if [ -d $FOLDER ]; then
 echo "$FOLDER exists, no backup must be done"
 exit 1
fi
echo "----- Target: $FOLDER -----"

adb reboot recovery
if [ $? -ne 0 ]; then
 exit 1
fi
sleep 20
echo "----- Backuping -----"
sleep 15
./nandroid.sh $FOLDER
if [ $? -ne 0 ]; then
 exit 1
fi
adb shell reboot &

# clean USE at your own risk!
# echo "---- Clean tmp folder in $FOLDER ----"
# cd $FOLDER
# rm -rf *-tmp/

android light backup

Dieses Skript speichert alle wichtigen Datenbanken des Handys auf dem Dockstar.

#!/bin/bash
# android-light-backup.sh
# For restoreing all backuped files must be pushed back to the device via adb
# T H I S  S C R I P T  W A S  B U I L D  F O R  A N D R O I D  2.*  D E V I C E S

if [ $# -ne 1 ]; then
 echo -e "Usage $0 <Backup target path>\t(Will be created if not exists)"
 exit 1
fi

adb devices | grep -v devices | grep device >> /dev/null
if [ $? -ne 0 ]; then
 echo "No Device was added"
 exit 1
fi

FOLDER=$1/`date +%Y-%m-%d`-light/
mkdir -p $FOLDER
echo "----- Target: $FOLDER -----"
# Essential: People, SMS+MMS, Alarms
adb pull /data/data/com.android.providers.telephony/databases/mmssms.db $FOLDER
adb pull /data/data/com.android.providers.telephony/databases/telephony.db $FOLDER
adb pull /data/data/com.android.providers.contacts/databases/contacts2.db $FOLDER
adb pull /data/data/com.android.deskclock/databases/alarms.db $FOLDER
# Mail
adb pull /data/data/com.fsck.k9/databases/preferences_storage $FOLDER
adb pull /data/data/com.fsck.k9/shared_prefs/com.fsck.k9_preferences.xml $FOLDER
# Jabberoid
adb pull /data/data/uk.ac.napier.android.jabberoid/shared_prefs/uk.ac.napier.android.jabberoid_preferences.xml $FOLDER
adb pull /data/data/uk.ac.napier.android.jabberoid/databases/jabber_android.db $FOLDER
# NetCounter
adb pull /data/data/net.jaqpot.netcounter/databases/network.db $FOLDER
adb pull /data/data/net.jaqpot.netcounter/shared_prefs/net.jaqpot.netcounter_preferences.xml $FOLDER
#AK Notepad
adb pull /data/data/com.akproduction.notepad/databases/aknotepad.db $FOLDER
adb pull /data/data/com.akproduction.notepad/shared_prefs/_has_set_default_values.xml $FOLDER
adb pull /data/data/com.akproduction.notepad/shared_prefs/com.akproduction.notepad_preferences.xml $FOLDER
echo "----- Backup is done -----"

Debian in Qemu installieren

Voraussetzungen

Folgende Voraussetzungen sind zu erfüllen:

  • Qemu installiert
  • GUI installiert, da Qemu diese leider zum starten benötigt.

Mein System:

  • Debian Lenny 64Bit
  • 512MB RAM
  • 20GB HDD

Erstellte ARM Debian Version

  • Debian Lenny ARM
  • 256 MB RAM
  • 8 GB HDD (4,8 GB wurden genutzt)

TODO: Ordner arm-debian NENNEN

Installation

Kernel herunterladen

In einen Arbeitsordner wechseln

mkdir ~/arm-debian
cd ~/arm-debian

Die aktuellen Kerbel Dateien herunterladen:

wget ftp://ftp.de.debian.org/debian/dists/lenny/main/installer-armel/current/images/versatile/netboot/vmlinuz-2.6.26-2-versatile
wget ftp://ftp.de.debian.org/debian/dists/lenny/main/installer-armel/current/images/versatile/netboot/initrd.gz

Festplatte erstellen

Qemu Festplatte erstellen

qemu-img create -f raw armdisk.img 8G

Installieren

Das System mit dem heruntergelassenen Kerbel starten und eine Netzwerkinstallation durchführen.

qemu-system-arm -m 256 -M versatilepb -kernel ~/arm/vmlinuz-2.6.26-2-versatile -initrd ~/arm/initrd.gz -hda ~/arm/armdisk.img -append "root=/dev/ram"

Es ist den Anweisungen zu folgen und das System nach der Installation herunterzufahren.

Tipps bei der Benutzung der VM

Bei der Tastatur ist es bei mir zu Problemen gekommen. Folgende Tastenbelegung habe ich getestet:

  • 8 war ENTER
  • t war J wie Ja
  • r war Tab
  • e ist löschen
  • "2 3" ist "root"

Tipp: "-k de" bei dem Start von Qemu hinzufügen und eine deutsche Tastatur wird verwendet.

Initrd aus der VM extrahieren

Jetzt das bei der Debian-Instalation heruntergeladene initd auf den Hostrechner kopieren.

mkdir mount
sudo mount -o loop,offset=32256 armdisk.img mount/
cp mount/boot/initrd.img-2.6.26-2-versatile .
sudo umount mount/

Gedanke: die Zahl könnte der MBR sein ?
Jetzt kann die Maschine mit der neuen Version gestartet werden

qemu-system-arm -m 256 -M versatilepb -kernel vmlinuz-2.6.26-2-versatile -initrd initrd.img-2.6.26-2-versatile -hda armdisk.img -append "root=/dev/sda1"

SSH Server

Optional einen SSH-Server installieren zur einfacheren Nutzung

aptitude install openssh-server

Netzwerkverbindung konfigurieren

Um einfach auf die virtuelle Maschine zuzugreifen, kann ein bestimmter Netzwerkport des Hostrechner weitergeleitet werden.

-redir tcp:5022::22

Ist beim Starten als Parameter hinzufügen, damit über 5022 über SSH auf die Maschine zuzugreifen. Nun kann man einfach über die normale IP des Rechners auf die ARM-Maschine zugreifen. Zum Beispiel:

ssh -p 5022 user@localhost

adb-Tool erstellen

Android herunterladen

Alle die in diesem Kapitel aufglisten Befehle sind in der Virtuellen Maschine auszuführen. Damit steht uns ein Debian auf einem ARM-Prozessor zu Verfügung.

Voraussetzungen

Auf der virtuellen Maschine sind folgende Pakete zu installieren:

aptitude install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev libncurses5-dev x11proto-core-dev libx11-dev libreadline5-dev libz-dev

Android repo client installieren

cd ~
mkdir bin
export PATH=$PATH:~/bin
echo $PATH 
curl http://android.git.kernel.org/repo >~/bin/repo 
chmod a+x ~/bin/repo

Initialisieren

mkdir mydroid
cd mydroid 
repo init -u git://android.git.kernel.org/platform/manifest.git

Android SDK herunterladen

repo sync

Fehler

Beim Herunterladen ist folgender Fehler aufgetreten:

Initializing project platform/packages/apps/Bluetooth ...
remote: Counting objects: 1775, done.
remote: Compressing objects: 100% ()88/588, done.
fatal: write error (broken pipe5), 131.99 KiB   
fatal: index-pack failed
error: Cannot fetch platform/packages/apps/Bluetooth

Lösung

einfach öfters den Befehl

repo sync

eingaben. Dieses Problem bestand, da die Virtuelle Maschine nur wenig RAM zu Verfügung hatte

Adb Tools erstellen

Es soll nur das adb-Tool erstellt werden.

cd ~/mydroid
make out/host/linux-x86/bin/adb

Dieser Befehl wird erst funktionieren, wenn die folgenden Modifikationen durchgeführt worden sind.

Modifikationen

Fehler bei Prozessorertyp-Erkennung

build/core/envsetup.mk:100: *** Unable to determine HOST_ARCH from uname -sm: Linux armv5tejl!.  Schluss.

Lösung ist dazu die Datei build/core/envsetup.mk anzupassen und den Rechner als ein Standard 32Bit Linux zu behandeln.

# HOST_ARCH
ifneq (,$(findstring 86,$(UNAME)))
        HOST_ARCH := x86
endif

ifneq (,$(findstring Power,$(UNAME)))
        HOST_ARCH := ppc
endif

#Ollo: fake ARM as x86
ifneq (,$(findstring arm,$(UNAME)))
        HOST_ARCH := x86
endif

Außerdem ist in build/core/main.mk der folgende Textteil auszukommentieren:

#Ollo
#ifeq ($(BUILD_OS),linux)
#build_arch := $(shell uname -m)
#ifneq (64,$(findstring 64,$(build_arch)))
#$(warning ************************************************************)
#$(warning You are attempting to build on a 32-bit system.)
#$(warning Only 64-bit build environments are supported beyond froyo/2.2.)
#$(warning ************************************************************)
#$(error stop)
#endif
#endif

Java-Version nicht prüfen

Es muss noch vor den "make"-Aufruf Java aus kommentieren werden. Hierzu ist die Datei build/core/main.mk zu bearbeiten.

Hier die Bereiche die

# Check for the correct version java

und

# Check for the correct version javac

auskommentieren, sodass keine Überprüfung mehr stattfindet.

Fehler -m32

Der Fehler:

host C: adb <= system/core/adb/adb.c
cc1: error: unrecognized command line option "m32"

Lösung: Hier zu ist die Datei build/core/combo/HOST_linux-x86.mk zu bearbeiten. Es sind die Zeilen 32 und 33 auszukommentieren:

ifneq ($(TARGET_SIMULATOR),true)
#HOST_GLOBAL_CFLAGS += -m32
#HOST_GLOBAL_LDFLAGS += -m32
endif

Statisch gelinkte Version

TODO das auch noch beschreiben Es ist build/core/combo/HOST_linux-x86.mk zu bearbeiten.

ifneq ($(TARGET_SIMULATOR),true)
#HOST_GLOBAL_CFLAGS += -m32
#HOST_GLOBAL_LDFLAGS += -m32
HOST_GLOBAL_LDFLAGS += -static
endif

Binare Dateien

Die von mir erstellten Binär Dateien.

Quellen