Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
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
3
210
Building the Fabric SDKs - #MBLTDev (30 min)
Ty Smith
October 28, 2014
Tweet
Share
More Decks by Ty Smith
See All by Ty Smith
Balancing Speed and Reliability: The Double-Edged Sword of Third-Party Libraries
tysmith
1
93
Mobile Developer Productivity at Uber Scale [Droidcon NYC 2022]
tysmith
6
2.4k
Building for Developers - Droidcon Italy 2019
tysmith
1
280
Tools of the Trade #DCNYC18
tysmith
5
270
ADDC 2018 - Ty Smith: Building for Developers
tysmith
2
170
Deep Android Integrations
tysmith
4
1.4k
Better Android Development with Kotlin and Gradle
tysmith
10
1.1k
Better Android Development with Kotlin and Gradle
tysmith
9
1.6k
App To Ap: Designing Local APIs On Android
tysmith
1
290
Other Decks in Programming
See All in Programming
20251212 AI 時代的 Legacy Code 營救術 2025 WebConf
mouson
0
210
令和最新版Android Studioで化石デバイス向けアプリを作る
arkw
0
450
C-Shared Buildで突破するAI Agent バックテストの壁
po3rin
0
420
AIエンジニアリングのご紹介 / Introduction to AI Engineering
rkaga
8
3.3k
【卒業研究】会話ログ分析によるユーザーごとの関心に応じた話題提案手法
momok47
0
120
リリース時」テストから「デイリー実行」へ!開発マネージャが取り組んだ、レガシー自動テストのモダン化戦略
goataka
0
140
ゲームの物理 剛体編
fadis
0
370
SwiftUIで本格音ゲー実装してみた
hypebeans
0
500
TestingOsaka6_Ozono
o3
0
180
Full-Cycle Reactivity in Angular: SignalStore mit Signal Forms und Resources
manfredsteyer
PRO
0
170
クラウドに依存しないS3を使った開発術
simesaba80
0
170
Pythonではじめるオープンデータ分析〜書籍の紹介と書籍で紹介しきれなかった事例の紹介〜
welliving
3
600
Featured
See All Featured
Information Architects: The Missing Link in Design Systems
soysaucechin
0
720
Imperfection Machines: The Place of Print at Facebook
scottboms
269
13k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
38
Practical Orchestrator
shlominoach
190
11k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
170
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
0
75
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Side Projects
sachag
455
43k
The Power of CSS Pseudo Elements
geoffreycrofte
80
6.1k
What does AI have to do with Human Rights?
axbom
PRO
0
1.9k
The untapped power of vector embeddings
frankvandijk
1
1.5k
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