Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
10-ish Things about Android Library Development
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Zan Markan
May 09, 2017
Programming
140
0
Share
10-ish Things about Android Library Development
Talk given at Droidcon London Bytes meetup
Zan Markan
May 09, 2017
More Decks by Zan Markan
See All by Zan Markan
High-Performing Engineering Teams and the Holy Grail
zmarkan
0
110
A Practical Introduction to CI/CD
zmarkan
0
49
The Need for Speed - Practical Tips for Optimising your CI/CD Pipeline
zmarkan
0
84
Chat app with React, Auth0, and Pusher Chatkit
zmarkan
0
400
State of Kotlin - Droidcon NYC
zmarkan
1
110
State of Kotlin - Droidcon Berlin 2018
zmarkan
1
180
Building DSLs in Kotlin for Fun and Profit
zmarkan
2
600
Push Notifications That Don't Suck
zmarkan
3
460
The State of Kotlin
zmarkan
0
210
Other Decks in Programming
See All in Programming
AI駆動開発勉強会 広島支部 第一回勉強会 AI駆動開発概要とワークショップ
hayatoshimiu
0
430
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
2.3k
ユニットテストの先へ:テスト技法で要求・仕様を整理するJava開発実践 / Beyond_Unit_Testing_Practical_Java_Development_Techniques_for_Organizing_Requirements_and_Specifications
shimashima35
0
340
「エンジニアインターン、どうやって取った?」準備のリアルを語るLT会 Progate BAR
akiomatic
0
120
気づいたらRubyで100作品 ー クリエイティブコーディングが生活の一部になるまで / 100 Ruby Sketches Later: How Creative Coding Became Part of My Life
chobishiba
3
530
プラグインで拡張される Context をtype-safe にする難しさと設計判断
kazupon
2
560
Oxcを導入して開発体験が向上した話
yug1224
4
280
net-httpのHTTP/2対応について
naruse
0
430
GitHub Copilot CLIのいいところ
htkym
2
1.2k
関係性から理解する"同一性"の型用語たち
pvcresin
2
630
RTSPクライアントを自作してみた話
simotin13
0
440
TypeSpec で繋ぐ複数プロダクトの型安全
maroon8021
1
340
Featured
See All Featured
Between Models and Reality
mayunak
4
320
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
270
The browser strikes back
jonoalderson
0
1.1k
Ethics towards AI in product and experience design
skipperchong
2
300
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
300
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
61
44k
Optimizing for Happiness
mojombo
378
71k
WENDY [Excerpt]
tessaabrams
11
38k
GitHub's CSS Performance
jonrohan
1033
470k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
62
54k
Statistics for Hackers
jakevdp
799
230k
Transcript
@zmarkan Zan Markan @zmarkan LIBRARY DEVELOPMENT 10-ish things about Android
@zmarkan @zmarkan Developer tools company blog.pusher.com Chat API Hiring in
Shoreditch Trusted by 150k+ devs pusher.com | @pusher
@zmarkan Contents of this talk • Libs 101 • API
Design • Development & Testing • Releasing • Docs ...and more!
@zmarkan We libs because... Avoid duplicating logic - Best Practice
Sharing == Caring It’s a great way to enrich your We want to be paid
@zmarkan Libraries are a collection of classes and methods that
encapsulate common, shared functionality.
@zmarkan Libs != Apps Libraries are NOT end products Smaller,
more lightweight than apps Many x Many apps/lib ratio
@zmarkan All about that Lib... What: Libraries, Frameworks, SDKs Type:
General libs, UI Widgets, Serverside, Testing Access: Publicly vs Privately accessible Pricing: FOSS, Free to use vs Commercial API: DSL, Reactive, n other things...
@zmarkan Product is about the User • Developers (like you
and I) • Varied backgrounds, levels of experience • User experience -> Developer experience
@zmarkan the truth about developers Library users are Developers… …
developers are very lazy, so... libraries should enable laziness.
@zmarkan API
@zmarkan The API is to a library what the USER
INTERFACE is to an APP
@zmarkan Things I mean by API Entry points Interaction points
Data model Errors & Exceptions
@zmarkan Entry points (where people first interact with your code)
They allow you to instantiate and configure the library In “Code”: Constructors, Builders, Factories In UI: Widgets
@zmarkan Builder Poor person’s named args … and optional args
Ensures constructor is passed correct values, and validates its state before building the class
@zmarkan Building the - Static inner class - … called
Builder - setters mutate its state, returning this - build() constructs the main object - build() validates the view state AS SEEN IN RETROFIT
@zmarkan Methods & Models When in doubt - go S.O.L.I.D.
Naming, Naming, Naming! Don’t surprise your users! (But you can delight them)
@zmarkan (R)X-Factor Aysnc as a stream of events Allows chaining,
and functional operations Support all the things: RxSwift, RxJava (even PHP!) More: Paco Estevez makes AWESOME Rx libs/articles/talks
@zmarkan RX in brief observable .filter(//condition) .flatMap(//transformation) .subscribe(//handleSuccess, //handleError) Not
shown: one million operators, threading, ...
@zmarkan RX… but It’s still a power user feature Callbacks
are still often preferred provide RX adapter as an optional extra?
@zmarkan for the λ Consider functional interfaces ...they can be
replaced with lambdas easily Used with Retrolambda, Kotlin, Java 8 Power users tend to like them. Be nice to your power users.
@zmarkan @nnotations Add validation features - NotNull, Nullable Value types
- AutoValue, AutoParcel Build Annotations to write code for you Use Square/JavaPoet More: Jason Feinstein’s talk from CodeMotion Tel Aviv 2016
@zmarkan DSL-o-Matic 9000 Make your own little programming language… ...by
inventing a syntax that works for you! Examples: Hamcrest, Rx, Kotlin Anko Techniques: Annotations, Operator overloading, Extension methods, ...
@zmarkan When things go • Let it crash! • Early
• Often Ensure the error messaging is spot on Add links in error messages to explanations
@zmarkan Anatomy of a “nice” Error Type: Illegal Input Message:
Request unsuccessful, reason: malformed auth token Link: https://example.com/errors/123456 Explain things here!
@zmarkan DEV & TEST
@zmarkan Performance or Be wary of: • Library size =>
App size • Memory leaks • Build times • Needless dependencies
@zmarkan ...my lib ain’t one! - Avoid private fields in
parent classes - Prefer anonymous inner classes to lambdas - Avoid needless dependencies (again) - Proguard rules More: Jake Wharton’s talk from 360AnDev I got 65k problems, but...
@zmarkan API should be beautiful. Implementation should f*****g work.
@zmarkan Testing it & Loving it The easy: Unit Tests
The hard: Integration Tests with an app The smart: fooding More in: David Schreiber-Ranner’s talk from Droidcon Vienna 2016
@zmarkan Tracking & Analysis Problem: No Google Analytics for libraries
Track at the service level? Listen and talk to users fooding: Redux unless you’re Fabric
@zmarkan
@zmarkan (Semantic) Versioning 2.0 Major[.]Minor[.]Patch • Major: Breaking changes •
Minor: New features • Patch: Hotfixes Shouldn’t ever happen • semver.org
@zmarkan Releasing (how not to do it) • Manually include
the JAR/AAR in your project (Bad idea in most cases) • Include project as a Git submodule (Even worse idea in all cases)
@zmarkan Releasing (the right way) Maven Central JCenter Jitpack Artifactory
Maven dir on S3 Managed services free for OSS More DIY just add server
@zmarkan DOCS
@zmarkan 50 shades of Docs • Quick Start • Sample
apps • JavaDoc • Wiki pages • Yes, even tests! • Mix & Match!
@zmarkan Quickstart a.k.a. “Let me copypaste something”
@zmarkan Sample code • Should be small, confined apps •
… often alongside libraries in the same repo • Should reflect your libraries’ features • Can go in-depth for more advanced features
@zmarkan JavaDoc • Cheap to make • Automagically generated •
(Just add comments!) • Great in Android Studio • Host it alongside your other docs
@zmarkan Libraries enable app developers to be lazy. Docs enable
library developers to be lazy.
@zmarkan The takeaways Libs 101 API design Development Releasing Support
@zmarkan @zmarkan fin Blog: www.spacecowboyrocketcompany.com Twitter: @zmarkan Github: @zmarkan Email:
zan@[pusher.com | markan.me]