Dependency Injection für Android

  • 1,307 views
Uploaded on

 

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
1,307
On Slideshare
0
From Embeds
0
Number of Embeds
2

Actions

Shares
Downloads
0
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Ausgabe 1/2012 EXKLUSIV FÜR ABONNENTEN: DAS GROSSE ANDROID-POSTER! android 360 www.android360.de Deutschland € 9,80 Österreich € 11,70 Schweiz sFr 17,50 Luxemburg € 11,90 Mobile Development, Marketing, Business magazin Modulare Android-Anwendungen | App-Store-Optimierung | Enterprise-Integration | ActionBar | Fragments Das LEGO Android-Apps: Modulare Prinzip Zeit und Geld sparen! ge Jede Mern tests N EU: Hardwa e App-Store-Optimierung Tipps und Tricks für mehr Downloads Android Enterprise Integration Mit dem Androiden ins Büro Frei-Haus-Lieferung des Print-Magazins! Das ActionBar-Pattern Alle Ausgaben online Auf dem Weg zur einheitlichen Navigation immer und überall verfügbar! Flexibles UI-Design Offline-PDF-Export Android-UI-Fragmentego: mobiletechmag.de/abocall: +49(0)6123 92 38 -239 (Mo–Fr, 8 –17 Uhr)
  • 2. DEPENDENCY INJECTION | GOOD TO KNOWDependency Injection für Android GOODOld School vs. Mobile TO KNOWMit der aktuellen Ausgabe des Android360 Magazins wollen wir eine neue Rubrik namens „Good ToKnow“ einführen. In regelmäßigen Abständen werden wir zukünftig an dieser Stelle ein wenig über denTellerrand blicken und Wissenswertes jenseits des Android SDKs vorstellen. Den Anfang macht dasThema „Dependency Injection für Android“.von Lars Röwekamp und Arne Limburg auch eine mobile Variante mit entsprechend kleinerem Footprint im Angebot. Hinzu kommt noch das eine oderWenn Sie nicht gerade aus der Java-Steinzeit kommen, andere Framework, das bestehende Konzepte der „gro-gehört Dependency Injection wahrscheinlich mittler- ßen Brüder“ in die mobile Welt adaptiert.weile zu Ihrem täglichen Handwerkszeug. Egal ob stan-dardisiert via JSR 299 und JSR 330 oder proprietär via Der „Mobile“-AnsatzSpring, Google Guice oder eines der vielen anderen DI- Einmal abgesehen vom neuen DI-Standard via JSR 330Frameworks – einmal genutzt, möchte man das Inver- und JSR 299, ist Spring wahrscheinlich das erfolgreichs-sion-of-Control-Pattern keinesfalls mehr missen. Was te DI-Framework. Was liegt also näher, als mit der Be-ist aber, wenn man aus der Welt des Mobile Java Deve- trachtung der beiden mobilen Spring-Derivate Springlopment kommt? Muss man dann automatisch auf die ME und TinySpring zu starten? Das Framework SpringVorzüge dieses Konzepts verzichten? Das Android SDK ME [1] existiert bereits seit 2008 und wurde ursprüng-zumindest bietet hier erst einmal keine Unterstützung. lich entwickelt, um Java ME mit Spring-Features zuDie gute Nachricht ist, dass es auch im Umfeld von An- versorgen, ohne dabei das Spring Framework selbst zurdroid die eine oder andere brauchbare Lösung gibt. Die Laufzeit zu benötigen. Das wäre auch gar nicht mög-schlechte Nachricht ist, dass Sie, wie so oft in Java, die lich, da Springs Dependency Injection stark auf Run-Qual der Wahl haben. Aber seien wir einmal ehrlich, es time Reflection baut. Das ist ein Konzept, das wir untergibt Schlimmeres. JavaME vergeblich suchen. Spring ME dagegen setzt auf Buildtime-Analysen und Code Generation. Das be-Der „Old School“-Ansatz deutet, dass die BeanFactory nicht zur Laufzeit aufge-Da es sich bei Android bekannterweise um Java handelt baut, sondern zur Buildtime via mvn spring-me:generate(oder auch nicht, wenn es nach Google geht), spricht erzeugt wird. Der große Vorteil sind zero Kilobyteszunächst einmal nichts dagegen, auf bewährte Kräfte Runtime Overhead für das Framework. That’s it. Dieaus der Java-SE-Welt zu setzen. So ist es theoretisch, Spring-Konfiguration sieht übrigens mehr oder min-und die Betonung liegt hier auf „theoretisch“, durchaus der genauso aus, wie man es von den XML-basiertenmöglich, Spring oder Google Guice direkt als DI-Frame- Spring-Konfigurationen gewohnt ist. Erlaubt sind unterwork der Wahl zu verwenden. Dagegen spricht natür- anderem Property-based Injection, Constructor-basedlich einerseits die Größe dieser Frameworks. Spring Injection, Injection von Listen, Primitiven, anonymenin der aktuellen Version 3.1 zum Beispiel hat selbst in Beans, Lazy- und Eager-Initialisierung etc.der kleinsten Variante (core, beans und context) einen Einen etwas anderen Ansatz verfolgt das Projekt TinyOverhead von 1,77 Megabyte. Für eine mobile Anwen- Spring [2]. Es versucht, Teile des Spring Frameworksdung ist das deutlich zuviel. Und auch Google Guice ist auf der Android-Plattform zu emulieren. Tiny Springnicht gerade ein Leichtgewicht im Hinblick auf ein Mo- richtet sich vor allem an diejenigen, die ihren Spring-ba-bile Device. Das zweite Problem ist, dass diese Frame- sierten Code auf mehreren Plattformen, unter anderemworks in der Regel Java APIs verwenden, die in dem eben auch auf Android, laufen lassen wollen. Zitat der(abgespeckten) Java von Android gar nicht enthalten Tiny-Spring-Webpage: „This project is for people thatsind. Wie sieht also die Alternative aus? Viele der Non- love Spring and want to carry existing code to the An-mobile-DI-Framework-Anbieter haben mittlerweile droid platform“. Der Funktionsumfang des noch jungenwww.android360.de 1 | 2012 android 360 95
  • 3. GOOD TO KNOW | DEPENDENCY INJECTION Projekts hält sich in dem aktuellen Release 1.0.1 noch in Performance unter Android sicherlich nicht die schlech- sehr bescheidenen Grenzen. Entsprechend dünn ist auch teste Wahl ist. Auch AndroidAnnotations verfolgt eine, die vorhandene Dokumentation. Trotzdem sollte man wenn auch aus Robert C. Martins Clean Code entliehe- das Framework im Auge behalten. ne Philosophie: „The ratio of time spent reading [code] Die beiden bisher vorgestellten Varianten setzen auf versus writing is well over 10 to 1, [therefore] making den Ideen von Spring und den von dort bekannten, it easy to read makes it easier to write“. Das nur knapp XML-basierten Konfigurationen auf. Einen anderen 50 Kilobyte große Framework bietet neben Dependen- Weg geht das Framework AndroidAnnotations [3]. Wie cy Injection für Views, Systemservices, Resources und es der Name schon vermuten lässt, bietet AndroidAnno- Custom-Objekte unter anderem auch Annotationen für tations eine Reihe von nützlichen Annotationen an, die ein vereinfachtes Threading-Modell (UI Thread vs. Back- das tägliche Leben eines Android-Entwicklers deutlich ground Thread), Event Binding (nie wieder anonyme Lis- erleichtern können. Möglich wird das durch einen zu- tener!) und REST-Funktionalität. Auf den ersten Blick sätzlichen Compile-Schritt, der automatisch hinzugefügt macht das ebenfalls noch recht junge Framework einen wird und mithilfe des Java-Annotation-Processing-Tools guten Eindruck und überzeugt im Gegensatz zu den bis- Sourcecode erzeugt. Auch hier wird also generierter her betrachteten Mitbewerbern durch eine gute Doku- Code genutzt, was aufgrund der limitierten Reflection- mentation, eine relativ aktive Entwicklercommunity und durch die eine oder andere Android-App im Android Market, die dieses Framework nutzt. Listing 1: Klassischer Android-Code Interessant könnte zukünftig auch ein Projektvorha- ben aus dem Weld-Umfeld werden. Ziel dieses Projekts class AndroidWay extends Activity { scheint es zu sein, den CDI-Standard oder zumindest Teile davon auf die Android-Plattform zu portieren. TextView name; Da es sich bisher aber nur um ein Vorhaben handelt [4] ImageView thumbnail; und scheinbar noch nicht einmal ein Team existiert, ist LocationManager loc; davon auszugehen, dass wir auf die Realisierung noch Drawable icon; einige Zeit warten dürfen. Last but not least wollen wir String myName; uns noch ein Framework anschauen, dessen Committer- Aktivität sehr hoch ist und das unserer Meinung nach public void onCreate(Bundle savedInstanceState) { aktuell das vielversprechendste DI-Framework im An- super.onCreate(savedInstanceState); droid-Umfeld ist: RoboGuice. setContentView(R.layout.main); name = (TextView) findViewById(R.id.name); RoboGuice thumbnail = (ImageView) findViewById(R.id.thumbnail); Am deutlichsten wird die Ausrichtung von RoboGuice loc = (LocationManager)getSystemService(Activity.LOCATION_SERVICE); [5], aktuell in der Version 1.1.2, durch ein Zitat aus dem icon = getResources().getDrawable(R.drawable.icon); zugehörigen Wiki: „RoboGuice’s goal is to make your myName = getString(R.string.app_name); code be about your app, rather than be about all the ini- name.setText( "Hello, " + myName ); tialization and lifecycle code you typically have to main- } tain in Android“. Das auf Google Guice (ohne AOP) } basierende Framework setzt damit genau an der Stelle an, die den meisten Java-Entwicklern bei der Implemen- tierung von Android-Anwendungen ein echter Dorn im Listing 2: RoboGuice-Android-Code Auge ist: am schier unendlichen Initialisierungs- und @ContentView(R.layout.main) Lifecycle-Code. Nahezu alle Android-Komponenten class RoboWay extends RoboActivity { und -Ressourcen lassen sich mit RoboGuice über ent- sprechende Annotationen injizieren. In der Regel wer- @InjectView(R.id.name) TextView name; den dazu injectable-Proxies verwendet, die eigene @InjectView(R.id.thumbnail) ImageView thumbnail; Callback-Methoden zur Verfügung stellen. Der Vorteil @InjectResource(R.drawable.icon) Drawable icon; wird bereits an einem kleinen Beispiel (leicht modifiziert @InjectResource(R.string.app_name) String myName; aus [4] entnommen) deutlich. Während Listing  1 den @Inject LocationManager loc; klassischen Android-Code einer Activity zeigt, finden wir in Listing 2 den gleichen Code unter Verwendung public void onCreate(Bundle savedInstanceState) { von RoboGuice und der dort enthaltenen RoboActivity. super.onCreate(savedInstanceState); Ganz nebenbei bietet RoboGuice auch noch das ein setContentView(R.layout.main); oder andere „Nice to have“. Mithilfe der @Context- name.setText( "Hello, " + myName ); Singleton-Annotation wird garantiert, dass die anno- } tierte Klasse je Kontext, also pro Activity oder Service, } als Singleton injiziert wird. Zusätzlich gibt es einen Log- ger, der sich in Produktion für die Log-Level verbose96 android 360 1 | 2012 www.android360.de
  • 4. DEPENDENCY INJECTION | GOOD TO KNOWund debug von selbst deaktiviert. Ebenfalls interessant Injection bezogen, hat von den beiden Frameworks ak-ist die @Observer-Annotation, mit deren Hilfe der ei- tuell RoboGuice die Nase vorn. Aufgrund der wirklichgene Code deutlich entzerrt und somit modularer auf- guten Zusatzfeatures verdient aber neben RoboGuicegebaut werden kann. Freunden des Experimentierens auch das AndroidAnnotations-Framework das Prädikatsei auch RoboGuice 2.0 beta 3, basierend auf Guice 3, „Good To Know“.mit Fragmentsupport, stark vereinfachtem Bootstrapingund einigen weiteren kleinen Verbesserungen empfoh-len. Einziger Wermutstropfen von RoboGuice ist dieGröße des Frameworks, das mit über 100 Kilobyte imVergleich zu den anderen vorgestellten Lösungen recht Lars Röwekamp ist Geschäftsführer der open knowledge GmbH und berät seit mehr als zehn Jahren Kunden in internationalengroß ausfällt. Hier können aber Tools wie ProGuard [6] Projekten rund um das Thema Enterprise Computing (Twitter:helfen, den Footprint innerhalb der eigenen Anwendung @mobileLarson).deutlich zu verringern. Arne Limburg ist Softwarearchitekt bei der open knowledge GmbHFazit in Oldenburg. Er verfügt über langjährige Erfahrung als Entwickler, Architekt und Consultant im Java-Umfeld und ist auch seit derWer für Android Devices entwickelt, muss nicht ersten Stunde im Android-Umfeld aktiv.automatisch auf das lieb gewonnene Konzept desDependency Injection verzichten. Gleich mehrereOpen-Source-Frameworks stellen dieses Feature aus Links & Literaturder „echten“ Java-Welt auch Android-Entwicklern zur [1] Spring ME: http://springframework.me/Verfügung. Für gestandene Spring-Entwickler bietet [2] Tiny Spring: http://code.google.com/p/tiny-spring/sich ein Blick auf das Spring ME Framework an, dessenCommunity allerdings überschaubar groß und nur semi- [3] AndroidAnnotations: https://github.com/excilys/androidannotations/aktiv zu sein scheint. Freunde von Annotationen sollten [4] CDI für Android: http://bit.ly/zWZvu1sich dagegen eher auf AndroidAnnotations oder Robo- [5] RoboGuice: http://code.google.com/p/roboguice/Guice konzentrieren. Rein auf das Feature Dependency [6] ProGuard: http://bit.ly/dOudqP Anzeige Anzeige