Must-have Libraries für Android

6 Kommentare

Es gibt einige Libraries für Android, die viele aus der weiten Java-Welt bekannten und gewohnten Features in für weniger leistungsfähige Hardware optimierter Version liefern. Da ich einige davon sehr häufig benutze, möchte ich diese heute vorstellen.

Android Annotations (http://androidannotations.org)

Android Annotations liefert eine Unmenge an Features, die diese Library aber nicht unnötig aufblähen, sondern auch tatsächlichen Mehrwert liefern – sprich in so ziemlich jeder App mal benötigt werden. Die Hauptfeatures sind:

  • Dependency injection
  • Event handling
  • Simple threading
  • Consuming REST APIs

Android Annotations benutzt APT und Code-Generierung, um zur Compile-Zeit optimierte Klassen zu generieren. Damit gibt es keine Wartezeit beim Start oder langsameres Laufzeitverhalten der App. Es wird relativ einfach über die build.gradle des Projekts/der App eingebunden:

buildscript {
	// …
	dependencies {
		classpath 'com.android.tools.build:gradle:2.2.3'
		classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
	}
	// …
}

build.gradle (Projekt)

apply plugin: 'android-apt'
 
android {
	// …
}
 
dependencies {
	// …
	apt('org.androidannotations:androidannotations:4.2.0')

	compile('org.androidannotations:androidannotations-api:4.2.0')
}

build.gradle (App)

Der größte Mehrwert entsteht durch den sehr viel saubereren Code.

public class ExampleActivity extends Activity {
	private Button exampleButton;
 
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.layout_example);
		exampleButton = (Button) findViewById(R.id.exampleButton);
		exampleButton.setOnClickListener(new OnClickListener() {
			@Override

			public void onClick(View view) {// do something}
		});
	}
}

Vanilla Android

@EActivity(R.layout.layout_example);
public class ExampleActivity extends Activity {
	@ViewById
	Button exampleButton;
 
	@Click
	void exampleButtonWasClicked() {
		// do something
	}
}

Android mit Android Annotations

Wem Android Annotations zuviel bietet, kann z.B. eine Kombination aus Butterknife (view injection, Link), Dagger (dependency injection, Link) und Retrofit (REST client, Link) nutzen.

EventBus (http://greenrobot.org/eventbus)

Um die Activity oder ein Fragment von der Geschäftslogik abzukoppeln, kann sich der Einsatz des Publish/Subscribe-Patterns lohnen. Eine etablierte Bibliothek ist der EventBus von greenrobot:

apply plugin: 'android-apt'
 
android {
	// …
}
 
dependencies {
	// …
	compile('org.greenrobot:eventbus:3.0.0')
}

build.gradle (App)

public class ExampleActivity extends Activity {
    protected final EventBus eventBus = EventBus.getDefault();
 
    @Override
    protected void onStart() {
        super.onStart();
        eventBus.register(this);
    }
 
    @Override
    protected void onStop() {
        super.onStop();
        eventBus.unregister(this);
    }
}

IcePick (https://github.com/frankiesardo/icepick)

IcePick reduziert ebenfalls durch APT und Code-Generierung den Boilerplate, der durch das Verwalten der Instanzdaten von Activities oder Fragments entsteht.

@EActivity(R.layout.layout_example);
public class ExampleActivity extends Activity {
 
	@State
	String exampleText;
 
	@ViewById
	Button exampleButton;
 
	@Click
	void exampleButtonWasClicked() {
		// do something
	}
 
	@Override
	protected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);

    		Icepick.saveInstanceState(this, outState);}


 
	@Override

	protected void onRestoreInstanceState(Bundle savedInstanceState) {super.onRestoreInstanceState(savedInstanceState);

    		Icepick.restoreInstanceState(this, savedInstanceState);}
}

Der Inhalt von exampleText wird nun bei allen Konfigurationsänderungen (z.B. OrientationChanges) wiederhergestellt.

