/android-tips-tricks

:ballot_box_with_check: [Cheatsheet] Tips and tricks for Android Development

Apache License 2.0Apache-2.0

Image

Featured in

Android Weekly AndroidDev Digest

Cheatsheet about tips and tricks for Android Development

This is a simple set of tips and tricks regarding Android Development which I have gathered from various sources. It helps me direct other android devs in my community regarding stuff each android dev should know about. Its also there for me to keep track of anything I either learn on my own or from other sources now and then when browsing the internet.

Contributions are always welcome, hoping people will help me in growing this. To contribute, simply open up a PR with the changes.

###Know Your Tools

####Android Studio

  • Code faster by using keyboard shortcuts

    Description Mac Linux/Win
    Lookup IDE commands Cmd+Shift+A Ctrl+Shift+A
    Open Class Cmd+O Ctrl+O
    Open File Cmd+Shift+O Ctrl+Shift+N
    Open recently edited file Cmd+Shift+E Ctrl+Shift+E
    Lookup Actions Cmd+Shift+A Ctrl+Shift+A
    Open Symbol Cmd+Opt+O Alt+Shift+N
    Open recently used file Cmd+E Ctrl+E
    Last Edited Location Cmd+Shift+Backspace Ctrl+Shift+Backspace
    Find Usage in persistent window Opt+F7 Alt+F7
    Find Usage in floating window Cmd+Opt+F7 Ctrl+Alt+F7
    Format the code with proper Indentation Cmd+Opt+L Ctrl+Alt+L
    Surround With Opt+Cmd+T Alt+Ctrl+T
    Open Terminal Opt+F12 Alt+F12
    Generate Setter/Getters/ Cmd+N Alt+Ins
    Find Class CMD+O Ctrl+N
    Refactor/Rename Shift+F6 Shift+F6
    Quick Fix Opt+Enter Alt+Enter
    Goto Definition Cmd+B Ctrl+B
    Show parameters for selected method Cmd+P Ctrl+P
    Refactor This Ctrl+T Ctrl+Alt+Shift+T
    Stop Process Cmd+F2 Ctrl+F2
    Search Everywhere Shift+Shift Shift+Shift
    Select Methods to Override Ctrl+O Ctrl+O
    Delete Line Cmd+Backspace Ctrl+Y
    Duplicate Line Cmd+D Ctrl+D
    Multicursor Selection Ctrl+G Alt+J

    Complete Keymap Guide : MacOSX | Linux/Win

  • Use plugins to become more efficient

    1. KeyPromoter

    The plugin basically will annoy the hell out of you by showing you a big screen overlay with the key combination you should have used , if you used your mouse to execute some command to a level when you basically would start using the key combination just to avoid KeyPromoter annoying you all the time. Its also is useful features, like it will prompt you to create a key binding for a command which does not have a key binding and you have used it 3 times.

    1. String Manipulation

    Provides actions for text manipulation such as Toggle case, encode/decode, sorting,

    1. Lines Sorter

    Add Sort Lines action in Edit menu to sort selected lines or whole file if selection is empty.

    1. Findbugs

    Provides static byte code analysis to look for bugs in Java code from within Android Studio

    1. Sonar Lint

    Plugin that provides on-the-fly feedback to developers on new bugs and quality issues injected into Java, JavaScript and PHP code.

    1. Checkstyles

    Plugin provides both real-time and on-demand scanning of Java files from within Android Studio.

    1. ADB Idea

    Plugin that adds ADB commands to Android Studio and Intellij such as ADB Uninstall App, ADB Kill App, ADB Restart App, etc

  • Use Live Templates in Android Studio

    • logd - Generates Log.d(TAG, "");
    • newInstance - Generates the static newInstance function inside a Fragment
    • Toast - Generates Toast.makeText(context, "", Toast.LENGTH_SHORT).show();

    Comprehensive list of all Live Templates in Android Studio

  • Use the Darcula Theme in Android Studio

    Ok, I know its more like a preference , but trust me using that keeps your eyes less strained as they would be if you used the Default Light theme.

  • Don't use a small font

    Preferably use a font in Android Studio thats easy to read and is at a font size which doesnot forces you to strain your eyes. I use Menlo font.

  • Use a code style

    You should use a standard codestyle, so possible contenders can be

  • Use the Embedded Terminal inside Android Studio

  • Use the Memory/Network/CPU Monitor inside Android Studio to profile your code/app

####Emulator Apart from using physical devices , one should use emulators as they are as of now easy to manage and equivalently powerful.

####Vysor This one needs special mention due to how useful it is. It basically is a window to your device i.e it streams and allows you to interact with your physical device on your laptop. Very useful when you are demo-ing your app during a presentation. You can interact with your physical device and it will be shown right in your laptop screen. It has a paid/free version , paid version is totally worth buying.

####DeskDock Yes, vysor was great, but if you want to share your keyboard and mouse directly to your Android device, then this app is for you. It enables you to control your Android device as if it was part of your desktop computer. The FREE version includes use of computer mouse, while the PRO version includes features such as use of keyboard. This is useful where you can test your app without your hands ever leaving your keyboard.

###Make better choices while coding

  • Use OkHttp over HttpUrlConnect

    HttpUrlConnect suffers from quite some bugs. Okhttp solves them in a more elegant manner. [Reference Link]

  • Reference local aar files as below [Stackoverflow Ref]

      dependencies {
         compile(name:'nameOfYourAARFileWithoutExtension', ext:'aar')
       }
      repositories{
            flatDir{
                    dirs 'libs'
             }
       }
    
  • Use Pidcat for logging

  • Use some Version Control System(VCS) like Git

  • Use ClassyShark

    Its a standalone tool for Android Devs used to browse any Android executable and show important info such as class interfaces and members, dex counts and dependencies

  • Use Stetho

    Debug your android apps using Chrome Dev Tools.

  • Use Battery Historian

    A tool to analyze battery consumers using Android "bugreport" files.

  • Always use a constant version value like "24.2.0"

    Avoid using + when specifying the version of dependencies.

    • Keeps one secured from unexpected API changes in the dependency.
    • Avoids doing an extra network call for the checking latest version of each dependency on every build.
  • Use Handler instead of a TimerTask

  • Do not use your own personal email for Google Play Developer Account

  • Use Vectors instead of PNG

    If you do have to use png, compress them. Take a look at TinyPNG.

  • Use proguard

    android {
      ...
      buildTypes {
          release {
              minifyEnabled true
              proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
          }
      }

}

+ **Use shrinkResources**

```gradle
android {
  ...
  buildTypes {
      release {
          shrinkResources true
          minifyEnabled true
          ...
      }
  }
}
  • Simulating Android killing your app in the background, run in terminal adb shell am kill

  • Follow the below rule to have faster gradle builds

    Gradle memory >= Dex memory + 1Gb
  • Split your apk using gradle when using Native code, do not bundle all of em together and ship!.. coz that will make you evil

    defaultConfig {
        ...
    
        ndk {
          abiFilters "armeabi", "armeabi-v7a", "mips", "x86"
        }
      }
    
    //Split into platform dependent APK
      splits {
        abi {
          enable true
          reset()
          include 'armeabi', 'armeabi-v7a', 'mips', 'x86' //select ABIs to build APKs for
          universalApk false //generate an additional APK that contains all the ABIs
        }
      }
    
      // map for the version code
      project.ext.versionCodes = ['armeabi': 1, 'armeabi-v7a': 2, 'mips': 5, 'x86': 8]
    
      // Rename with proper versioning
      android.applicationVariants.all { variant ->
        // assign different version code for each output
        variant.outputs.each { output ->
          output.versionCodeOverride =
              project.ext.versionCodes.get(output.getFilter(com.android.build.OutputFile.ABI), 0) *
                  1000000 +
                  android.defaultConfig.versionCode
        }
      }
  • Learn about some architecture such as MVP or Clean

  • Try to understand and follow TDD (Test Driven Development)

  • To force re-download of dependencies

    ./gradlew --refresh-dependencies
  • To exclude a certain task from being run by gradle

    Suppose you want to exclude the task javaDoc then use -x option followed by the task name, i.e javaDoc in this case.

    ./gradlew clean build -x javaDoc

    Checkout more gradle tips here

  • Follow the DRY principle DRY = Do not Repeat Yourself

  • Package by Feature, not layers

  • Learn about Dependency Resolution

    With the speed android dependencies update, sooner or later you are going to encounter some sort of dependency conflict. Solution is making use of Dependency Resoultion. Official Reference

  • Use different package name for non-release builds

      android {
          buildTypes {
              debug {
                  applicationIdSuffix '.debug'
                  versionNameSuffix '-DEBUG'
              }
    
              release {
                  // ...
              }
          }
      }
  • Find and STOP leaking memory in your android app

  • Follow a standard naming convention for your resources

  • Make use of custom gradle tasks in your build.gradle files

    Android uses Gradle as its build system, which actually allows one to make a lot of things easy by creating tasks to automate things. This reddit post enlists a lot of such useful gradle scripts

###Tips regarding UI/UX

  • Points to note
    • When implementing Ripple Effect use ?attr/selectableItemBackground instead of ?android:attr (Ref)

    • When implementing Ripples contained within the view like Button, use (Ref)

      android:background="?attr/selectableItemBackground" 
    • When implementing Ripples that extend beyond the view's bounds like ImageView: (Ref)

      ?attr/selectableItemBackgroundBorderless
    • If you plan on keeping a reference to any ViewGroup (LinearLayout, FrameLayout, RelativeLayout, etc.), and you don’t want to use any methods specific to this particular type of Layout, keep it as a ViewGroup object. [More Info]

###Other Resources

Extra : Android Libraries built by me

  • EasyDeviceInfo - Enabling device information to be at android developers hand like a piece of cake!
  • Sensey - Android library to make detecting gestures easy
  • PackageHunter - Android library to hunt down package information
  • Zentone - Easily generate audio tone in android
  • RecyclerViewHelper - RecyclerViewHelper provides the most common functions around recycler view like Swipe to dismiss, Drag and Drop, Divider in the ui, events for when item selected and when not selected, on-click listener for items.
  • StackedHorizontalProgressbar - Android Library to implement stacked horizontal progressbar
  • QREader - A library that uses google's mobile vision api and simplify the QR code reading process
  • ScreenShott - Simple library to take a screenshot of the device screen , programmatically!
  • EvTrack - Android library to make event and exception tracking easy
  • OptimusHTTP - Android library that simplifys networking in android via an async http client
  • ShoutOut - Android library for logging information in android

####Credits This curated cheatsheet includes tips and tricks that I have been following in my workflow as well as those being suggested/followed by other android devs worldwide.I have tried to add direct links wherever I could remember, giving people due credit who have explained the concepts. If you think I have missed any , then either send a PR or open an issue and I will fix it asap.

License

Copyright 2016 Nishant Srivastava

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.