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

Groovy and Android: a winning pair

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers. →

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

Transcript

41 slides
  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!

More Decks by Cédric Champeau

Other Decks in Technology