SlideShare a Scribd company logo
SDK best practices
Rebecca Hamelsdorf
13/9/2017
Hi!!
What is SDK
What is SDK?
what is SDK?
• SDK is a software development kit
• It’s a programing package that helps developers
to builds application for a specific platform.
• Typically it includes one or more API
Why?
Why do we need to develop an SDK?
Business need
Why do we need to develop an SDK?
But not for business reasons..
Why do we need to develop an SDK?
Business need
Internal use
Internal use..
Code reuse
Abstraction/black box
Why do we care about code reuse
● Saves time & money
Why do we care about code reuse
● Saves time & money
● Easier to maintain and change
Why do we care about code reuse
● Saves time & money
● Easier to maintain and change
● Solving bugs in a single place instead of bugs
all over the place
Developing SDK check list
1. Define the service for your SDK users
2. Plan your public API
3. Plan your internal code architecture
4. Code:)
5. Sample app + docs
6. Packaging
7. Ship!
Developing SDK check list
❏ Define the service for your SDK users
❏ Plan your public API
❏ Plan your internal code architecture
❏ Code:)
❏ Sample app + docs
❏ Packaging
❏ Ship!
Developing SDK check list
1. Define the service for your SDK users
2. Plan your public API
3. Plan your internal code architecture
4. Code:)
5. Sample app + docs
6. Packaging
7. Ship!
Plan your public API…
Public API is the contract between the app developer and
SDK developer.
you’re officially an API designer!
Plan your public API…
Put in your mind that the developer that integrate your sdk is
not sitting next to you..
Plan your public API…
Keep it:
Easy to learn- design for “stupid” developers
Plan your public API…
Keep it:
Easy to learn
Easy to use (even without docs!!), easy to integrate.
Someone did it really easy..
Plan your public API…
Keep it:
Easy to learn
Easy to use (even without docs!!), easy to integrate.
Hard to misused!
Plan your public API…
Keep it:
Easy to learn
Easy to use (even without docs!!), easy to integrate.
Hard to misused!
Custom exceptions
Custom Exception
class ServerURLException extends RuntimeException {
public ServerURLException(String message) {
super(message);
}
}
Custom Exception
class ServerURLException extends RuntimeException {
public ServerURLException(String message) {
super(message);
}
}
static void isUrlValid(String serverURL) {
if( isNullOrEmpty(serverURL) || !isValidUrl(serverURL))
{
throw new ServerURLException(“Server URL is invalid or empty");
}
}
Plan your public API…
Keep it:
Easy to learn
Easy to use (even without docs!!), easy to integrate.
Hard to misused!
Custom exceptions
No confusing constructors - use builder pattern, static
factory pattern etc.
Builder pattern
public class User {
private final String firstName; //required
private final String lastName; //required
private final int age; //optional
private final String phone; //optional
private final String address; //optional
...
}
Builder pattern
public User(String firstName, String lastName) {this(firstName, lastName, 0);}
public User(String firstName, String lastName, int age) {this(firstName, lastName, age, "");}
public User(String firstName, String lastName, int age, String phone) {
this(firstName, lastName, age, phone, "");}
public User(String firstName, String lastName, int age, String phone, String address) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
this.phone = phone;
this.address = address;
}
Builder pattern
public class User {
private final String firstName; // required
private final String lastName; // required
private final int age; // optional
private final String phone; // optional
private final String address; // optional
private User(UserBuilder builder) {
this.firstName = builder.firstName;
this.lastName = builder.lastName;
this.age = builder.age;
this.phone = builder.phone;
this.address = builder.address;
}
public String getFirstName() {
return firstName;}
public String getLastName() {
return lastName;}
public int getAge() {
return age;}
public String getPhone() {
return phone; }
public String getAddress() {
return address; }
Builder pattern
public class User {
private final String firstName; // required
private final String lastName; // required
private final int age; // optional
private final String phone; // optional
private final String address; // optional
private User(UserBuilder builder) {
this.firstName = builder.firstName;
this.lastName = builder.lastName;
this.age = builder.age;
this.phone = builder.phone;
this.address = builder.address;
}
public String getFirstName() {
return firstName;}
public String getLastName() {
return lastName;}
public int getAge() {
return age;}
public String getPhone() {
return phone; }
public String getAddress() {
return address; }
Builder pattern
public static class UserBuilder {
private final String firstName;
private final String lastName;
private int age;
private String phone;
private String address;
public UserBuilder(String firstName,
String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public UserBuilder age(int age) {
this.age = age;
return this;}
public UserBuilder phone(String phone) {
this.phone = phone;
return this;}
public UserBuilder address(String address) {
this.address = address;
return this; }
public User build() {
return new User(this);
}}}
Builder pattern
User.UserBuilder("Jhon", "Doe")
.age(30)
.phone("1234567")
.address("Fake address 1234")
.build();
Plan your public API…
● Keep it:
Easy to learn
Easy to use (even without docs!!), easy to integrate.
Hard to misused!
Custom exceptions
No confusing constructors - use builder pattern, static
factory pattern etc.
Use enums, public static variables when you can.
Plan your public API…
● We don’t choose the min sdk!
we want maximum compatibility
Plan your public API…
● We don’t choose the min sdk!
we want maximum compatibility
● Try to use minimum permissions - it’s hard for the developer
to explain to THEIR users the need for permissions.
Merged Manifest
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.academy.myapp">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category
android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Merged Manifest
https://developer.android.com/studio/build/manifest-merge.html
Plan your public API…
● We don’t choose the min sdk!
we want maximum compatibility
● Try to use minimum permissions - it’s hard for the developer
to explain to THEIR users the need for permissions.
● Think carefully - we REALLY don’t want to change it very
often (if at all!) *adding is OK
Developing SDK check list
❏ Define the service for your SDK users
❏ Plan your public API
❏ Plan your internal code architecture
❏ Code:)
❏ Sample app + docs
❏ Packaging
❏ Ship!
Developing SDK check list
1. Define the service for your SDK users
2. Plan your public API
3. Plan your internal code architecture
4. Code:)
5. Sample app + docs
6. Packaging
7. Ship!
Plan your internal code architecture
● Exception handling - the more the merrier :)
Plan your internal code architecture
● Exception handling - the more the merrier :)
● Use the minimum needed third-party libraries
a. we want to keep our SDK light
b. we avoid depending on others
Plan your internal code architecture
● Exception handling - the more the merrier :)
● Use the minimum needed third-party libraries
a. we want to keep our SDK light
b. we avoid depending on others
● Handle missing permission cases, you are not promised
to have them
Plan your internal code architecture
● Be very mindful to data consumption and battery usage!
Plan your internal code architecture
● Be very mindful to data consumption and battery usage!
● Remember your support phase during development:
○ Deprecate - don’t kill!
○ Write logs but don’t spam, use 2 log levels (debug/production)
Developing SDK check list
❏ Define the service for your SDK users
❏ Plan your public API
❏ Plan your internal code architecture
❏ Code:)
❏ Sample app + docs
❏ Packaging
❏ Ship!
Developing SDK check list
1. Define the service for your SDK users
2. Plan your public API
3. Plan your internal code architecture
4. Code:)
5. Sample app + docs
6. Packaging
7. Ship!
Code..
● Remember resource are public by default - hide what
you need hidden.
public.xml
<resources>
<public name="mylib_app_name" type="string"/>
<public name="mylib_public_string" type="string"/>
</resources>
Code..
● Add unique prefix to resources - the developers may
have their own resources that can conflict with yours!
Code..
● Add unique prefix to resources - the developers may
have their own resources that can conflict with yours!
● Test it on different Kind of apps..
Code..
● Add unique prefix to resources - the developers may
have their own resources that can conflict with yours!
● Test it on different Kind of apps..
● you must take the life cycle of the app in consideration!
Developing SDK check list
❏ Define the service for your SDK users
❏ Plan your public API
❏ Plan your internal code architecture
❏ Code:)
❏ Sample app + docs
❏ Packaging
❏ Ship!
Developing SDK check list
1. Define the service for your SDK users
2. Plan your public API
3. Plan your internal code architecture
4. Code:)
5. Sample app + docs
6. Packaging
7. Ship!
Sample app +docs
Provide 2 kinds of docs:
Simple integration instructions + sample app
Api Overview
Sample app +docs
● Provide 2 kinds of docs:
Simple integration instructions + sample app
Api Overview
• Remember Proguard docs
proguard.config
-keep class javax.** { *; }
-keep class org.** { *; }
-keep class twitter4j.** { *; }
Developing SDK check list
❏ Define the service for your SDK users
❏ Plan your public API
❏ Plan your internal code architecture
❏ Code:)
❏ Sample app + docs
❏ Packaging
❏ Ship!
Developing SDK check list
1. Define the service for your SDK users
2. Plan your public API
3. Plan your internal code architecture
4. Code:)
5. Sample app + docs
6. Packaging
7. Ship!
Packaging
Once we had a jar..
What can we do?
We have AAR!
What does aar contain?
The file extension for an AAR file is .aar, actually the file itself is
a zip file containing the following mandatory entries:
/AndroidManifest.xml
/classes.jar
/res/
/R.txt
/public.txt
There are also optional entries :
/assets/
/libs/name.jar
/proguard.txt
/lint.jar
Migrate from AAR to JAR ..
The file extension for an AAR file is .aar, actually the file itself is
a zip file containing the following mandatory entries:
/AndroidManifest.xml
/classes.jar
/res/
/R.txt
/public.txt
step by step..
https://developer.android.com/studio/projects/android-library.html
Developing SDK check list
❏ Define the service for your SDK users
❏ Plan your public API
❏ Plan your internal code architecture
❏ Code:)
❏ Sample app + docs
❏ Packaging
❏ Ship!
Developing SDK check list
❏ Define the service for your SDK users
❏ Plan your public API
❏ Plan your internal code architecture
❏ Code:)
❏ Sample app + docs
❏ Packaging
❏ Ship!
Battery Historian
• Battery Historian is a tool to analyze battery consumers
and events(DOZE mode).
Battery Historian
• Battery Historian is a tool to analyze battery consumers
and events(DOZE mode).
• It uses Android "bugreport" files
Battery Historian
• Battery Historian is a tool to analyze battery consumers
and events(DOZE mode).
• It uses Android "bugreport" files
• Supports Lollipop (API level 21) and later.
Battery Historian
• Battery Historian is a tool to analyze battery consumers
and events(DOZE mode).
• It uses Android "bugreport" files
• Supports Lollipop (API level 21) and later.
• Shows you where and how processes are drawing current
from the battery.
How to build Sdk? Best practices
Battery Historian
• https://developer.android.com/studio/profile/battery-historian.html
• https://github.com/google/battery-historian
Stetho
• Stetho is a very powerful tool for debugging.
• It enables developers have access to the Chrome
Developer Tools feature
http://facebook.github.io/stetho/
Stetho
Questions?

