Das Android SDK unter Ubuntu oder anderen Linuxen zu installieren ist nicht super-schwierig, aber auch nicht gerade wirklich leicht. Besonders wenn man das SDK nicht einfach nur in irgendeinen Ordner klatschen möchte, muss man etwas mehr Aufwand treiben. Es geht auch ohne, doch dann müssen die Pfade zu ddms oder adb von Hand in den $PATH eingetragen werden, oder man muss beim Aufruf der Programme immer den kompletten Pfad angeben. In den TeamBamf-Foren bin ich auf ein Skript gestoßen, dass einem praktisch die Ganze Arbeit abnimmt.

Das Skript wird auf github gehostet und kann auch der Anleitung im genannten Forum nach direkt aus dem Git heruntergeladen und ausgeführt werden. Mich „stört“ allerdings, dass neben dem Android SDK auch noch das NDK und die Entwicklungsumgebung Eclipse automatisch installiert werden.

Für Entwickler vielleicht ganz praktisch – wobei die zumindest Eclipse auch selber installieren können – doch wer einfach nur adb oder ddms für Dateitransfers oder Screenshots braucht, der kann sich das NDK und Elipse auch sparen. Von daher habe ich diese beiden Abschnitte rausgeworfen und das Skript auf meinen Webspace hochgestellt…

#!/bin/bash
#
# This script is designed to install the Android SDK, NDK, and Eclipse in
# Linux Mint 11 and make it easier for people that want to develop for
# Android using Linux.
# Script written by @ArchDukeDoug with special thanks to @BoneyNicole,
# @tabbwabb, and @animedbz16 for putting up with me and proofreading and/or
# testing the script.
# I can be reached at dougw@uab.edu, twitter, or linuxrandomly.blogspot.com
# Script version: 1.0.5
# Changelog: 1.0.5 - Fixed the Android SDK search parameters to fit the new
# naming scheme on http://developer.android.com/sdk

# Edit by christoph Langner http://linuxundich.de
# Removed installation von Android NDK and Eclipse

i=$(cat /proc/$PPID/cmdline)
if [[ $UID != 0 ]]; then
    echo "Please type sudo $0 $*to use this."
    exit 1
fi

apt-get update

