An-Droid 101

Developing Libraries

Nishant Srivastava

Android Dev/Interaction Designer

Organizer@GDG New Delhi

Goals

WHAT ?

WHY ?

HOW ?

To answer the below with respect to Android Libraries

What is a Software Library ?

A software library generally consists of pre-written code, classes, procedures, scripts, configuration data and more. 

 

 It is designed to assist both the programmer and the programming language compiler in building and executing software.

WHY ?

Developers are lazy

..hence they reuse code.

..because

  • Build modular and independent blocks
  • Write better softwares
  • Speed up compile time
  • Easier implementation
  • Make code more testable

..and best of em all being ...

Make people happy..

.. OK , I guess BATMAN doesn't smile anyways.. :P 

Before software can be reusable it first has to be usable.

                  - Ralph Johnson

Your code depends on Android idioms/resources

1.UI

2.Looper/Handler

3.Resources

4.Native Code

..and many more...

Why writing an Android library ?

AAR vs JAR

JAR - Java ARchive

.jar  ==  Java library

 

Contains

java code

 

Used for

Functionality such as data handling, data manipulation, service integration

AAR - Android ARchive

.aar  ==  Android library

 

Contains

java code + android resources + android manifest stub

 

Used for

Functionality that includes everything a jar can + UI

Finally ...a break ..

HOW ?

Step 1 : Gradle

..in their own words..
 

Emerge from Build Hell today through Gradle, the modern open source polyglot build automation system.. 

Step 2 : Create Project

How hard can it be ?

Fire up your Android Studio and Create a New Project

Step 2 : {Gradle Build in progress}

Step 3 : Create a new module

Create a new module

Step 3 : Create a new module (..contd)

Go on..

Step 3 : Create a new module (..contd)

We are going to stick to making an AAR module.

Once selected, my suggestion is to rename

  1. module name to library
  2. application name to <yourlibraryname>
  3. Package name to <domain.company.library.yourlibraryname>

 

Step 3 : Create a new module (..contd)

Step 4 : Crush Code (..literally)

.....and build your awesome library...

Step 4 : {Create and Build your library}

  1. Entity class declaration
    • Do
       
    • Don't
       

 void init(ApiSecret apisecret);

 void init(String apikey, int refresh, long interval, String type);

Make Your Libraries

Stable

  1. Multi-Thread compatibility
    • Singleton implementation
    • Synchronization
    • Immutable Entity
  2. Lifecycle mangement
    • Object lifetime alignment

Make Your Libraries

Stable

Make Your Libraries

  1. Intuitive
  2. Consistent
  3. Easy to use, Hard to misuse

Easy to Use


  public boolean hasPermission(Context context, String permission) {
        int result = context.checkCallingOrSelfPermission(permission);
        return result == PackageManager.PERMISSION_GRANTED;
  }

Minimize Permissions


  String feature = PackageManager.FEATURE_BLUETOOTH;

  public boolean isFeatureAvailable(Context context, String feature) {
        return context.getPackageManager().hasSystemFeature(feature);
  }

Minimize Requisites

Things to take care of..

    
    public boolean isMarshmallow(){
        return Build.VERSION.SDK_INT>= Build.VERSION_CODES.M;
    }

Support different versions

Things to take care of..

Make your code Testable

  1. Mock
  2. No static methods
  3. Avoid final classes
    // In code
    boolean debuggable = false;
    MyAwesomeLibrary.init(debuggable);

    // In build.gradle
    debuggable = true

Donot log in production

Things to take care of..

Do not crash silently - Log all exceptions and print them in the logcat

Handle poor network conditions

Reluctance to include large libraries

    
    dependencies {
        provided 'com.squareup.okhttp3:okhttp:3.1.2'
    }

Donot require libraries

Things to take care of..

Check in classpath

    
    private boolean hasOKHttpOnClasspath() {
        try {
            Class.forName("ccom.squareup.okhttp3.OkHttpClient");
            return true;
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        }
        return false;
    }

..simply put follow the rule of SPOIL-ing your Library .. 

 

Simple Briefly and Clearly expressed

Purposeful Having or showing resolve

OpenSource Universal Access, Free license

Idiomatic Natural to the native environment

Logical - Clear, Sound Reasoning

Step 5 : {Create and Build your library}

 $ ./gradle build
  
    or

 $ ./gradlew build

Step 6

http://developer.android.com/tools/testing/testing_android.html

Write & Use Unit Tests

Step 7

$ gradle clean connectedCheck

Run Your Tests

...and if you don't ...this is what happens..

Step 8

Readme.md

JavaDocs

Example Apps

Document

Step 9

Maven Central / Jcenter

Local/Remote Maven Repositories

Local AAR

Publish

 Use your library in another project

....So you have built you awesome library, huh !
So the only thing left now is understanding how to use it in another project, right...

 

If you are not familiar with the way you include a dependency/library in your project via using gradle then here it is :




    dependencies {
        compile 'com.company.library:myawesomelibrary:23.1.1'
    }

Libraries are a necessary evil

...and thats it for today folks!

Me after this session..literally :P

Questions ?