More Related Content

What's hot (20)

PPTX
Node js
Fatih Şimşek
 
PDF
What Is React | ReactJS Tutorial for Beginners | ReactJS Training | Edureka
Edureka!
 
PDF
Testing Angular
Lilia Sfaxi
 
PDF
Cypress vs Selenium WebDriver: Better, Or Just Different? -- by Gil Tayar
Applitools
 
PDF
Test Driven Development (TDD)
David Ehringer
 
PDF
What is Scrum? Edureka
Edureka!
 
PPTX
Real-time ASP.NET with SignalR
Alexander Konduforov
 
PPTX
Api types
Sarah Maddox
 
PPTX
Rxjs ppt
Christoffer Noring
 
PDF
CI CD Pipeline Using Jenkins | Continuous Integration and Deployment | DevOps...
Edureka!
 
PDF
Web automation using selenium.ppt
Ana Sarbescu
 
PDF
Postman Webinar: “Continuous Testing with Postman”
Postman
 
PPTX
Agile
Abhinav Regmi
 
PDF
Rundeck Overview
Rundeck
 
PDF
GraphQL
Joel Corrêa
 
PDF
Bridging the Security Testing Gap in Your CI/CD Pipeline
DevOps.com
 
PPTX
Automation test framework with cucumber – BDD
123abcda
 