#Download and install the Android SDK
if [ ! -d "/usr/local/android-sdk" ]; then
	for a in $( wget -qO- http://developer.android.com/sdk/index.html | egrep -o "http://dl.google.com[^\"']*linux.tgz" ); do 
		wget $a && tar --wildcards --no-anchored -xvzf android-sdk_*-linux.tgz; mv android-sdk-linux /usr/local/android-sdk; chmod 777 -R /usr/local/android-sdk; rm android-sdk_*-linux.tgz;
	done
else
     echo "Android SDK already installed to /usr/local/android-sdk.  Skipping."
fi

d=ia32-libs

#Determine if there is a 32 or 64-bit operating system installed and then install ia32-libs if necessary.

if [[ `getconf LONG_BIT` = "64" ]]; 

then
    echo "64-bit operating system detected.  Checking to see if $d is installed."

    if [[ $(dpkg-query -f'${Status}' --show $d 2>/dev/null) = *\ installed ]]; then
    	echo "$d already installed."
    else
        echo "Installing now..."
    	apt-get --force-yes -y install $d
    fi
else
	echo "32-bit operating system detected.  Skipping."
fi

#Check if the ADB environment is set up.

if grep -q /usr/local/android-sdk/platform-tools /etc/bash.bashrc; 
then
    echo "ADB environment already set up"
else
    echo "export PATH=$PATH:/usr/local/android-sdk/platform-tools" >> /etc/bash.bashrc
fi

#Check if the ddms symlink is set up.

if [ -f /bin/ddms ] 
then
    rm /bin/ddms; ln -s /usr/local/android-sdk/tools/ddms /bin/ddms
else
    ln -s /usr/local/android-sdk/tools/ddms /bin/ddms
fi

#Create etc/udev/rules.d/99-android.rules file

touch -f 99-android.rules
echo "#Acer" >> 99-android.rules
echo "SUBSYSTEM=="usb", SYSFS{idVendor}=="0502", MODE="0666"" >> 99-android.rules
echo "#ASUS" >> 99-android.rules
echo "SUBSYSTEM=="usb", SYSFS{idVendor}=="0b05", MODE="0666"" >> 99-android.rules
echo "#Dell" >> 99-android.rules
echo "SUBSYSTEM=="usb", SYSFS{idVendor}=="413c", MODE="0666"" >> 99-android.rules
echo "#Foxconn" >> 99-android.rules
echo "SUBSYSTEM=="usb", SYSFS{idVendor}=="0489", MODE="0666"" >> 99-android.rules
echo "#Garmin-Asus" >> 99-android.rules
echo "SUBSYSTEM=="usb", SYSFS{idVendor}=="091E", MODE="0666"" >> 99-android.rules
echo "#Google" >> 99-android.rules
echo "SUBSYSTEM=="usb", SYSFS{idVendor}=="18d1", MODE="0666"" >> 99-android.rules
echo "#HTC" >> 99-android.rules
echo "SUBSYSTEM=="usb", SYSFS{idVendor}=="0bb4", MODE="0666"" >> 99-android.rules
echo "#Huawei" >> 99-android.rules
echo "SUBSYSTEM=="usb", SYSFS{idVendor}=="12d1", MODE="0666"" >> 99-android.rules
echo "#K-Touch" >> 99-android.rules
echo "SUBSYSTEM=="usb", SYSFS{idVendor}=="24e3", MODE="0666"" >> 99-android.rules
echo "#KT Tech" >> 99-android.rules
echo "SUBSYSTEM=="usb", SYSFS{idVendor}=="2116", MODE="0666"" >> 99-android.rules
echo "#Kyocera" >> 99-android.rules
echo "SUBSYSTEM=="usb", SYSFS{idVendor}=="0482", MODE="0666"" >> 99-android.rules
echo "#Lenevo" >> 99-android.rules
echo "SUBSYSTEM=="usb", SYSFS{idVendor}=="17EF", MODE="0666"" >> 99-android.rules
echo "#LG" >> 99-android.rules
echo "SUBSYSTEM=="usb", SYSFS{idVendor}=="1004", MODE="0666"" >> 99-android.rules
echo "#Motorola" >> 99-android.rules
echo "SUBSYSTEM=="usb", SYSFS{idVendor}=="22b8", MODE="0666"" >> 99-android.rules
echo "#NEC" >> 99-android.rules
echo "SUBSYSTEM=="usb", SYSFS{idVendor}=="0409", MODE="0666"" >> 99-android.rules
echo "#Nook" >> 99-android.rules
echo "SUBSYSTEM=="usb", SYSFS{idVendor}=="2080", MODE="0666"" >> 99-android.rules
echo "#Nvidia" >> 99-android.rules
echo "SUBSYSTEM=="usb", SYSFS{idVendor}=="0955", MODE="0666"" >> 99-android.rules
echo "#OTGV" >> 99-android.rules
echo "SUBSYSTEM=="usb", SYSFS{idVendor}=="2257", MODE="0666"" >> 99-android.rules
echo "#Pantech" >> 99-android.rules
echo "SUBSYSTEM=="usb", SYSFS{idVendor}=="10A9", MODE="0666"" >> 99-android.rules
echo "#Philips" >> 99-android.rules
echo "SUBSYSTEM=="usb", SYSFS{idVendor}=="0471", MODE="0666"" >> 99-android.rules
echo "#PMC-Sierra" >> 99-android.rules
echo "SUBSYSTEM=="usb", SYSFS{idVendor}=="04da", MODE="0666"" >> 99-android.rules
echo "#Qualcomm" >> 99-android.rules
echo "SUBSYSTEM=="usb", SYSFS{idVendor}=="05c6", MODE="0666"" >> 99-android.rules
echo "#SK Telesys" >> 99-android.rules
echo "SUBSYSTEM=="usb", SYSFS{idVendor}=="1f53", MODE="0666"" >> 99-android.rules
echo "#Samsung" >> 99-android.rules
echo "SUBSYSTEM=="usb", SYSFS{idVendor}=="04e8", MODE="0666"" >> 99-android.rules
echo "#Sharp" >> 99-android.rules
echo "SUBSYSTEM=="usb", SYSFS{idVendor}=="04dd", MODE="0666"" >> 99-android.rules
echo "#Sony Ericsson" >> 99-android.rules
echo "SUBSYSTEM=="usb", SYSFS{idVendor}=="0fce", MODE="0666"" >> 99-android.rules
echo "#Toshiba" >> 99-android.rules
echo "SUBSYSTEM=="usb", SYSFS{idVendor}=="0930", MODE="0666"" >> 99-android.rules
echo "#ZTE" >> 99-android.rules
echo "SUBSYSTEM=="usb", SYSFS{idVendor}=="19D2", MODE="0666"" >> 99-android.rules
mv -f 99-android.rules /etc/udev/rules.d/
chmod a+r /etc/udev/rules.d/99-android.rules

#Check if ADB is already installed
if [ ! -f "/usr/local/android-sdk/platform-tools/adb" ];
then
nohup /usr/local/android-sdk/tools/android update sdk > /dev/null 2>&1 &
zenity --info --text="Please accept the licensing agreement for Android SDK Platform-tools to install the Android Debug Bridge."
else
echo "Android Debug Bridge already detected."
fi
exit 0

Das Skript lädt das SDK herunter, entpackt es nach /usr/local/android-sdk, installiert auf einem 64-Bit System die nötigen ia32-libs, fügt den Pfad zum SDK über die /etc/bash.bashrc zum $PATH hinzu und setzt Symlinks, so dass man direkt adb oder ddms aufrufen kann, ohne den kompletten Pfad zu tippen. Letztendlich gibt es noch einen Eintrag in /etc/udev/rules.d/99-android.rules, so dass beim Anstecken eines Android-Gerätes automatisch die richtigen Rechte gesetzt werden.

Wer keine Lust auf Copy&Paste hat, der kann das Skript über folgende Befehle herunterladen, die Rechte setzen und dann das SDK installieren. Nach ein paar Minuten ist das SDK dann einsatzbereit auf eurem Rechner.

$ wget http://linuxundich.de/static/android_sdk_installer.sh
$ chmod +x android_sdk_installer.sh
$ sudo ./android_sdk_installer.sh

Einzig am Ende der ganzen Aktion müsst ihr nochmal etwas per Hand machen. Von Haus aus ist so gut wie alles aus dem SDK ausgewählt. Möchtet ihr nur ddms oder asb haben, dann müsst ihr einfach nur die Android SDK Tools auswählen. Will man etwa ein Android 4.0 mal auf dem Desktop simulieren, dann die entsprechende SDK Platform noch dazu. Den Rest könnt ihr wieder abwählen.

Das Android SDK nach dem Ausführen des Skriptes

Danach reicht es einfach in einem Terminal $ ddms einzugeben und schon startet automatisch der ADB-Server und danach der Debugger. Vergesst natürlich nicht auf eurem Android-Gerät den Entwickler-Modus zu aktivieren, doch dann könnt ihr bequem und ohne Root-Rechte von jedem Androiden Screenshots machen.

22 Kommentare

  1. Schick, Schick.

    Momentan versuche ich tatsächlich die SDK und alles was dazu gehört zu installieren. Ich habe mir ein Android Smartphone Vodafone 858 besorgt, was ich überwiegend wegen meiner Arbeit geholt habe. Hatte es nämlich leid, meine private Telefonnummer, überall in DE und EU zu verteilen.

    Mal schauen was mit dem Skript wird.

    Danke und MfG

  2. Hallo Christoph

    Besten Dank fuer dein Skript, leider habe ich nur ein 32 Bit Szstem und da bricht die installation ab. Ist es moeglich, das Skript so yu korrigieren, das es auch bei mir funktionieren wuerde_

    Besten Dank und einen guten Rutsch ins neue Jahr
    Stephan

  3. Ubuntu binrgt zenity wahrscheinlich mit, das gerade in Deutschland sehr verbreitete Kubuntu hingegen scheint es nicht per default zu installieren.
    Ich hatte es lieber ohne chmod +x gelassen und dann per ’sudo sh android_sdk_installer.sh‘ gestartet – das geht nach hinten los, weil die dash (als Standard-Shell) die eckigen Klammern [[ nicht interpretiert. Ergo: ggf. als ’sudo bash android_sdk_installer.sh‘ aufrufen …

    Ach so – Danke für das Skript!

  4. Hallo Christoph,

    Danke für deine Anleitung!

    Wenn ich ddms aufrufe, dann sehe ich mein Handy als „?????????“.
    Anscheinend wird es nicht erkannt. Was könnte der Grund sein und wie stelle ich fest, ob mein Handy tatsächlich erkannt wird?

    USB Debugging ist im Handy natürlich aktiviert.

    Die Konsole schaut dann folgendermaßen aus:

    sojusnik@mir:~$ ddms
    
    (DDMS:8440): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width -5 and height 16
    
    (DDMS:8440): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width -5 and height 16
    10:21:38 E/DDMS: insufficient permissions for device
    com.android.ddmlib.AdbCommandRejectedException: insufficient permissions for device
    	at com.android.ddmlib.AdbHelper.setDevice(AdbHelper.java:752)
    	at com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:373)
    	at com.android.ddmlib.Device.executeShellCommand(Device.java:453)
    	at com.android.ddmuilib.SysinfoPanel.loadFromDevice(SysinfoPanel.java:159)
    	at com.android.ddmuilib.SysinfoPanel.deviceSelected(SysinfoPanel.java:126)
    	at com.android.ddmuilib.SelectionDependentPanel.deviceSelected(SelectionDependentPanel.java:52)
    	at com.android.ddms.UIThread.selectionChanged(UIThread.java:1756)
    	at com.android.ddmuilib.DevicePanel.notifyListeners(DevicePanel.java:772)
    	at com.android.ddmuilib.DevicePanel.notifyListeners(DevicePanel.java:760)
    	at com.android.ddmuilib.DevicePanel.access$1100(DevicePanel.java:56)
    	at com.android.ddmuilib.DevicePanel$1.widgetSelected(DevicePanel.java:368)
    	at org.eclipse.swt.widgets.TypedListener.handleEvent(Unknown Source)
    	at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source)
    	at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
    	at org.eclipse.swt.widgets.Display.runDeferredEvents(Unknown Source)
    	at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
    	at com.android.ddms.UIThread.runUI(UIThread.java:535)
    	at com.android.ddms.Main.main(Main.java:117)
    
    10:21:42 W/ddms: Unable to get frame buffer: insufficient permissions for device
    10:21:57 W/ddms: Unable to get frame buffer: insufficient permissions for device

    Dann noch:

    sojusnik@mir:~$ lsusb
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    Bus 001 Device 002: ID 05ca:183b Ricoh Co., Ltd Visual Communication Camera VGP-VCC8 [R5U870]
    Bus 002 Device 002: ID 2109:3431  
    Bus 002 Device 003: ID 046d:c043 Logitech, Inc. MX320/MX400 Laser Mouse
    Bus 002 Device 004: ID 046d:c31c Logitech, Inc. Keyboard K120 for Business
    Bus 002 Device 005: ID 1058:0704 Western Digital Technologies, Inc. Passport External HDD
    Bus 002 Device 038: ID 0bb4:0cb0 High Tech Computer Corp.

    Und der Inhalt der /etc/udev/rules.d/99-android.rules:

    #Acer
    SUBSYSTEM==usb, ATTR{idVendor}==0502, MODE=0666
    #ASUS
    SUBSYSTEM==usb, ATTR{idVendor}==0b05, MODE=0666
    #Dell
    SUBSYSTEM==usb, ATTR{idVendor}==413c, MODE=0666
    #Foxconn
    SUBSYSTEM==usb, ATTR{idVendor}==0489, MODE=0666
    #Garmin-Asus
    SUBSYSTEM==usb, ATTR{idVendor}==091E, MODE=0666
    #Google
    SUBSYSTEM==usb, ATTR{idVendor}==18d1, MODE=0666
    #HTC
    SUBSYSTEM==usb, ATTR{idVendor}==0bb4, MODE=0666
    #Huawei
    SUBSYSTEM==usb, ATTR{idVendor}==12d1, MODE=0666
    #K-Touch
    SUBSYSTEM==usb, ATTR{idVendor}==24e3, MODE=0666
    #KT Tech
    SUBSYSTEM==usb, ATTR{idVendor}==2116, MODE=0666
    #Kyocera
    SUBSYSTEM==usb, ATTR{idVendor}==0482, MODE=0666
    #Lenevo
    SUBSYSTEM==usb, ATTR{idVendor}==17EF, MODE=0666
    #LG
    SUBSYSTEM==usb, ATTR{idVendor}==1004, MODE=0666
    #Motorola
    SUBSYSTEM==usb, ATTR{idVendor}==22b8, MODE=0666
    #NEC
    SUBSYSTEM==usb, ATTR{idVendor}==0409, MODE=0666
    #Nook
    SUBSYSTEM==usb, ATTR{idVendor}==2080, MODE=0666
    #Nvidia
    SUBSYSTEM==usb, ATTR{idVendor}==0955, MODE=0666
    #OTGV
    SUBSYSTEM==usb, ATTR{idVendor}==2257, MODE=0666
    #Pantech
    SUBSYSTEM==usb, ATTR{idVendor}==10A9, MODE=0666
    #Philips
    SUBSYSTEM==usb, ATTR{idVendor}==0471, MODE=0666
    #PMC-Sierra
    SUBSYSTEM==usb, ATTR{idVendor}==04da, MODE=0666
    #Qualcomm
    SUBSYSTEM==usb, ATTR{idVendor}==05c6, MODE=0666
    #SK Telesys
    SUBSYSTEM==usb, ATTR{idVendor}==1f53, MODE=0666
    #Samsung
    SUBSYSTEM==usb, ATTR{idVendor}==04e8, MODE=0666
    #Sharp
    SUBSYSTEM==usb, ATTR{idVendor}==04dd, MODE=0666
    #Sony Ericsson
    SUBSYSTEM==usb, ATTR{idVendor}==0fce, MODE=0666
    #Toshiba
    SUBSYSTEM==usb, ATTR{idVendor}==0930, MODE=0666
    #ZTE
    SUBSYSTEM==usb, ATTR{idVendor}==19D2, MODE=0666
    

    Hoffe das hilft uns weiter!

  5. Hab Folgendes:

    SUBSYSTEM=="usb", ATTRS{idVendor}=="0bb4", MODE="0666"

    in /etc/udev/rules.d/99-android.rules geschrieben und es ging plötzlich!

  6. Für das Kommandozeilen Tool adb gibt es neuerdings auch das Debian Paket android-tools-adb. Dieses einfach wie folgt installieren:
    sudo apt-get install android-tools-adb
    Dieses Paket erstellt leider die Datei 99-android.rules (noch) nicht.

  7. Hi!
    Zu Anfang einmal ein großes Danke für das Script! Genau SO etwas sollte eigentlich in die Paketquellen!

    Ich habe alles jetzt wie gezeigt ausgeführt und heruntergeladen, aber jetzt steh ich ein bissi an.

    Zuerst wollte ich eine emulierte Testumgebung erzeugen und habe unter /usr/local/android-sdk/tools/

    ./android

    aufgerufen. Bin dann unter Tools –> Manage ADVs hineingegangen, erzeuge eine neue AVD, tippe alles ein und bekomme die Meldung:

    Result of creating AVD ‚Test‘:
    /home/qohelet/.android/avd/adf.ini (Keine Berechtigung)

    Dasselbe passiert, wenn ich in ddms Optionen ändere

    • Lösung gefunden:
      Das Script legt den Ordner unter ~/.android mit root-Zugriff an.
      Mit einem simplen

      sudo chown -R BENUTZER ~/.android
      

      ist das Problem gelöst.

      Ebenso sollte man tools/android nicht mit root-Rechten starten, dann bekommt man einen PANIC-Fehler

  8. Vielen Dank für die Beschreibung und das Script.

    Es muss jedoch zusätzlich ‚openjdk-6-jdk‘ oder besser ‚openjdk-7-jdk‘ installiert werden.

  9. Hallo zusammen,

    ist das Script noch aktuell? Ich benutze es unter Debian 8 32 bit. Jedoch bekomme ich nur die Meldung das ich der Lizenz zustimmen soll für die Android Debug Bridge. Ich kann in der Meldung nur den OK drücken und das war es dann auch schon. Mehr passiert nicht.

    Beste Grüße

  10. Ist das Script noch aktuell? (2024)
    Ich bin in Sachen Linux noch ein Anfänger, habt bitte Nachsicht.
    Ich würde das Script gerne bei mir unter Linux Mint 22 ausführen.
    Ist des dafür ausgelegt und überhaupt noch aktuell?
    Vielen Dank vorab für alles.
    Vg. Arnold

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein