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

Effective Android Development

Effective Android Development

Slides from my talk presented at UA Mobile and Droidcon Berlin 2016 conferences.

More Android stuff:
https://medium.com/@sergii
https://twitter.com/sergiizhuk

Sergii Zhuk

June 16, 2016
Tweet

More Decks by Sergii Zhuk

Other Decks in Programming

Transcript

  1. EFFECTIVE ANDROID DEVELOPMENT S E R G I I Z

    H U K @ D R O I D C O N B E R L I N 1 6 - 0 6 - 2 0 1 6
  2. 2 HELLO! My name is Sergii Zhuk • Android Developer

    @ Zalando SE • Author of Android Digest for Ukrainian Developers Community • In Berlin since August 2015 • twitter.com/sergiizhuk • medium.com/@sergii
  3. 3 ZALANDO SE • Europe’s leading online fashion platform •

    ~ 10,000 employees in Europe • ~ EUR 3bn revenue in 2015 • ~ 60% of shop traffic came from mobile • 10M+ downloads Android app
  4. 7 ANDROID STUDIO – TIP 1 How does your manifest

    really look like? • Manifest Merger See also: “Hey, Where Did These Permissions Come From?” on The CommonsBlog
  5. 8 ANDROID STUDIO – TIP 2 You need to use

    new Android APIs. Are there any examples?
  6. 9 ANDROID STUDIO – TIP 2 You need to use

    new Android APIs. Are there any examples? • Find Sample Code
  7. 11 ANDROID STUDIO – TIP 3 “I’m not gonna to

    commit right now…” Local history for rescue!
  8. 13 ANDROID STUDIO – TIP 4 Support Annotations are your

    friends • Metadata annotations you can decorate your code with, to help catch bugs • @VisibleForTesting, @Nullable, @AnyThread, @Keep, @StringRes etc. • Integrated with Android Studio & Lint
  9. 14 ANDROID STUDIO – TIP 5 How to make a

    code review? Switch between branches could be slow: •stash your changes •checkout branch •reload gradle config
  10. 15 ANDROID STUDIO – TIP 5 How to make a

    code review? • Launch two IDE instances: one for the review, another one for the main work • Yes, you will need a powerful machine 
  11. 18 ANDROID STUDIO – TIP 6 Swap code fast •

    How changes are handled • Immediately (Hot swap) • Activity restart (Warm swap) • Application restart (Cold swap) • Rebuild
  12. 19 ANDROID STUDIO – TIP 6 Swap code fast Change

    Instant Run JRebel Change code of the existing method Could be immediately Activity restart Change/remove resource Activity restart Activity restart Method or class signature, statics, annotations App restart, API 21+ Activity restart Add/Remove superclass, implemented interface App restart, API 21+ App restart Change Manifest or notification resource Rebuild Rebuild Sources: https://developer.android.com/studio/run/index.html#instant-run Reto Meier "Instant Run: How Does it Work?!" Oleg Selajev "Looking at JRebel for Android and Instant Run ..."
  13. 21 TEST DEVICES – TIP 1 A lot of UI

    issues could be discovered if compare app on Lollipop and pre-Lollipop devices
  14. 22 TEST DEVICES – TIP 1 A lot of UI

    issues could be discovered if compare app on Lollipop and pre-Lollipop devices • Use at least two emulator instances or devices during dev tests • Use both 4.* and 5+ OS versions
  15. 24 TEST DEVICES – TIP 2 Emulators question Genymotion •

    Free only for private use & limited functionality • Latest OS version with the delay
  16. 25 TEST DEVICES – TIP 2 Emulators question Genymotion •

    Free only for private use & limited functionality • Latest OS version with the delay New Android SDK Emulator • push apps/data 10x faster than to a device • includes Google Play Services built-in
  17. 27 TEST DEVICES – TIP 3 (Cloud) Test Platforms •

    Can execute scenarios (Espresso tests, Robotium etc.) • Can take screenshots, measure device metrics, track logs • Example: AWS Device Farm, TestDroid, Firebase Test Lab
  18. 28 TEST DEVICES – TIP 3 (Cloud) Test Platforms •

    Also you can create your own device farm • Open-source tools available like Square Spoon
  19. 31 DEV & ENVIRONMENT – TIP 1 Measure execution time

    • Hugo by Jake Wharton @DebugLog public String getName(String first, String last) {/* ... */} V/Example: --> getName(first="Jake", last="Wharton") V/Example: <-- getName [16ms] = "Jake Wharton"
  20. 32 DEV & ENVIRONMENT – TIP 2 How to read

    logcat output from your device?
  21. 33 DEV & ENVIRONMENT – TIP 2 How to read

    logcat output from your device? • Jake Wharton’s pidcat
  22. 34 DEV & ENVIRONMENT – TIP 3 Click on device/emulator

    screen every time you are testing some functionality • BUT what if you have 5 test devices? • AND you have a regression plan for 30 scenarios?
  23. 35 DEV & ENVIRONMENT – TIP 3 Click on device/emulator

    screen every time you are testing some functionality • Use ADB commands/scripts to replace manual interactions adb shell input keyevent 4
  24. 36 DEV & ENVIRONMENT – TIP 3.5 Click on device/emulator

    screen every time you are testing some functionality • Use adb-ninja script to submit your command to several devices simultaneously https://github.com/romannurik/env/blob/master/bin/ninja-adb
  25. 38 DEV & ENVIRONMENT – TIP 4 Think about application

    tracking & analytics • A lot of projects with overlapping functionality: • Google Analytics • Firebase Analytics • Adjust • Answers Events by Fabric • Integration requires huge architecture effort • Testing is always hard
  26. 40 DEV & ENVIRONMENT – TIP 5 Network output logging/analyzing

    Use Http Monitoring & Proxy tools like Charles • HTTP/HTTPS traffic monitoring • Rewrite values • Set breakpoints
  27. 42 DEV & ENVIRONMENT – TIP 6 All-in-one inspection tool

    by Facebook! • Stetho • SQLite database • Network proxy • Hierarchy Viewer • App preferences
  28. 43 DEV & ENVIRONMENT – TIP 7 Explore your APK

    • Manifest • Method count per dependency • Resources set properly • and more
  29. 44 DEV & ENVIRONMENT – TIP 7 Explore your APK:

    ClassyShark • DEX Method count by package/class • Dependencies • Merged Manifest • Obfuscation check Android Studio APK Analyzer + Drawables preview
  30. 47 GRADLE HACKS – TIP 1 Check your config build.gradle:

    • Get rid of mavenCentral, use jcenter • Check Gradle plugin version • DON’T specify version ranges for the dependencies
  31. 48 GRADLE HACKS – TIP 1 Check your config •

    gradle.properties: org.gradle.daemon=true # if multiple modules [incubating feature] org.gradle.parallel=true # Dex In Process. Also set in build.gradle dexOptions{ javaMaxHeapSize } org.gradle.jvmargs=-Xmx4096m
  32. 50 GRADLE HACKS – TIP 2 How much time spent

    on building the app? • Track your time! https://github.com/passy/build-time-tracker-plugin
  33. 52 GRADLE HACKS – TIP 3 Build faster using target

    API 21 for dev needs productFlavors { // Define separate dev and prod flavors dev21 { minSdkVersion 21 } dev14 { minSdkVersion 14 } prod { // The actual minSdkVersion for the application minSdkVersion 14 } }
  34. 54 CONCLUSION • Keep optimizing time spent on repeating things

    • Keep looking for ways how to build the app faster • It’s never too late to improve tools knowledge