Building Top-Notch Androids SDKs

35
Building Top-Notch Android SDKs Hugo Doménech @hudomju

Transcript of Building Top-Notch Androids SDKs

Page 1: Building Top-Notch Androids SDKs

Building Top-Notch Android SDKs

Hugo Doménech @hudomju

Page 2: Building Top-Notch Androids SDKs

relayrbring things to life

Page 3: Building Top-Notch Androids SDKs

relayrbring things to life

easy tools to connectthings and apps

Page 4: Building Top-Notch Androids SDKs

Building Top-Notch Android SDKs

Hugo Doménech @hudomju

Page 5: Building Top-Notch Androids SDKs

Agenda

1. Why?

2. How?

3. What?

Page 6: Building Top-Notch Androids SDKs

Agenda

1. Why?

2. How?

3. What?

Page 7: Building Top-Notch Androids SDKs

• Developers are lazy - reuse code

• Separate concerns (build independent blocs)

• Write better software

• Speed up compile time

• Make other people happy…

Reasons

Page 8: Building Top-Notch Androids SDKs

• Feel better

• Code better: Power of shame

• Get features and bug fixes for free

• Easier to sell - quality prove

• Excitement from the community

• Security

• It’s free

• But most important: Be famous!

Make it open source!

Page 9: Building Top-Notch Androids SDKs

Agenda

1. Why?

2. How?

3. What?

Page 10: Building Top-Notch Androids SDKs

Decide what you are providing

Library Project jar (Java ARchive)

Apk Lib aar (Android Archive Resource)

Page 11: Building Top-Notch Androids SDKs

Let’s build a SDK!

Page 12: Building Top-Notch Androids SDKs

1. Don’t start with code: README.md and ROADMAP.md

2. Put it in a Git Repository

3. Include it in your CI (Continuous Integration)

4. Add static code analysis tools (i.e. FindBugs, Lint)

5. Autogenerate documentation (i.e. JavaDoc)

6. Prepare for testing

7. Make it accessible (i.e. distribute via maven)

8. Add a sample project

Create a SDK!

Page 13: Building Top-Notch Androids SDKs

Managing Releases

Use the library in a real project

SDK as a git submodule

Master

Master

Develop

Develop

Feature Branch

Feature Branch

Page 14: Building Top-Notch Androids SDKs

Agenda

1. Why?

2. How?

3. What?

Page 15: Building Top-Notch Androids SDKs

• Available

• Easy to use

• Flexible

• Testable

• Performant

• Reliable

• Lightweight

Great SDK Qualities

Page 16: Building Top-Notch Androids SDKs

Available

dependencies { include ‘io.relayr:android-sdk:0.0.5’}

build.gradle

*gradle-mvn-push.gradle by Chris Banes

Page 17: Building Top-Notch Androids SDKs

• Intuitive

• Consistent

• Easy to use, hard to misuse

Easy to use

Page 18: Building Top-Notch Androids SDKs

• Easy to initialise

• Easy to use

Easy to use

RelayrSdk.init(this);

RelayrSdk.logMessage(“At droidcon Krakow!”);

Page 19: Building Top-Notch Androids SDKs

Flexible

new RelayrSdk.Builder(this) .inMockMode(true) .apiEndpoint(“api.relayr.io”) .withDebugger(new DefaultDebugger()) .build();

Page 20: Building Top-Notch Androids SDKs

Flexible - minimize permisions

Page 21: Building Top-Notch Androids SDKs

Flexible - minimize permisions

public boolean canVibrate() { String permission = "android.permission.VIBRATE"; int result = mContext.checkCallingOrSelfPermission(permission); return result == PackageManager.PERMISSION_GRANTED; }

Page 22: Building Top-Notch Androids SDKs

Flexible - minimize requisites

<uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

<uses-feature android:name=“android.hardware.bluetooth_le" android:required="false"/>

public boolean isBleSupported() { String feature = PackageManager.FEATURE_BLUETOOTH_LE; return getPackageManager().hasSystemFeature(feature); }

Page 23: Building Top-Notch Androids SDKs

Flexible - support different versions

defaultConfig { applicationId 'io.relayr.wunderbar' minSdkVersion 15 targetSdkVersion 21 versionCode 22 versionName '1.0.22' }

public boolean isSdk18() { return android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2; }

Page 24: Building Top-Notch Androids SDKs

mApplication.registerActivityLifecycleCallbacks( new Application.ActivityLifecycleCallbacks() { @Override public void onActivityResumed(Activity activity) { // we know there’s a UI! } } );

Flexible - be context aware

Page 25: Building Top-Notch Androids SDKs

• Mock mode (no network requests)

• No static methods

• Avoid final classes

• Avoid access to fields directly

Testable

Page 26: Building Top-Notch Androids SDKs

• Don’t block the current thread!

Performant

RelayrSdk.sendMessage(“At droidcon Krakow!”);

Page 27: Building Top-Notch Androids SDKs

• With Code

Performant - Don’t log in production

RelayrSdk.Builder(this) .setDebuggable(false) .build();

debuggable=false

• On the Manifest

Page 28: Building Top-Notch Androids SDKs

• Don’t crash silently - inform the user when a problem occurs

Reliable

RelayrSdk.login(new LoginCallback() { public void onSuccess() { // sign the user into the app } public void onError() { // show error message }});

Page 29: Building Top-Notch Androids SDKs

• Poor network conditions

• Association between small and fast

• Reluctance to include large libraries

Lightweight

Page 30: Building Top-Notch Androids SDKs

Lightweight - don’t require libraries

private boolean hasOkHttpOnClasspath() { try { Class.forName("com.squareup.okhttp.OkHttpClient"); return true; } catch (ClassNotFoundException e) { } return false; }

dependencies { provided ‘com.squareup.okhttp:okhttp:2.0.0’}

Page 31: Building Top-Notch Androids SDKs

Lightweight - be modular

dependencies {

}

include ‘io.relayr:java-sdk:0.0.5’include ‘io.relayr:android-sdk:0.0.5’include ‘io.relayr:android-onboarding:0.0.7’include ‘io.relayr:master-module:1.2.0’include ‘io.relayr:android-commons:1.0.0’

Page 32: Building Top-Notch Androids SDKs

Recapitulate

1. Why?

2. How?

3. What?

Page 33: Building Top-Notch Androids SDKs

Take away

Page 34: Building Top-Notch Androids SDKs

Questions?Hugo Doménech

@hudomju

Page 35: Building Top-Notch Androids SDKs