Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Groovy and Android: a winning pair

Groovy and Android: a winning pair

Talk given at SpringOne2GX 2014, about using the Groovy language to develop Android applications.

Cédric Champeau

September 11, 2014
Tweet

More Decks by Cédric Champeau

Other Decks in Technology

Transcript

  1. © 2014 SpringOne 2GX. All rights reserved. Do not distribute

    without permission. Groovy and Android, a winning pair? By Cédric Champeau
  2. #s2gx #groovylang @CedricChampeau About me Pivotal employee Core Groovy committer

    Compilation configuration Static type checking & Static compilation Traits, new template engine, ... Groovy in Action 2 co-author Misc OSS contribs (Gradle plugins, deck2pdf, jlangdetect, ...) 2
  3. #s2gx #groovylang @CedricChampeau Groovy is Open-Source • Licensed under APL2

    • 100+ contributors • 10000+ commits • 1.7+ million downloads in 2013 • On GitHub since summer 2011 • Dependency of 25000+ OSS projects 4
  4. 5

  5. #s2gx #groovylang @CedricChampeau Why Android? • Uses a JVM •

    SDK is free • Tooling also freely available (Android Studio) • I don't own a Mac ;) • Swift anyone? 6
  6. #s2gx #groovylang @CedricChampeau Why Groovy? • Built on top of

    the shoulders of a Giant (Java) • Runs a JVM • Android developers shouldn't be suffering • Java on Android is very verbose • And the main development language on the platform 7
  7. #s2gx #groovylang @CedricChampeau Groovy on Android: the problems • Groovy

    is a dynamic language • Not everything done at compile time • Intensive use of reflection • Potentially slow invocation pathes • Battery? • Bytecode is different • Classes at runtime? 8
  8. #s2gx #groovylang @CedricChampeau Groovy on Android: the problems • Not

    all classes are available • java.bean.xxx very problematic • Multiple runtimes • Dalvik • ART • Behavior not the same as the standard JVM 9
  9. #s2gx #groovylang @CedricChampeau Groovy on Android: discobot • Early days

    • Written in 2011 • Fork of Groovy 1.7 • Capable of running scripts at runtime • but slow... 10
  10. #s2gx #groovylang @CedricChampeau Groovy on Android: dex files • Dalvik

    VM = new bytecode format • Groovy generates JVM bytecode • Translation done through dex • No native support for generating classes at runtime 11
  11. #s2gx #groovylang @CedricChampeau Discobot process • Write Groovy bytes to

    a file • Package those into a jar • Use a special classloader to load the class • Enjoy! 14
  12. #s2gx #groovylang @CedricChampeau Discobot process • Works, but very slow

    • Lots of I/O involved • What about ASMDex? • Same approach used by Ruboto • Nice proof of concept 16
  13. #s2gx #groovylang @CedricChampeau Groovy 2.4: Objectives for Android • Supporting

    Android in the standard distribution • Building a full Android application in Groovy • Main focus on @CompileStatic • Optional use of dynamic Groovy 18
  14. #s2gx #groovylang @CedricChampeau Groovy 2.4: Objectives for community • Community

    is a major strenght of Groovy • We need you for Android too! • Bring the goodness of Groovy to Android • Invent new frameworks! 19
  15. #s2gx #groovylang @CedricChampeau Requirements • Gradle • Android Studio •

    Or your favorite editor... • Groovy 2.4.0-beta-3 • A good tutorial on Android... 22
  16. #s2gx #groovylang @CedricChampeau Groovy 2.4 Android Support • Must use

    a specific Android jar • Use of the grooid classifier • Replaces java.beans use with openbeans • Workarounds for Android specific behavior • Reduced number of methods in bytecode • Important for the 64k limit of dex files 23
  17. #s2gx #groovylang @CedricChampeau Gradle plugin • Gradle is the new

    default build system for Android • apply plugin: 'com.android.application' • Uses a non standard compilation process • Without Groovy specific plugin, lots of trickery involved • Thus apply plugin: apply plugin: 'me.champeau.gradle.groovy-android' • Supports both the application and library plugins 24
  18. #s2gx #groovylang @CedricChampeau Gradle plugin buildscript { repositories { jcenter()

    } dependencies { classpath 'com.android.tools.build:gradle:0.12.2' classpath 'me.champeau.gradle:gradle-groovy-android-plugin:0.3.0' } } apply plugin: 'me.champeau.gradle.groovy-android' dependencies { compile 'org.codehaus.groovy:groovy:2.4.0-beta-3:grooid' } 25
  19. #s2gx #groovylang @CedricChampeau Then code! @CompileStatic @ToString(includeNames = true) @EqualsAndHashCode

    class Session { Long id Long speakerId Slot slot String title String summary List<String> tags } 26
  20. #s2gx #groovylang @CedricChampeau Groovifying Android APIs 28 class FeedTask extends

    AsyncTask<String, Void, String> { protected String doInBackground(String... params) { // on next slide... } @Override protected void onPostExecute(String s) { mTextView.setText(s); } }
  21. #s2gx #groovylang @CedricChampeau Groovifying Android APIs 29 Fluent.async { def

    json = new JsonSlurper().parse([:], new URL('http://path/to/feed'), 'utf-8') json.speakers.join(' ') } then { mTextView.setText(it) }
  22. #s2gx #groovylang @CedricChampeau System resources • Example of the GR8Conf

    Agenda application • Groovy jar: 4.5MB • Application size: 2MB! • After ProGuard: only 1MB! • ~8.2MB of RAM! (but lots of images) 31
  23. #s2gx #groovylang @CedricChampeau Community projects • Community is more important

    than the language • New frameworks to invent • Some already did! 33
  24. #s2gx #groovylang @CedricChampeau SwissKnife • Similar to Android Annotations and

    ButterKnife • Based on AST transformations • View injection • Threading model • Works with annotations to generate code 34
  25. #s2gx #groovylang @CedricChampeau SwissKnife 35 class MyActivity extends Activity {

    @OnClick(R.id.button) void onButtonClicked(Button button) { Toast.makeText(this, "Button clicked", Toast.LENGTH_SHOT).show() } @OnBackground void doSomeProcessing(URL url) { // Contents will be executed on background ... } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // This must be called for injection of views and callbacks to take place SwissKnife.inject(this) } }
  26. #s2gx #groovylang @CedricChampeau Grooid Tools 36 View view = new

    AndroidBuilder().build(this) { relativeLayout(width: MATCH_PARENT, height: MATCH_PARENT, padding: [dp(64), dp(16)]) { textView(width: MATCH_PARENT, height: dp(20), text: R.string.hello_world) } } • Builders for views • Experimental • https://github.com/karfunkel/grooid-tools
  27. #s2gx #groovylang @CedricChampeau Potential issues 37 • Performance of dynamic

    Groovy on low end-devices • Use @CompileStatic whenever possible • The infamous 64k method count • Use ProGuard! • Tooling support • Groovy not fully supported by Android Studio • Google support • Android Gradle plugin updates are very frequent
  28. #s2gx #groovylang @CedricChampeau “Best of all, I expect to try

    to update Android Studio right before the talk, so I have the latest possible version in the so­called Canary channel. What could possibly go wrong?” Ken Kousen, September 10th, 2014
  29. #s2gx #groovylang @CedricChampeau Other ideas 39 • Dagger-like dependency injection

    framework? • Data binding APIs • Improved reactive APIs • You can already use Reactor or RxJava
  30. #s2gx #groovylang @CedricChampeau Future is now! 40 • New York

    Times next app will be written in Groovy!