PDF
Agile & SCRUM basics
Arun R
 
What Is React | ReactJS Tutorial for Beginners | ReactJS Training | Edureka
Edureka!
 
Testing Angular
Lilia Sfaxi
 
Cypress vs Selenium WebDriver: Better, Or Just Different? -- by Gil Tayar
Applitools
 
Test Driven Development (TDD)
David Ehringer
 
What is Scrum? Edureka
Edureka!
 
Real-time ASP.NET with SignalR
Alexander Konduforov
 
Api types
Sarah Maddox
 
CI CD Pipeline Using Jenkins | Continuous Integration and Deployment | DevOps...
Edureka!
 
Web automation using selenium.ppt
Ana Sarbescu
 
Postman Webinar: “Continuous Testing with Postman”
Postman
 
Rundeck Overview
Rundeck
 
GraphQL
Joel Corrêa
 
Bridging the Security Testing Gap in Your CI/CD Pipeline
DevOps.com
 
Automation test framework with cucumber – BDD
123abcda
 
Agile & SCRUM basics
Arun R
 

Similar to How to build Sdk? Best practices (20)

PPTX
API workshop: Introduction to APIs (TC Camp)
Tom Johnson
 
PDF
Build Great Networked APIs with Swift, OpenAPI, and gRPC
Tim Burks
 
PPTX
Getting started with the NDK
Kirill Kounik
 
PDF
Practices and tools for building better API (JFall 2013)
Peter Hendriks
 
PDF
Practices and tools for building better APIs
NLJUG
 
PPTX
Programming
mafffffe19
 
PPTX
Survival Strategies for API Documentation: Presentation to Southwestern Ontar...
Tom Johnson
 
PDF
Best Practices in apps development with Titanium Appcelerator
Alessio Ricco
 
PDF
BEST PRACTICES PER LA SCRITTURA DI APPLICAZIONI TITANIUM APPCELERATOR - Aless...
Whymca
 
KEY
Android Scripting
Juan Gomez
 
PPTX
Android Auto instrumentation
Przemek Jakubczyk
 
PPTX
Kubernetes and Local Dvelopment
Jeffrey Sica
 
PDF
Parse cloud code
維佋 唐
 
PDF
Android develop guideline
Kan-Han (John) Lu
 
PDF
Voxxed days Vilnius 2015 - Android Reverse Engineering Lab
Ron Munitz
 
PDF
Vibe Coding_ Develop a web application using AI (1).pdf
Baiju Muthukadan
 
PDF
Modern Release Engineering in a Nutshell - Why Researchers should Care!
Bram Adams
 
PPT
Code Documentation. That ugly thing...
Christos Manios
 
PDF
AstroLabs_Academy_Learning_to_Code-Coding_Bootcamp_Day1.pdf
FarHanWasif1
 
KEY
Development workflow
Sigsiu.NET
 
API workshop: Introduction to APIs (TC Camp)
Tom Johnson
 
Build Great Networked APIs with Swift, OpenAPI, and gRPC
Tim Burks
 
Getting started with the NDK
Kirill Kounik
 
Practices and tools for building better API (JFall 2013)
Peter Hendriks
 
Practices and tools for building better APIs
NLJUG
 
Programming
mafffffe19
 
Survival Strategies for API Documentation: Presentation to Southwestern Ontar...
Tom Johnson
 
Best Practices in apps development with Titanium Appcelerator
Alessio Ricco
 
BEST PRACTICES PER LA SCRITTURA DI APPLICAZIONI TITANIUM APPCELERATOR - Aless...
Whymca
 
Android Scripting
Juan Gomez
 
Android Auto instrumentation
Przemek Jakubczyk
 
Kubernetes and Local Dvelopment
Jeffrey Sica
 
Parse cloud code
維佋 唐
 
Android develop guideline
Kan-Han (John) Lu
 
Voxxed days Vilnius 2015 - Android Reverse Engineering Lab
Ron Munitz
 
Vibe Coding_ Develop a web application using AI (1).pdf
Baiju Muthukadan
 
Modern Release Engineering in a Nutshell - Why Researchers should Care!
Bram Adams
 
Code Documentation. That ugly thing...
Christos Manios
 
AstroLabs_Academy_Learning_to_Code-Coding_Bootcamp_Day1.pdf
FarHanWasif1
 
Development workflow
Sigsiu.NET
 
Ad

More from Vitali Pekelis (20)

PDF
Droidkaigi2019thagikura 190208135940
Vitali Pekelis
 
PDF
Droidkaigi 2019
Vitali Pekelis
 
PPTX
Google i o &amp; android q changes 2019
Vitali Pekelis
 
PPTX
Android Q 2019
Vitali Pekelis
 
PPTX
Advanced #6 clean architecture
Vitali Pekelis
 
PPTX
Advanced #4 GPU & Animations
Vitali Pekelis
 
PDF
Advanced #2 networking
Vitali Pekelis
 
PPTX
Advanced #2 threading
Vitali Pekelis
 
PPTX
Advanced #1 cpu, memory
Vitali Pekelis
 
PPTX
All the support you need. Support libs in Android
Vitali Pekelis
 
PPTX
Di &amp; dagger
Vitali Pekelis
 
PPTX
Android design patterns
Vitali Pekelis
 
PPTX
Advanced #3 threading
Vitali Pekelis
 
PPTX
Mobile ui fruit or delicious sweets
Vitali Pekelis
 
PPTX
Lecture #4 c loaders and co.
Vitali Pekelis
 
PPTX
Session #4 b content providers
Vitali Pekelis
 
PPTX
Advanced #2 - ui perf
Vitali Pekelis
 
PDF
Android meetup
Vitali Pekelis
 
PPTX
Android design lecture #3
Vitali Pekelis
 
PPTX
From newbie to ...
Vitali Pekelis
 
Droidkaigi2019thagikura 190208135940
Vitali Pekelis
 
Droidkaigi 2019
Vitali Pekelis
 
Google i o &amp; android q changes 2019
Vitali Pekelis
 
Android Q 2019
Vitali Pekelis
 
Advanced #6 clean architecture
Vitali Pekelis
 
Advanced #4 GPU & Animations
Vitali Pekelis
 
Advanced #2 networking
Vitali Pekelis
 
Advanced #2 threading
Vitali Pekelis
 
Advanced #1 cpu, memory
Vitali Pekelis
 
All the support you need. Support libs in Android
Vitali Pekelis
 
Di &amp; dagger
Vitali Pekelis
 
Android design patterns
Vitali Pekelis
 
Advanced #3 threading
Vitali Pekelis
 
Mobile ui fruit or delicious sweets
Vitali Pekelis
 
Lecture #4 c loaders and co.
Vitali Pekelis
 
Session #4 b content providers
Vitali Pekelis
 
Advanced #2 - ui perf
Vitali Pekelis
 
Android meetup
Vitali Pekelis
 
Android design lecture #3
Vitali Pekelis
 
From newbie to ...
Vitali Pekelis
 
Ad

Recently uploaded (20)

PDF
Automate Cybersecurity Tasks with Python
VICTOR MAESTRE RAMIREZ
 
PPTX
Finding Your License Details in IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
PPTX
Hardware(Central Processing Unit ) CU and ALU
RizwanaKalsoom2
 
PDF
Alexander Marshalov - How to use AI Assistants with your Monitoring system Q2...
VictoriaMetrics
 
PDF
Build It, Buy It, or Already Got It? Make Smarter Martech Decisions
bbedford2
 
PDF
Digger Solo: Semantic search and maps for your local files
seanpedersen96
 
PPTX
In From the Cold: Open Source as Part of Mainstream Software Asset Management
Shane Coughlan
 
PPTX
Foundations of Marketo Engage - Powering Campaigns with Marketo Personalization
bbedford2
 
PDF
IDM Crack with Internet Download Manager 6.42 Build 43 with Patch Latest 2025
bashirkhan333g
 
PPTX
Agentic Automation: Build & Deploy Your First UiPath Agent
klpathrudu
 
PPTX
Change Common Properties in IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
PDF
SAP Firmaya İade ABAB Kodları - ABAB ile yazılmıl hazır kod örneği
Salih Küçük
 
PDF
Generic or Specific? Making sensible software design decisions
Bert Jan Schrijver
 
PDF
유니티에서 Burst Compiler+ThreadedJobs+SIMD 적용사례
Seongdae Kim
 
PDF
4K Video Downloader Plus Pro Crack for MacOS New Download 2025
bashirkhan333g
 
PDF
Linux Certificate of Completion - LabEx Certificate
VICTOR MAESTRE RAMIREZ
 
PDF
Download Canva Pro 2025 PC Crack Full Latest Version
bashirkhan333g
 
PDF
SciPy 2025 - Packaging a Scientific Python Project
Henry Schreiner
 
PDF
Empower Your Tech Vision- Why Businesses Prefer to Hire Remote Developers fro...
logixshapers59
 
