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

[Devoxx Poland '19] My love-hate relationship w...

[Devoxx Poland '19] My love-hate relationship with Android Studio

Android Studio is the tool of the trade hands down. When it comes to Android (app/library/IOT) development, the first thing that comes to mind is to install Android Studio and get going from there. However, it has not been a smooth road as expected for me. In my own experience, I talk about my love-hate relationship with Android Studio. I try to cover what Android Studio gets right and what it doesn't. The talk focuses on how to be embrace performance when Android Studio is the bottleneck in the workflow (slow build times and reduced productivity), how switching to a terminal and various tools that exist in the ecosystem can give Android developers the much-needed speed boost and in-depth view in their development workflow. By the end of this talk, you would have embraced a workflow that allows for increased productivity and faster development.

Event Link: https://web.archive.org/web/20190610115625/https://cfp.devoxx.pl/talk/JCI-4114/My_love-hate_relationship_with_Android_Studio
Google Slides: https://docs.google.com/presentation/d/1WFDszY4fSLu-tAJC-rw-gOKFOnRPo4SwRveAtVXgSq0/edit?usp=sharing

Nishant Srivastava

June 24, 2019
Tweet

More Decks by Nishant Srivastava

Other Decks in Technology

Transcript

  1. 1

  2. What happened • April 4, 2018 • Trying to build

    a Android Project ◦ Typical project ◦ Multi module ◦ Native code (NDK) ◦ Common dependencies: Retrofit, Dagger, Rx, Support Libraries, etc 4 @nisrulz
  3. What happened • April 4, 2018 • Trying to build

    a Android Project ◦ Typical project ◦ Multi module ◦ Native code (NDK) ◦ Common dependencies: Retrofit, Dagger, Rx, Support Libraries, etc • Laptop: Macbook Air (early 2014) Core i5, 4 GB RAM, 128 GB SSD 5 @nisrulz
  4. What happened My build times: ~37 minutes Not just the

    first time, but every other build after that too. 8 @nisrulz
  5. What I tried With a few gradle tweaks in the

    project Build times down to ~28 minutes 9 @nisrulz
  6. What I tried The result Build times down to ~3

    minutes (89% reduction) 14 @nisrulz +
  7. The experience To summarize, Android Studio is • Slow •

    Finicky • Forces its defaults and deviates from its base • New tools are limiting as in are Android Studio specific ◦ Profilers ◦ Constraint Layout Editor • Uses a lot of Memory and CPU • Has versioning problem (Stable, Beta, Alpha) 28 @nisrulz
  8. Slow, but why? • Gradle Configuration • Indexing changes in

    code • Plugins • Code Insight: Inplace analysis/inspections 30 @nisrulz
  9. Configuring Gradle for speed Use the latest Gradle release. 31

    @nisrulz Incremental compile 1000-module Java project https://gradle.org/whats-new/gradle-5/
  10. Configuring Gradle for speed Use the latest Gradle release. Caveat:

    Update to latest Canary release of Android Studio, since the support for latest Gradle is tied to Android Studio. 32 @nisrulz
  11. Configuring Gradle for speed Build Cache: Reuse outputs from any

    previous invocation of Gradle // Add this in your global gradle.properties file // at ~/.gradle/gradle.properties // Enable Build Cache android.enableBuildCache=true 33 @nisrulz
  12. Configuring Gradle for speed Daemon: Dedicated background process to improve

    performance of Gradle // Add this in your global gradle.properties file // at ~/.gradle/gradle.properties // Enable Gradle Daemon org.gradle.daemon=true 34 @nisrulz
  13. Configuring Gradle for speed Allocate memory: Increase the memory provided

    to JVM // Add this in your global gradle.properties file // at ~/.gradle/gradle.properties // Configure allocated memory org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m 35 @nisrulz
  14. Configuring Gradle for speed Parallel builds: Force Gradle to execute

    tasks in parallel as long as those tasks are in different projects. // Add this in your global gradle.properties file // at ~/.gradle/gradle.properties // Enable Parallel builds org.gradle.parallel=true 36 @nisrulz
  15. Reducing Indexing If your codebase has files changing on each

    build, it will trigger indexing. Suggestions: • Avoid using annotation processors • Using implementation as much as possible, instead of api. • Use static build config values i.e version code, version name, resources 37 @nisrulz
  16. Plugins: Inspect what you use Android Studio comes with a

    lot of Plugins enabled, which contribute to its sluggishness. 38 @nisrulz
  17. Plugins: Inspect what you use Android Studio comes with a

    lot of Plugins enabled, which contribute to its sluggishness. Solution: Check and disable what you don’t need. 39 @nisrulz
  18. Code Insight Although required, it does make Android Studio slow.

    Solution: Enable Power Save Mode 40 @nisrulz
  19. ADB: Android Debug Bridge • Command Line tool • Shipped

    with Android SDK • Allows interacting with debuggable Android devices • Client-Server program • Available as: adb <param> 42 @nisrulz
  20. ADB: Android Debug Bridge • Install App adb install path_to_apk

    • Uninstall App adb uninstall com.package.name • Copy a file from System to Android device adb push path_to_file /path_to_dir_on_device • Copy a file from Android device to System adb pull /path_to_dir_on_device/file.png ~/path_on_system/ 43 @nisrulz
  21. Other tools via ADB shell • Activity Manager: am •

    Emulator: emulator • Package Manager: pm • Device Policy Manager: dpm • Logcat: logcat • Dumpsys: dumpsys and many more. 44 @nisrulz
  22. Gradle Android projects use Gradle as the build system. Each

    Android project has a gradle wrapper, which is a proxy to local Gradle binary. Android Studio invokes Gradle to execute tasks The same can be done via terminal: ./gradlew assembleDebug > is equivalent to Make in Android studio 45 @nisrulz
  23. Lint This is part of the gradle tasks, which checks

    the code for structural inconsistencies, thus allowing to write more maintainable code. // Execute lint in project ./gradlew lint > Similar to executing via Android Studio 46 @nisrulz
  24. Scrcpy https://github.com/Genymobile/scrcpy Command-line tool for mirroring and controlling your device.

    // Start mirroring the device scrcpy //Record while mirroring scrcpy --record file.mp4 // Show touches scrcpy --show-touches // Switch off screen scrcpy --turn-screen-off 48 @nisrulz
  25. Classyshark https://github.com/google/android-classyshark Tool for decompiling and analyzing internals of an

    APK such as dex Count. Works with .apk, .jar, .aar, .class, .dex or .so files. Execute: java -jar ClassyShark.jar 49 @nisrulz
  26. Detekt https://github.com/arturbosch/detekt • Static code analyzer for Kotlin language. •

    Helps to detect code smell in kotlin codebase • Highly configurable • Enables complexity analysis of the code • Also has a gradle plugin to setup in the project // Execute at the root of the project java -jar /path_to/detekt-cli.jar --debug 52 @nisrulz
  27. Detekt // Execute at the root of the project java

    -jar /path_to/detekt-cli.jar --debug // Output Complexity Report: - 686 lines of code (loc) - 563 source lines of code (sloc) - 425 logical lines of code (lloc) - 32 comment lines of code (cloc) ... - 218 code smells per 1000 lloc Project Statistics: - number of properties: 73 - number of functions: 22 - number of classes: 5 - number of packages: 3 - number of kt files: 5 53 @nisrulz
  28. AVD Manager • Command line tool to create and manage

    Android Virtual Devices (AVD) • Located in android_sdk/tools/bin/ // List all avd avdmanager list // Create a new avd avdmanager create avd -n myavd -k "system-images;android-29;google_apis;x86" // Remove avd avdmanager delete avd -n myavd 54 @nisrulz
  29. SDK Manager • Command line tool to manage Android SDK

    • Used to view, install, remove packages in Android SDK • Located in android_sdk/tools/bin/ // List all available packages sdkmanager --list // Install packages sdkmanager packages // Remove packages sdkmanager --uninstall packages // Update all packages sdkmanager --update 55 @nisrulz
  30. Battery Historian https://github.com/google/battery-historian • Python based tool • Used to

    inspect battery related information and events, while the device was not plugged in • For Android device running Android 5.0 Lollipop (API level 21) and later. • Useful since the new Energy Profilers are Android Studio only. 56 @nisrulz
  31. IntelliJ Idea • Android Studio is based on IntelliJ Idea

    ◦ IntelliJ Idea can be used for Android Development • Faster for development • Consumes less memory/CPU than Android Studio • Full plugin support • More frequent updates • Doesn’t have the Android Studio specific tools ◦ Constraint Layout Editor ◦ Profilers ◦ New project structure dialog 59 @nisrulz
  32. Automation • Alias creation enables executing complex tool configuration as

    a simple command. Example: // Create alias to push release apk to Downloads folder in Device alias pushReleaseToDevice="adb push ./apk-release.apk /sdcard/Downloads" // Execute pushReleaseToDevice ↵ 60 @nisrulz
  33. Automation • Command line tools enable ability to include in

    scripts. Using alias simplify the process. # Install APK to device # Use as: apkinstall app-debug.apk alias apkinstall="adb devices | tail -n +2 | cut -sf 1 | xargs -I X adb -s X install -r $1" # As an alternative to apkinstall, you can also do just ./gradlew installDebug # Alias for building and installing the apk to connected device # Run at the root of your project # $ buildAndInstallApk alias buildAndInstallApk='./gradlew assembleDebug && apkinstall ./app/build/outputs/apk/debug/app-debug.apk' 61 @nisrulz
  34. Automation • Command line tools enable ability to include in

    scripts. Using alias simplify the process. # Launch your debug apk on your connected device # Execute at the root of your android project # Usage: launchDebugApk alias launchDebugApk="adb shell monkey -p `aapt dump badging ./app/build/outputs/apk/debug/app-debug.apk | grep -e 'package: name' | cut -d \' -f 2` 1" # ------------- Single command to build+install+launch apk------------# # Execute at the root of your android project # Use as: buildInstallLaunchDebugApk alias buildInstallLaunchDebugApk="buildAndInstallApk && launchDebugApk" 62 @nisrulz
  35. Automation • Command line tools enable ability to include in

    scripts. Using alias simplify the process. # Take screenshot alias screenshot="adb exec-out screencap -p > screen-$(date -j "+%s").png" # Remove app alias rmapp="adb devices | tail -n +2 | cut -sf 1 | xargs -I X adb -s X uninstall $1" # Clear data for app alias clearapp="adb devices | tail -n +2 | cut -sf 1 | xargs -I X adb -s X shell pm clear $1" More automation aliases: https://gist.github.com/nisrulz/b0e79f2b3e27f99ca8b5dba9db6281ec 63 @nisrulz
  36. Automation • Use gradle plugin to setup all the automation

    commands Novoda’s Gradle Android command plugin creates handy gradle tasks in the project itself. https://github.com/novoda/gradle-android-command-plugin Some commands available: • installDevice<Variant> - installs the app on a specific device. • uninstallDevice<Variant> - uninstalls the app from a specific device. • run<Variant> - installs and launches the app on a specific device. and many more. Execute: ./gradlew installDeviceDebug 64 @nisrulz
  37. The experience • Project Marble Project Marble is a multi-release

    and focused effort on making fundamental features of the IDE rock-solid and polished. It is ongoing effort. Already made improvements under: 1. UX and performance in Layout Editor 2. Instant Run has been replaced by Apply Changes 3. Emulator performance, Snapshots 4. Lint performance 66 @nisrulz
  38. The experience • APK Analyzer GUI in Android Studio +

    Command-line tool Enables anyone to use it outside Android Studio // To print the file size of the apk in a human readable format; Output: 1.7MB 68 @nisrulz
  39. The experience • APK Analyzer // Prints the application ID,

    version code, and version name. // Output: in.excogitation.deviceinfo 17 2.0.1 apkanalyzer apk summary myapp.apk // Prints an estimate of the download size of the APK. // Output: 1.4MB apkanalyzer -h apk download-size myapp.apk • More info: https://developer.android.com/studio/command-line/apkanalyzer 69 @nisrulz
  40. Links/References Gradle Performance Tips: https://guides.gradle.org/performance/ Project Marble: https://medium.com/androiddevelopers/tagged/project-marble Blog Post:

    https://android.jlelse.eu/how-i-reduced-my-android-build-times-by-89-4242e51ce946 Disable Plugins: https://www.reddit.com/r/androiddev/comments/7sxhig/android_studio_slower_when_using_kotlin/dt88 pgn/ Battery Historian: https://developer.android.com/studio/profile/battery-historian 70 @nisrulz