47
October 28, 2014 @tsmith Building the Fabric SDKs Ty Smith

#MBLTdev: Разработка первоклассных SDK для Android (Twitter)

Embed Size (px)

DESCRIPTION

#MBLTdev: Конференция мобильных разработчиков Спикер: Ty Smith Старший инженер-программист, Twitter http://mbltdev.ru/

Citation preview

Page 1: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

October 28, 2014 @tsmith

Building the Fabric SDKsTy Smith

Page 2: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

Ty SmithSr. Android Engineer, Fabric

@tsmith

Page 3: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

.io

Page 4: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)
Page 5: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)
Page 6: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)
Page 7: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)
Page 8: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

Fabric Sample AppCannonball

Open source for iOS & Android:github.com/twitterdev

Page 9: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

Powerful

Lightweight

Page 10: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

Powerful

Page 11: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

Ease of Integration

Page 12: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

Ease of IntegrationFabric.with(this, new Crashlytics());

Page 13: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

Extensible

Page 14: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

ExtensibleCrashlytics.start(this);

Page 15: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

ExtensibleCrashlytics.start(this, 5);

Crashlytics.setListener(createCrashlyticsListener());Crashlytics.setPinningInfo(createPinningInfoProvider())Crashlytics.getInstance().setDebugMode(true);

Page 16: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

ExtensibleCrashlytics.setListener(createCrashlyticsListener());Crashlytics.setPinningInfo(createPinningInfoProvider());Crashlytics.getInstance().setDebugMode(true);

Crashlytics.start(this, 5);

Page 17: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

ExtensibleCrashlytics.start(this, delay, listener, pinningInfo,

debugMode);

Page 18: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

ExtensibleCrashlytics.start(this, 0, null, null, null, true);

Page 19: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

Fluent PatternCrashlytics crashlytics = new Crashlytics.Builder() .delay(1) .listener(createCrashlyticsListener()) .pinningInfo(createPinningInfoProvider()) .build(); Fabric.with(this, crashlytics);

Page 20: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

Fluent PatternFabric.with(this, new Fabric.Builder(this)

.kits(new Crashlytics())

.debuggable(true)

.logger(new DefaultLogger(Log.VERBOSE))

.looper(getCustomLooper())

.executor(getCustomExecutorService())

.build());

Page 21: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

Gracefully Degrade

Page 22: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

Gracefully Degradeif (TextUtils.isEmpty(apiKey) if (debuggable){

throw new IllegalArgumentException(“apiKey is null!");

} else {return null;

}}

Page 23: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

Minimizing Permissions

Page 24: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

Minimizing Permissions

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

Page 25: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

Minimizing PermissionsCrashlytics.setUserEmail(“[email protected]”);

Page 26: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

Permissions: Runtime Detectionprotected boolean canCheckNetworkState() {String permission =

“android.permission.ACCESS_NETWORK_STATE”;int result =

context.checkCallingOrSelfPermission(permission);return (result == PackageManager.PERMISSION_GRANTED);

}

Page 27: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

Multiple Application Types

Page 28: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

Multiple Application Types

package com.example;

import android.app.Service;

public class MyService extends Service { }

Page 29: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

UI from Application Contextprivate WeakReference<Activity> currentActivity = new WeakReference<Activity>();

@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)private 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); }

});}

}

Page 30: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

Powerful SDKs

Ease of Integration

Extensibility

Support all app types

Permission detection

Page 31: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

Lightweight

Page 32: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

Binary Size

Page 33: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

Binary Size

Page 34: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

3rd Party Library Mindfulness

Page 35: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

3rd Party Library Mindfulness

0

10

20

30

Page 36: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

3rd Party Library Mindfulness

PROTOBUF

KB

OURS

KB

Page 37: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

Dalvik Method Count

Page 38: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

Dalvik Method Count>./gradlew assemble

…Unable to execute dex: method ID not in [0, 0xffff]: 65536Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536

Page 39: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

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

Page 40: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

Minimize Network Usage

Page 41: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

Network Usage

10X SMALLER

100X FASTER

XML PROTOBUF

Page 42: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

Reduce Startup Time

Page 43: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

Startup Time

Thread.start();

Executors.newSingleThreadExecutor();

Page 44: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

Startup Timeclass MyThreadFactory implements ThreadFactory {

@Override public Thread newThread(Runnable runnable) { final Thread thread = new Thread(runnable); thread.setPriority(Process.THREAD_PRIORITY_BACKGROUND); return thread; }}

Page 45: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

Lightweight SDKsBinary size

3rd party library mindfulness

Dalvik Method Count

Network usage

Startup time

Page 46: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

LightweightPowerful

Page 47: #MBLTdev: Разработка первоклассных SDK для Android (Twitter)

Thank You@tsmith