PPTX
Agentic Automation Journey Session 1/5: Context Grounding and Autopilot for E...
klpathrudu
 
Automate Cybersecurity Tasks with Python
VICTOR MAESTRE RAMIREZ
 
Finding Your License Details in IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
Hardware(Central Processing Unit ) CU and ALU
RizwanaKalsoom2
 
Alexander Marshalov - How to use AI Assistants with your Monitoring system Q2...
VictoriaMetrics
 
Build It, Buy It, or Already Got It? Make Smarter Martech Decisions
bbedford2
 
Digger Solo: Semantic search and maps for your local files
seanpedersen96
 
In From the Cold: Open Source as Part of Mainstream Software Asset Management
Shane Coughlan
 
Foundations of Marketo Engage - Powering Campaigns with Marketo Personalization
bbedford2
 
IDM Crack with Internet Download Manager 6.42 Build 43 with Patch Latest 2025
bashirkhan333g
 
Agentic Automation: Build & Deploy Your First UiPath Agent
klpathrudu
 
Change Common Properties in IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
SAP Firmaya İade ABAB Kodları - ABAB ile yazılmıl hazır kod örneği
Salih Küçük
 
Generic or Specific? Making sensible software design decisions
Bert Jan Schrijver
 
유니티에서 Burst Compiler+ThreadedJobs+SIMD 적용사례
Seongdae Kim
 
4K Video Downloader Plus Pro Crack for MacOS New Download 2025
bashirkhan333g
 
Linux Certificate of Completion - LabEx Certificate
VICTOR MAESTRE RAMIREZ
 
Download Canva Pro 2025 PC Crack Full Latest Version
bashirkhan333g
 
SciPy 2025 - Packaging a Scientific Python Project
Henry Schreiner
 
Empower Your Tech Vision- Why Businesses Prefer to Hire Remote Developers fro...
logixshapers59
 
Agentic Automation Journey Session 1/5: Context Grounding and Autopilot for E...
klpathrudu
 