LeakCanary (https://github.com/square/leakcanary)

Memory Leaks sind kein Kavaliersdelikt! Um diese überhaupt finden zu können, kann LeakCanary eingesetzt werden. Einmal in der Application-Implementierung der App instanziert, zeigt es beim Testen des Debug-Builds der App eine Notification an, sobald ein Memory Leak erkannt werden konnte:

public class ExampleApplication extends Application {
 
	@Override
	public void onCreate() {
		super.onCreate();
		if (LeakCanary.isInAnalyzerProcess(this)) {
			// This process is dedicated to LeakCanary for heap analysis.
			// You should not init your app in this process.
			return;
		}
    		LeakCanary.install(this);
  	}
}

Espresso (https://developer.android.com/topic/libraries/testing-support-library/index.html#Espresso)

Espresso ist ein in den Android Test Support Libraries enthaltenes Test-Framework, das eine DSL für automatisierte UI-Tests anbietet. Für die meisten Entwickler sind die implementierten Konzepte (JUnit, JUnit-TestRules, Matchers) nicht neu, daher ist dieses Framework einfach zu erlernen. Espresso läuft auf Emulatoren und echten Devices.

Unter dem Strich…

… ist dies nur eine kleine, ausgewählte Liste von Bibliotheken, die sich auf (Code-)Qualität, Wartbarkeit und Testbarkeit auswirken. Einige der kleinen Ecken und Kanten, die die Entwicklung von Apps für Android erschweren und viel Zeit verschlingen, werden hiermit ausgebügelt. Ein Hoch auf die Community!

Welche Libraries benutzt ihr gerne? Hinterlasst gerne einen Kommentar und diskutiert mit mir.

Sascha Fröhlich

Sascha (geboren 1983 in Oberhausen) ist seit 2014 IT Consultant bei der codecentric und derzeit als Scrum Master und agiler Coach bei diversen Kunden in der Versicherungsbranche tätig.

Davor sammelte er Erfahrung mit Technologien wie Spring, Vaadin and AngularJS für Frontend-Entwicklung in der Versicherungs- und E-Learningbranche.

Sein Steckenpferd sind agile Methoden und Entwicklungspraktiken, Clean Code und die Entwicklung mobiler Anwendungen für Android.

Share on FacebookGoogle+Share on LinkedInTweet about this on TwitterShare on RedditDigg thisShare on StumbleUpon

Kommentare

  • Jochen

    11. Januar 2017 von Jochen

    Ich vermisse so ziemlich alle (grandiosen) Bibliotheken von Square (https://github.com/square?utf8=%E2%9C%93&q=&type=&language=java), etwa OkHttp, Butterknife etc.

    Wenigstens LeakCanary hat es in die Liste geschafft. 😉

    • Sascha Fröhlich

      11. Januar 2017 von Sascha Fröhlich

      Butterknife und Retrofit von Square haben es zumindest in die „honorable mentions“ geschafft (siehe Ende des Absatzes von Android Annotations) 🙂

  • jonas.verhoelen

    12. Januar 2017 von jonas.verhoelen

    Ich bin mit Android Entwicklung wenig vertraut. Die Wirkungen von z.B. Android Annotations auf den Code wirken aber sehr charmant, da bekomme ich fast sofort Lust mal damit anzufangen 😉

  • Robert Wiesner

    13. Januar 2017 von Robert Wiesner

    „Wem Android Annotations zuviel bietet oder wer die Generierung über APT nicht mag“ stimmt nicht ganz: Sowohl Dagger2 als auch Butterknife verwenden APT zur Code-Generierung.

    Da ich auch ungerne Boilerplate Code produziere, hat sich zuletzt eine Kombination aus swagger-codegen (mit Retrofit), Dagger2 und Butterknife bewährt. AndroidAnnotations werde ich mir auch mal näher angucken, dort ist einiges vereint. Injection von eigenen Dependencies (à la Dagger) ist damit aber nicht möglich oder? Also eher in der Richtung von Butterknife, um Android Dependencies zu injecten.

    • Sascha Fröhlich

      13. Januar 2017 von Sascha Fröhlich

      Ach stimmt – ich werde das korrigieren. Ich hatte angenommen dass ein Butterknife.bind(this) die Magie übernimmt und nicht weiter gelesen 🙂

      AndroidAnnotations kann jede Klasse injizieren, eigene Dependencies werden mit @EBean annotiert.

Kommentieren

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.