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
Building the Fabric SDKs - #MBLTDev (30 min)
Search
Ty Smith
October 28, 2014
Programming
220
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Building the Fabric SDKs - #MBLTDev (30 min)
Ty Smith
October 28, 2014
More Decks by Ty Smith
See All by Ty Smith
Balancing Speed and Reliability: The Double-Edged Sword of Third-Party Libraries
tysmith
1
130
Mobile Developer Productivity at Uber Scale [Droidcon NYC 2022]
tysmith
6
2.4k
Building for Developers - Droidcon Italy 2019
tysmith
1
310
Tools of the Trade #DCNYC18
tysmith
5
300
ADDC 2018 - Ty Smith: Building for Developers
tysmith
2
190
Deep Android Integrations
tysmith
4
1.5k
Better Android Development with Kotlin and Gradle
tysmith
10
1.2k
Better Android Development with Kotlin and Gradle
tysmith
9
1.7k
App To Ap: Designing Local APIs On Android
tysmith
1
310
Other Decks in Programming
See All in Programming
仕様駆動開発へのトライを機に チームに適合する手法を模索し続けている話
freee
PRO
0
590
いまどきの Codex で開発する visionOS アプリの開発スタイルについて
karad
0
150
運用ダッシュボードの設計を誰も教えてくれないのだけどみなさんどうしてるんですか? - チームに監視するという文化を根付かせるための第一歩を踏みたい -
satoshi256kbyte
1
140
今さら聞けない .NET CLI
htkym
0
200
KotlinConf Extended South Korea 2026 Keynote
l2hyunwoo
0
120
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
280
How I Won Prize Money at a Hackathon Using Codex and Symphony Alpha
yasei_no_otoko
0
120
「人を評価する AI」の設計と実装
ryoyanara
0
220
属人化した知識を、 AIが辿れる地図にする
pkshadeck
PRO
1
200
freeeにおけるEvalsの実践例の紹介
freee
PRO
0
130
「寝てても仕事が進む」Claude Codeで組む第二の脳
tomoyafujita2016
0
350
夏だ!祭りだ!祭りとはドメインモデリングでは?
ryugen04
0
350
Featured
See All Featured
What's in a price? How to price your products and services
michaelherold
247
13k
GitHub's CSS Performance
jonrohan
1033
470k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
180
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
250
Become a Pro
speakerdeck
PRO
31
6.2k
Paper Plane (Part 1)
katiecoart
PRO
1
10k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
210
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.8k
Leo the Paperboy
mayatellez
8
2.2k
Automating Front-end Workflow
addyosmani
1369
210k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Transcript
dev.twitter.com @tsmith Building the Fabric SDKs Ty Smith Sr. Android
Engineer
None
None
None
None
Fabric Sample App Cannonball Open source for iOS & Android:
github.com/twitterdev
Powerful Lightweight
Powerful
Ease of Integration
Ease of Integration Fabric.with(this, new Crashlytics());
Extensible
Extensible Crashlytics.start(this);
Extensible Crashlytics.start(this, 5); Crashlytics.setListener(createCrashlyticsListener()); Crashlytics.setPinningInfo(createPinningInfoProvider()) Crashlytics.getInstance().setDebugMode(true);
Extensible Crashlytics.setListener(createCrashlyticsListener()); Crashlytics.setPinningInfo(createPinningInfoProvider()); Crashlytics.getInstance().setDebugMode(true); Crashlytics.start(this, 5);
Extensible Crashlytics.start(this, delay, listener, pinningInfo, debugMode);
Extensible Crashlytics.start(this, 0, null, null, null, true);
Fluent Pattern Crashlytics crashlytics = new Crashlytics.Builder() .delay(1) .listener(createCrashlyticsListener()) .pinningInfo(createPinningInfoProvider())
.build(); Fabric.with(this, crashlytics);
Fluent Pattern Fabric.with(new Fabric.Builder(this) .kits(new Crashlytics()) .debuggable(true) .logger(new DefaultLogger(Log.VERBOSE)) .looper(getCustomLooper())
.executor(getCustomExecutorService()) .build());
Extensible Classes class MyApiClient extends TwitterApiClient { interface MyService {
@GET(“/1.1/statuses/show.json”) Tweet getTweet(@Query(“id”) int id); } MyService getMyService() { return getService(MyService.class); } }
Gracefully Degrade
Gracefully Degrade if (TextUtils.isEmpty(apiKey) if (debuggable){ throw new IllegalArgumentException( “apiKey
is null!"); } else { return null; } }
Minimizing Permissions
Minimizing Permissions <uses-permission android:name="android.permission.INTERNET"/>
Minimizing Permissions Crashlytics.setUserEmail(“
[email protected]
”);
Permissions: Runtime Detection protected boolean canCheckNetworkState() { String permission =
Manifest.permission.ACCESS_NETWORK_STATE; int result = context.checkCallingOrSelfPermission(permission); return (result == PackageManager.PERMISSION_GRANTED); }
Multiple Application Types
Multiple Application Types package com.example; import android.app.Service; public class MyService
extends Service { }
UI from Application Context WeakReference<Activity> currentActivity = new WeakReference<Activity>(); @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
void registerLifecycleCallbacks() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) { final Application app = ((Application)context); app.registerActivityLifecycleCallbacks( new ActivityLifecycleCallbacks() { @Override public void onActivityResumed(Activity activity) { currentActivity.set(activity); } }); } }
Powerful SDKs Ease of Integration Extensibility Support all app types
Permission detection
Lightweight
Binary Size
Binary Size
3rd Party Library Mindfulness
3rd Party Library Mindfulness
How big are Fabric AARs? Fabric: 190kb Crashlytics: 90kb Beta:
13kb Answers: 20kb Twitter API & SSO: 296kb Tweet UI: 120kb Tweet Composer: 5kb Digits: 236kb
3rd Party Library Mindfulness PROTOBUF KB OURS KB
Dalvik Method Count
Dalvik Method Count >./gradlew assemble … Unable to execute dex:
method ID not in [0, 0xffff]: 65536 Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536
Dalvik Method Count > git clone
[email protected]
:mihaip/dex-method-counts.git > cd dex-method-counts
> ant jar > ./dex-method-counts path/to/App.apk Read in 65490 method IDs. <root>: 65490 : 3 accessibilityservice: 6 bluetooth: 2 content: 248 pm: 22 res: 45 ... com: 53881 adjust: 283 sdk: 283
Minimize Network Usage
Network Usage 10X SMALLER 100X FASTER XML PROTOBUF
Reduce Startup Time
Startup Time Thread.start(); Executors.newSingleThreadExecutor();
Startup Time class MyThreadFactory implements ThreadFactory { @Override public Thread
newThread(Runnable runnable) { final Thread thread = new Thread(runnable); thread.setPriority(Process.THREAD_PRIORITY_BACKGROUND); return thread; } }
Lightweight SDKs Binary size 3rd party library mindfulness Dalvik Method
Count Network usage Startup time
Lightweight Powerful
Questions? dev.twitter.com @tsmith