How to build Sdk? Best practices

  • 1. SDK best practices Rebecca Hamelsdorf 13/9/2017
  • 5. what is SDK? • SDK is a software development kit • It’s a programing package that helps developers to builds application for a specific platform. • Typically it includes one or more API
  • 7. Why do we need to develop an SDK? Business need
  • 8. Why do we need to develop an SDK? But not for business reasons..
  • 9. Why do we need to develop an SDK? Business need Internal use
  • 11. Why do we care about code reuse ● Saves time & money
  • 12. Why do we care about code reuse ● Saves time & money ● Easier to maintain and change
  • 13. Why do we care about code reuse ● Saves time & money ● Easier to maintain and change ● Solving bugs in a single place instead of bugs all over the place
  • 14. Developing SDK check list 1. Define the service for your SDK users 2. Plan your public API 3. Plan your internal code architecture 4. Code:) 5. Sample app + docs 6. Packaging 7. Ship!
  • 15. Developing SDK check list ❏ Define the service for your SDK users ❏ Plan your public API ❏ Plan your internal code architecture ❏ Code:) ❏ Sample app + docs ❏ Packaging ❏ Ship!
  • 16. Developing SDK check list 1. Define the service for your SDK users 2. Plan your public API 3. Plan your internal code architecture 4. Code:) 5. Sample app + docs 6. Packaging 7. Ship!
  • 17. Plan your public API… Public API is the contract between the app developer and SDK developer. you’re officially an API designer!
  • 18. Plan your public API… Put in your mind that the developer that integrate your sdk is not sitting next to you..
  • 19. Plan your public API… Keep it: Easy to learn- design for “stupid” developers
  • 20. Plan your public API… Keep it: Easy to learn Easy to use (even without docs!!), easy to integrate.
  • 21. Someone did it really easy..
  • 22. Plan your public API… Keep it: Easy to learn Easy to use (even without docs!!), easy to integrate. Hard to misused!
  • 23. Plan your public API… Keep it: Easy to learn Easy to use (even without docs!!), easy to integrate. Hard to misused! Custom exceptions
  • 24. Custom Exception class ServerURLException extends RuntimeException { public ServerURLException(String message) { super(message); } }
  • 25. Custom Exception class ServerURLException extends RuntimeException { public ServerURLException(String message) { super(message); } } static void isUrlValid(String serverURL) { if( isNullOrEmpty(serverURL) || !isValidUrl(serverURL)) { throw new ServerURLException(“Server URL is invalid or empty"); } }
  • 26. Plan your public API… Keep it: Easy to learn Easy to use (even without docs!!), easy to integrate. Hard to misused! Custom exceptions No confusing constructors - use builder pattern, static factory pattern etc.
  • 27. Builder pattern public class User { private final String firstName; //required private final String lastName; //required private final int age; //optional private final String phone; //optional private final String address; //optional ... }
  • 28. Builder pattern public User(String firstName, String lastName) {this(firstName, lastName, 0);} public User(String firstName, String lastName, int age) {this(firstName, lastName, age, "");} public User(String firstName, String lastName, int age, String phone) { this(firstName, lastName, age, phone, "");} public User(String firstName, String lastName, int age, String phone, String address) { this.firstName = firstName; this.lastName = lastName; this.age = age; this.phone = phone; this.address = address; }
  • 29. Builder pattern public class User { private final String firstName; // required private final String lastName; // required private final int age; // optional private final String phone; // optional private final String address; // optional private User(UserBuilder builder) { this.firstName = builder.firstName; this.lastName = builder.lastName; this.age = builder.age; this.phone = builder.phone; this.address = builder.address; } public String getFirstName() { return firstName;} public String getLastName() { return lastName;} public int getAge() { return age;} public String getPhone() { return phone; } public String getAddress() { return address; }
  • 30. Builder pattern public class User { private final String firstName; // required private final String lastName; // required private final int age; // optional private final String phone; // optional private final String address; // optional private User(UserBuilder builder) { this.firstName = builder.firstName; this.lastName = builder.lastName; this.age = builder.age; this.phone = builder.phone; this.address = builder.address; } public String getFirstName() { return firstName;} public String getLastName() { return lastName;} public int getAge() { return age;} public String getPhone() { return phone; } public String getAddress() { return address; }
  • 31. Builder pattern public static class UserBuilder { private final String firstName; private final String lastName; private int age; private String phone; private String address; public UserBuilder(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public UserBuilder age(int age) { this.age = age; return this;} public UserBuilder phone(String phone) { this.phone = phone; return this;} public UserBuilder address(String address) { this.address = address; return this; } public User build() { return new User(this); }}}
  • 33. Plan your public API… ● Keep it: Easy to learn Easy to use (even without docs!!), easy to integrate. Hard to misused! Custom exceptions No confusing constructors - use builder pattern, static factory pattern etc. Use enums, public static variables when you can.
  • 34. Plan your public API… ● We don’t choose the min sdk! we want maximum compatibility
  • 35. Plan your public API… ● We don’t choose the min sdk! we want maximum compatibility ● Try to use minimum permissions - it’s hard for the developer to explain to THEIR users the need for permissions.
  • 36. Merged Manifest <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.academy.myapp"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
  • 38. Plan your public API… ● We don’t choose the min sdk! we want maximum compatibility ● Try to use minimum permissions - it’s hard for the developer to explain to THEIR users the need for permissions. ● Think carefully - we REALLY don’t want to change it very often (if at all!) *adding is OK
  • 39. Developing SDK check list ❏ Define the service for your SDK users ❏ Plan your public API ❏ Plan your internal code architecture ❏ Code:) ❏ Sample app + docs ❏ Packaging ❏ Ship!
  • 40. Developing SDK check list 1. Define the service for your SDK users 2. Plan your public API 3. Plan your internal code architecture 4. Code:) 5. Sample app + docs 6. Packaging 7. Ship!
  • 41. Plan your internal code architecture ● Exception handling - the more the merrier :)
  • 42. Plan your internal code architecture ● Exception handling - the more the merrier :) ● Use the minimum needed third-party libraries a. we want to keep our SDK light b. we avoid depending on others
  • 43. Plan your internal code architecture ● Exception handling - the more the merrier :) ● Use the minimum needed third-party libraries a. we want to keep our SDK light b. we avoid depending on others ● Handle missing permission cases, you are not promised to have them
  • 44. Plan your internal code architecture ● Be very mindful to data consumption and battery usage!
  • 45. Plan your internal code architecture ● Be very mindful to data consumption and battery usage! ● Remember your support phase during development: ○ Deprecate - don’t kill! ○ Write logs but don’t spam, use 2 log levels (debug/production)
  • 46. Developing SDK check list ❏ Define the service for your SDK users ❏ Plan your public API ❏ Plan your internal code architecture ❏ Code:) ❏ Sample app + docs ❏ Packaging ❏ Ship!
  • 47. Developing SDK check list 1. Define the service for your SDK users 2. Plan your public API 3. Plan your internal code architecture 4. Code:) 5. Sample app + docs 6. Packaging 7. Ship!
  • 48. Code.. ● Remember resource are public by default - hide what you need hidden.
  • 49. public.xml <resources> <public name="mylib_app_name" type="string"/> <public name="mylib_public_string" type="string"/> </resources>
  • 50. Code.. ● Add unique prefix to resources - the developers may have their own resources that can conflict with yours!
  • 51. Code.. ● Add unique prefix to resources - the developers may have their own resources that can conflict with yours! ● Test it on different Kind of apps..
  • 52. Code.. ● Add unique prefix to resources - the developers may have their own resources that can conflict with yours! ● Test it on different Kind of apps.. ● you must take the life cycle of the app in consideration!
  • 53. Developing SDK check list ❏ Define the service for your SDK users ❏ Plan your public API ❏ Plan your internal code architecture ❏ Code:) ❏ Sample app + docs ❏ Packaging ❏ Ship!
  • 54. Developing SDK check list 1. Define the service for your SDK users 2. Plan your public API 3. Plan your internal code architecture 4. Code:) 5. Sample app + docs 6. Packaging 7. Ship!
  • 55. Sample app +docs Provide 2 kinds of docs: Simple integration instructions + sample app Api Overview
  • 56. Sample app +docs ● Provide 2 kinds of docs: Simple integration instructions + sample app Api Overview • Remember Proguard docs
  • 57. proguard.config -keep class javax.** { *; } -keep class org.** { *; } -keep class twitter4j.** { *; }
  • 58. Developing SDK check list ❏ Define the service for your SDK users ❏ Plan your public API ❏ Plan your internal code architecture ❏ Code:) ❏ Sample app + docs ❏ Packaging ❏ Ship!
  • 59. Developing SDK check list 1. Define the service for your SDK users 2. Plan your public API 3. Plan your internal code architecture 4. Code:) 5. Sample app + docs 6. Packaging 7. Ship!
  • 61. What can we do? We have AAR!
  • 62. What does aar contain? The file extension for an AAR file is .aar, actually the file itself is a zip file containing the following mandatory entries: /AndroidManifest.xml /classes.jar /res/ /R.txt /public.txt There are also optional entries : /assets/ /libs/name.jar /proguard.txt /lint.jar
  • 63. Migrate from AAR to JAR .. The file extension for an AAR file is .aar, actually the file itself is a zip file containing the following mandatory entries: /AndroidManifest.xml /classes.jar /res/ /R.txt /public.txt
  • 65. Developing SDK check list ❏ Define the service for your SDK users ❏ Plan your public API ❏ Plan your internal code architecture ❏ Code:) ❏ Sample app + docs ❏ Packaging ❏ Ship!
  • 66. Developing SDK check list ❏ Define the service for your SDK users ❏ Plan your public API ❏ Plan your internal code architecture ❏ Code:) ❏ Sample app + docs ❏ Packaging ❏ Ship!
  • 67. Battery Historian • Battery Historian is a tool to analyze battery consumers and events(DOZE mode).
  • 68. Battery Historian • Battery Historian is a tool to analyze battery consumers and events(DOZE mode). • It uses Android "bugreport" files
  • 69. Battery Historian • Battery Historian is a tool to analyze battery consumers and events(DOZE mode). • It uses Android "bugreport" files • Supports Lollipop (API level 21) and later.
  • 70. Battery Historian • Battery Historian is a tool to analyze battery consumers and events(DOZE mode). • It uses Android "bugreport" files • Supports Lollipop (API level 21) and later. • Shows you where and how processes are drawing current from the battery.
  • 72. Battery Historian • https://developer.android.com/studio/profile/battery-historian.html • https://github.com/google/battery-historian
  • 73. Stetho • Stetho is a very powerful tool for debugging. • It enables developers have access to the Chrome Developer Tools feature http://facebook.github.io/stetho/