$30 off During Our Annual Pro Sale. View Details »

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

    View Slide

  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

    View Slide

  3. #s2gx #groovylang @CedricChampeau
    Social (or why to use #groovylang)
    3

    View Slide

  4. #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

    View Slide

  5. 5

    View Slide

  6. #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

    View Slide

  7. #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

    View Slide

  8. #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

    View Slide

  9. #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

    View Slide

  10. #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

    View Slide

  11. #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

    View Slide

  12. #s2gx #groovylang @CedricChampeau
    Compiling an Android application
    • Classic process
    12

    View Slide

  13. #s2gx #groovylang @CedricChampeau
    Compiling an Android application
    • Classic process for a Groovy application
    13

    View Slide

  14. #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

    View Slide

  15. #s2gx #groovylang @CedricChampeau
    Compiling an Android application
    • Runtime generation of classes
    15

    View Slide

  16. #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

    View Slide

  17. #s2gx #groovylang @CedricChampeau
    Redefinining objectives

    View Slide

  18. #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

    View Slide

  19. #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

    View Slide

  20. #s2gx #groovylang @CedricChampeau
    Groovy for Android

    View Slide

  21. #s2gx #groovylang @CedricChampeau
    It already works!
    21

    View Slide

  22. #s2gx #groovylang @CedricChampeau
    Requirements
    • Gradle
    • Android Studio
    • Or your favorite editor...
    • Groovy 2.4.0-beta-3
    • A good tutorial on Android...
    22

    View Slide

  23. #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

    View Slide

  24. #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

    View Slide

  25. #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

    View Slide

  26. #s2gx #groovylang @CedricChampeau
    Then code!
    @CompileStatic
    @ToString(includeNames = true)
    @EqualsAndHashCode
    class Session {
    Long id
    Long speakerId
    Slot slot
    String title
    String summary
    List tags
    }
    26

    View Slide

  27. #s2gx #groovylang @CedricChampeau
    Demo

    View Slide

  28. #s2gx #groovylang @CedricChampeau
    Groovifying Android APIs
    28
    class FeedTask extends AsyncTask {
    protected String doInBackground(String... params) {
    // on next slide...
    }
    @Override
    protected void onPostExecute(String s) {
    mTextView.setText(s);
    }
    }

    View Slide

  29. #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)
    }

    View Slide

  30. #s2gx #groovylang @CedricChampeau
    Performance?

    View Slide

  31. #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

    View Slide

  32. #s2gx #groovylang @CedricChampeau
    Community

    View Slide

  33. #s2gx #groovylang @CedricChampeau
    Community projects
    • Community is more important than the language
    • New frameworks to invent
    • Some already did!
    33

    View Slide

  34. #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

    View Slide

  35. #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)
    }
    }

    View Slide

  36. #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

    View Slide

  37. #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

    View Slide

  38. #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

    View Slide

  39. #s2gx #groovylang @CedricChampeau
    Other ideas
    39
    • Dagger-like dependency injection framework?
    • Data binding APIs
    • Improved reactive APIs
    • You can already use Reactor or RxJava

    View Slide

  40. #s2gx #groovylang @CedricChampeau
    Future is now!
    40
    • New York Times next app will be written in Groovy!

    View Slide

  41. 41
    @CedricChampeau
    melix
    http://melix.github.io/blog

    View Slide