$30 off During Our Annual Pro Sale. View Details »

[Mobius '18] Things I wish I knew when I started building Android Libraries/SDK -Vol 2

[Mobius '18] Things I wish I knew when I started building Android Libraries/SDK -Vol 2

Building an Android library in the current times is way different than what it used to be earlier. Things have changed considerably and keeping up to date with them is now a necessity rather than just some acquirable knowledge.

This session is a second part to the last year's talk at Droidcon Berlin 2017 which was Vol. 1. In this session, you will dive deeper into best practices and ways of architecting Android libraries. You will get to learn about the common pitfalls and how to overcome them by using the right approach such as leveraging architecture components and making your Android libraries lifecycle-aware. You will also understand how one can leverage Kotlin language when developing Android libraries as well as information around API design and exploring the path to becoming a better Android Library Developer.

By the end of this session, you will be all set to build Android libraries that scale and have API which contributes to the developer's happiness.

Nishant Srivastava

December 08, 2018
Tweet

More Decks by Nishant Srivastava

Other Decks in Technology

Transcript

  1. 1

    View Slide

  2. OSS Android libraries developed
    2

    View Slide

  3. Side A
    1. How does Gradle
    process Android
    Libraries
    2. Android Archive(AAR)
    3. Why doesn’t my AAR
    download transitive
    dependencies?
    4. Maven Artifact
    5. POM?
    6. Bundled Proguard
    Configs
    Side B
    7. Modularization
    8. Avoiding Resource
    Name Conflicts
    9. minSdkVersion
    Restriction
    10. Access Visibility vs
    Code Organization
    11. Lifecycle Aware
    Android Library
    12. Auto Init Android
    Library
    3
    @nisrulz

    View Slide

  4. How does Gradle process
    Android Libraries
    @nisrulz 4

    View Slide

  5. How does Gradle process
    Android Libraries
    repositories{
    jCenter()
    }
    dependencies {
    implementation 'com.example.myawesomelib:1.0.0'
    ...
    }
    5
    @nisrulz

    View Slide

  6. How does Gradle process
    Android Libraries
    ● implementation
    6
    @nisrulz

    View Slide

  7. ● api
    How does Gradle process
    Android Libraries
    7
    @nisrulz

    View Slide

  8. How does Gradle process
    Android Libraries
    ● compileOnly
    8
    @nisrulz

    View Slide

  9. Android ARchive(AAR)
    @nisrulz 9

    View Slide

  10. AAR = Java ARchive(JAR) + Resources
    10
    @nisrulz

    View Slide

  11. AAR = Java ARchive(JAR) + Resources
    Sensey: https://github.com/nisrulz/sensey
    11
    @nisrulz

    View Slide

  12. AAR = Java ARchive(JAR) + Resources
    @nisrulz 12

    View Slide

  13. Sensey’s build.gradle
    dependencies {
    ...
    // Other testing dependencies
    // Transitive dependency: Support Compat library
    implementation "com.android.support:support-compat:27.0.2"
    }
    13
    @nisrulz

    View Slide

  14. Using an AAR as dependency
    @nisrulz 14

    View Slide

  15. Using an AAR as dependency
    repositories{
    flatDir{
    dirs 'libs'
    }
    }
    dependencies {
    implementation(name:'nameOfYourAARFileWithoutExtension', ext:'aar')
    }
    @nisrulz 15

    View Slide

  16. Using an AAR as dependency
    repositories{
    flatDir{
    dirs 'libs'
    }
    }
    dependencies {
    implementation(name:'nameOfYourAARFileWithoutExtension', ext:'aar')
    }
    // No transitive dependencies of the library are downloaded
    16
    @nisrulz

    View Slide

  17. Why doesn’t my AAR
    download transitive
    dependencies?
    @nisrulz 17

    View Slide

  18. Sensey’s AAR
    18
    @nisrulz

    View Slide

  19. Sensey’s AAR
    No build.gradle file
    19
    @nisrulz

    View Slide

  20. Maven Artifact
    20
    @nisrulz

    View Slide

  21. Maven Artifact
    21
    @nisrulz

    View Slide

  22. POM?
    22
    @nisrulz

    View Slide

  23. POM
    ● Project Object Model
    ● XML file
    ● Configuration details used by Maven to build the project
    23
    @nisrulz

    View Slide

  24. POM
    POM of Sensey Android Library


    4.0.0
    com.github.nisrulzsensey1.8.0
    aarsensey
    Android library which makes playing with sensor events & detecting gestures a breeze.
    https://github.com/nisrulz/sensey


    The Apache Software License, Version 2.0http://www.apache.org/licenses/LICENSE-2.0.txt



    nisrulzNishant [email protected]


    https://github.com/nisrulz/sensey.git
    https://github.com/nisrulz/sensey.git
    https://github.com/nisrulz/sensey



    com.android.support
    support-compat27.0.2
    runtime


    ...



    24
    @nisrulz

    View Slide

  25. POM
    POM of Sensey Android Library


    4.0.0
    com.github.nisrulzsensey1.8.0
    aarsensey
    Android library which makes playing with sensor events & detecting gestures a breeze.
    https://github.com/nisrulz/sensey


    The Apache Software License, Version 2.0http://www.apache.org/licenses/LICENSE-2.0.txt



    nisrulzNishant [email protected]


    https://github.com/nisrulz/sensey.git
    https://github.com/nisrulz/sensey.git
    https://github.com/nisrulz/sensey



    com.android.support
    support-compat27.0.2
    runtime


    ...



    25
    @nisrulz

    View Slide

  26. POM
    POM of Sensey Android Library


    ...


    com.android.support
    support-compat27.0.2
    runtime


    ...



    26
    @nisrulz

    View Slide

  27. Bundled Proguard Configs
    27
    @nisrulz

    View Slide

  28. Bundled Proguard Configs
    android {
    release {
    minifyEnabled true
    // Rules to be used during the AAR generation
    proguardFiles 'proguard-rules-for-building-library.pro'
    // Rules appended to the integrating app
    consumerProguardFiles 'proguard-rules-for-using-library.pro'
    }
    ...
    }
    28
    @nisrulz

    View Slide

  29. Bundled Proguard Configs
    Fuel: https://github.com/kittinunf/Fuel
    29
    @nisrulz

    View Slide

  30. Bundled Proguard Configs
    30
    @nisrulz

    View Slide

  31. Bundled Proguard Configs
    # Fuel’s bundled Proguard file
    # Without specifically keeping this class,
    # callbacks on android don't function properly.
    -keep class com.github.kittinunf.fuel.android.util.AndroidEnvironment
    31
    @nisrulz

    View Slide

  32. Bundled Proguard Configs
    # To check the merged configuration
    # Add the below to your current config
    -printconfiguration proguard-merged-config.txt
    32
    @nisrulz

    View Slide

  33. Bundled Proguard Configs
    # DON'T DO THIS
    -dontobfuscate
    -optimizations !code/allocation/variable
    # Effectively no optimizations
    -keep public class * {
    public protected *;
    }
    33
    @nisrulz

    View Slide

  34. Bundled Proguard Configs
    # DON'T DO THIS
    # Adding the below in library proguard rules disables
    # the optimizations in the Android app
    -dontoptimize
    34
    @nisrulz

    View Slide

  35. Modularization
    35
    @nisrulz

    View Slide

  36. Modularization
    36
    @nisrulz

    View Slide

  37. Modularization
    EasyDeviceInfo: https://github.com/nisrulz/easydeviceinfo
    37
    @nisrulz

    View Slide

  38. Modularization
    dependencies {
    def libVer = {latest_version}
    // Base + Ads Bundled Library
    implementation "com.github.nisrulz:easydeviceinfo:$libVer"
    // Base Library
    implementation "com.github.nisrulz:easydeviceinfo-base:$libVer"
    // Ads Library
    implementation "com.github.nisrulz:easydeviceinfo-ads:$libVer"
    }
    38
    @nisrulz

    View Slide

  39. Modularization


    ...


    com.github.nisrulz
    easydeviceinfo-ads 2.5.0
    compile


    com.github.nisrulz
    easydeviceinfo-base 2.5.0
    compile

    ...


    39
    @nisrulz

    View Slide

  40. Modularization


    ...


    com.github.nisrulz
    easydeviceinfo-ads 2.5.0
    compile


    com.github.nisrulz
    easydeviceinfo-base 2.5.0
    compile

    ...


    40
    @nisrulz

    View Slide

  41. Modularization


    ...


    com.github.nisrulz
    easydeviceinfo-ads 2.5.0
    compile


    com.github.nisrulz
    easydeviceinfo-base 2.5.0
    compile

    ...


    41
    @nisrulz

    View Slide

  42. Modularization


    ...


    com.github.nisrulz
    easydeviceinfo-common2.5.0
    compile


    com.google.android.gms
    play-services-ads-identifier16.0.0
    runtime

    ...


    42
    @nisrulz

    View Slide

  43. Modularization


    ...


    com.github.nisrulz
    easydeviceinfo-common2.5.0
    compile


    com.google.android.gms
    play-services-ads-identifier16.0.0
    runtime

    ...


    43
    @nisrulz

    View Slide

  44. Avoiding Resource Name
    Conflicts
    44
    @nisrulz

    View Slide

  45. Conflict occurs between a library & app resource
    > Project will not compile
    What happens when...
    45
    @nisrulz

    View Slide

  46. Conflict occurs between 2 libraries integrated in the app
    > Resources from library defined first in build.gradle gets
    included
    What happens when...
    46
    @nisrulz

    View Slide

  47. Solution?
    47
    @nisrulz

    View Slide

  48. Add a prefix to all your resources.
    Solution?
    48
    @nisrulz

    View Slide

  49. Add a prefix to all your resources.
    How?
    Solution?
    49
    @nisrulz

    View Slide

  50. Add a prefix to all your resources.
    How?
    ● Enforce this in Android Studio
    Solution?
    50
    @nisrulz

    View Slide

  51. Add a prefix to all your resources.
    How?
    ● Enforce this in Android Studio
    ● Declare in build.gradle of library
    android {
    resourcePrefix 'YOUR_PREFIX_' // i.e 'sensey_'
    }
    Solution?
    51
    @nisrulz

    View Slide

  52. Solution?
    Resource named ‘app_name’ does not start with the project’s
    resource prefix ‘sensey_’;
    Rename to `sensey_app_name`?
    52
    @nisrulz

    View Slide

  53. minSdkVersion Restriction
    53
    @nisrulz

    View Slide

  54. minSdkVersion of app >= minSdkVersion of library
    minSdk Restriction
    54
    @nisrulz

    View Slide

  55. minSdk Restriction
    55
    @nisrulz

    View Slide

  56. Manifest merger failed : uses-sdk:minSdkVersion 14 cannot be smaller
    than version 21 declared in library [:sensey]
    Suggestion:
    + Use a compatible library with a minSdk of at most 14
    + Increase this project's minSdk version to at least 21
    + Use tools:overrideLibrary="com.github.nisrulz.sensey" to force
    usage (may lead to runtime failures)
    minSdk Restriction
    56
    @nisrulz

    View Slide

  57. Manifest merger failed : uses-sdk:minSdkVersion 14 cannot be smaller
    than version 21 declared in library [:sensey]
    Suggestion:
    + Use a compatible library with a minSdk of at most 14
    + Increase this project's minSdk version to at least 21
    + Use tools:overrideLibrary="com.github.nisrulz.sensey" to force
    usage (may lead to runtime failures)
    minSdk Restriction
    57
    @nisrulz

    View Slide

  58. Manifest merger failed : uses-sdk:minSdkVersion 14 cannot be smaller
    than version 21 declared in library [:sensey]
    Suggestion:
    + Use a compatible library with a minSdk of at most 14
    + Increase this project's minSdk version to at least 21
    + Use tools:overrideLibrary="com.github.nisrulz.sensey" to force
    usage (may lead to runtime failures)
    minSdk Restriction
    58
    @nisrulz

    View Slide

  59. xmlns:tools="http://schemas.android.com/tools"
    package="com.github.nisrulz.senseysample">


    ...


    minSdk Restriction
    59
    @nisrulz

    View Slide

  60. xmlns:tools="http://schemas.android.com/tools"
    package="com.github.nisrulz.senseysample">


    ...


    minSdk Restriction
    60
    @nisrulz

    View Slide

  61. Access Visibility
    vs
    Code Organization
    61
    @nisrulz

    View Slide

  62. Visibility vs Organization
    62
    @nisrulz

    View Slide

  63. Visibility vs Organization
    ● Code organized in individual packages; everything is
    public
    63
    @nisrulz

    View Slide

  64. Visibility vs Organization
    ● Code organized inside one package; everything is package
    private and only public on demand
    64
    @nisrulz

    View Slide

  65. Visibility vs Organization
    ● Code organized inside the module i.e individual
    packages; everything is internal and only public on
    demand (in Kotlin land)
    ● Drawback
    ○ Need dependency on kotlin std library
    65
    @nisrulz

    View Slide

  66. Visibility vs Organization
    // file name: exampleLibrary.kt
    // module name: example
    package com.example.library
    66
    @nisrulz

    View Slide

  67. Visibility vs Organization
    // file name: exampleLibrary.kt
    // module name: example
    package com.example.library
    // visible inside exampleLibrary.kt
    private fun setup() { ... }
    67
    @nisrulz

    View Slide

  68. Visibility vs Organization
    // file name: exampleLibrary.kt
    // module name: example
    package com.example.library
    // visible inside exampleLibrary.kt
    private fun setup() { ... }
    // property is visible everywhere
    public var name: String = "ExampleLib"
    // setter is visible only in exampleLibrary.kt
    private set{...}
    68
    @nisrulz

    View Slide

  69. Visibility vs Organization
    // file name: exampleLibrary.kt
    // module name: example
    package com.example.library
    // visible inside exampleLibrary.kt
    private fun setup() { ... }
    // property is visible everywhere
    public var name: String = "ExampleLib"
    // setter is visible only in exampleLibrary.kt
    private set{...}
    // visible inside the module i.e example
    internal val debugTag = "Example-Debug"
    69
    @nisrulz

    View Slide

  70. Lifecycle-Aware
    Android Library
    70
    @nisrulz

    View Slide

  71. Lifecycle Components
    Classes designed to help deal with Android
    lifecycle
    ● Lifecycle
    ● LifecycleOwner
    ● LifecycleObserver
    71
    @nisrulz

    View Slide

  72. Lifecycle Components
    Classes designed to help deal with Android
    lifecycle
    72
    @nisrulz

    View Slide

  73. Lifecycle Components
    Classes designed to help deal with Android
    lifecycle
    i.e Activity, Fragment, Service, Custom
    73
    @nisrulz

    View Slide

  74. Lifecycle
    class MainActivity extends AppCompatActivity() {...}
    74
    @nisrulz

    View Slide

  75. Lifecycle
    class MainActivity extends AppCompatActivity() {...}
    public class AppCompatActivity extends FragmentActivity{...}
    75
    @nisrulz

    View Slide

  76. Lifecycle
    class MainActivity extends AppCompatActivity() {...}
    public class AppCompatActivity extends FragmentActivity{...}
    public class FragmentActivity extends SupportActivity {
    ...
    public Lifecycle getLifecycle() {
    return super.getLifecycle();
    }
    ...
    }
    76
    @nisrulz

    View Slide

  77. LifecycleObserver
    dependencies {
    def lifecycleVer = "2.0.0"
    // Runtime
    implementation "androidx.lifecycle:lifecycle-runtime:$lifecycleVer"
    // Annotation Support
    annotationProcessor "androidx.lifecycle:lifecycle-compiler:$lifecycleVer"
    ...
    }
    77
    @nisrulz

    View Slide

  78. LifecycleObserver
    public class AwesomeLib implements LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public void init() { ... }
    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void libOnStart() { ... }
    ...
    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void cleanup() { ... }
    }
    78
    @nisrulz

    View Slide

  79. LifecycleOwner
    class MainActivity : AppCompatActivity() {
    val awesomeLib = AwesomeLib()
    override fun onResume() {
    ...
    // Add lifecycle observer
    lifecycle.addObserver(awesomeLib)
    }
    override fun onStop() {
    ...
    // Remove lifecycle observer
    lifecycle.removeObserver(awesomeLib)
    }
    }
    79
    @nisrulz

    View Slide

  80. LifecycleAware Library
    80
    @nisrulz

    View Slide

  81. ProcessLifecycleOwner
    Class that tracks the lifecycle of
    whole application process
    81
    @nisrulz

    View Slide

  82. ProcessLifecycleOwner
    dependencies {
    // For ProcessLifecycleOwner
    implementation "androidx.lifecycle:lifecycle-extensions:2.0.0"
    ...
    }
    82
    @nisrulz

    View Slide

  83. ProcessLifecycleOwner
    Does something weird…
    83
    @nisrulz

    View Slide

  84. ProcessLifecycleOwner
    Does something weird…
    Adding lifecycle-extensions artifact
    > automatically adds element to the merged
    manifest
    84
    @nisrulz

    View Slide

  85. ProcessLifecycleOwner
    85
    @nisrulz

    View Slide

  86. ProcessLifecycleOwner


    ...
    android:name="androidx.lifecycle.ProcessLifecycleOwnerInitializer"
    android:authorities="com.example.app.lifecycle-process"
    android:exported="false"
    android:multiprocess="true" />


    86
    @nisrulz

    View Slide

  87. ProcessLifecycleOwner


    ...
    android:name="androidx.lifecycle.ProcessLifecycleOwnerInitializer"
    android:authorities="com.example.app.lifecycle-process"
    android:exported="false"
    android:multiprocess="true" />


    87
    @nisrulz

    View Slide

  88. ProcessLifecycleOwner


    ...
    android:name="android.arch.lifecycle.ProcessLifecycleOwnerInitializer"
    android:authorities="com.example.app.lifecycle-trojan"
    android:exported="false"
    android:multiprocess="true" />


    88
    @nisrulz
    Pre-AndroidX

    View Slide

  89. ProcessLifecycleOwner


    ...
    android:name="android.arch.lifecycle.ProcessLifecycleOwnerInitializer"
    android:authorities="com.example.app.lifecycle-trojan"
    android:exported="false"
    android:multiprocess="true" />


    89
    @nisrulz
    Pre-AndroidX

    View Slide

  90. ProcessLifecycleOwner
    90
    @nisrulz
    Pre-AndroidX

    View Slide

  91. ProcessLifecycleOwner


    ...
    android:name="androidx.lifecycle.ProcessLifecycleOwnerInitializer"
    android:authorities="com.example.app.lifecycle-process"
    android:exported="false"
    android:multiprocess="true" />


    91
    @nisrulz
    AndroidX

    View Slide

  92. ProcessLifecycleOwner


    ...
    android:name="androidx.lifecycle.ProcessLifecycleOwnerInitializer"
    android:authorities="com.example.app.lifecycle-process"
    android:exported="false"
    android:multiprocess="true" />


    92
    @nisrulz
    AndroidX

    View Slide

  93. ProcessLifecycleOwner
    // Internal class to initialize Lifecycles.
    public class ProcessLifecycleOwnerInitializer extends ContentProvider {
    @Override
    public boolean onCreate() {
    ...
    ProcessLifecycleOwner.init(getContext());
    return true;
    }
    ...
    }
    93
    @nisrulz

    View Slide

  94. ProcessLifecycleOwner
    Why?
    To invoke ProcessLifecycleOwner as soon as process
    starts
    94
    @nisrulz

    View Slide

  95. ProcessLifecycleOwner
    Why?
    To invoke ProcessLifecycleOwner as soon as process
    starts
    Drawback?
    Initializes ProcessLifecycleOwner even if your app
    does not use it!
    95
    @nisrulz

    View Slide

  96. ProcessLifecycleOwner
    How to get rid of it in app?
    96
    @nisrulz

    View Slide

  97. ProcessLifecycleOwner
    How to get rid of it in app?
    Use Merge rule marker in app’s AndroidManifest.xml:
    // Remove marked element from the merged manifest
    tools:node="remove"
    97
    @nisrulz

    View Slide

  98. ProcessLifecycleOwner

    ...
    android:name="androidx.lifecycle.ProcessLifecycleOwnerInitializer"
    android:authorities="${applicationId}.lifecycle-process"
    xmlns:tools="http://schemas.android.com/tools"
    tools:node="remove"
    />

    98
    @nisrulz
    App’s AndroidManifest.xml

    View Slide

  99. ProcessLifecycleOwner

    ...
    android:name="androidx.lifecycle.ProcessLifecycleOwnerInitializer"
    android:authorities="${applicationId}.lifecycle-process"
    xmlns:tools="http://schemas.android.com/tools"
    tools:node="remove"
    />

    99
    @nisrulz
    App’s AndroidManifest.xml

    View Slide

  100. ProcessLifecycleOwner

    ...
    android:name="androidx.lifecycle.ProcessLifecycleOwnerInitializer"
    android:authorities="${applicationId}.lifecycle-process"
    xmlns:tools="http://schemas.android.com/tools"
    tools:node="remove"
    />

    100
    @nisrulz
    App’s AndroidManifest.xml

    View Slide

  101. ProcessLifecycleOwner

    ...
    android:name="androidx.lifecycle.ProcessLifecycleOwnerInitializer"
    android:authorities="${applicationId}.lifecycle-process"
    xmlns:tools="http://schemas.android.com/tools"
    tools:node="remove"
    />

    101
    @nisrulz
    App’s AndroidManifest.xml

    View Slide

  102. Auto Initialize
    Android Library
    102
    @nisrulz

    View Slide

  103. AutoInit Android Library
    Android Libraries need Android context to handle simple tasks such as
    ● Hook into Android Runtime
    ● Access app resources
    ● Use System Services
    ● Register BroadcastReceiver
    103
    @nisrulz

    View Slide

  104. AutoInit Android Library
    public class MyApplication extends Application {
    @Override
    public void onCreate() {
    super.onCreate();
    // Init android library
    MyAwesomeLibrary.init(this);
    }
    }
    104
    @nisrulz

    View Slide

  105. AutoInit Android Library
    public class MyApplication extends Application {
    @Override
    public void onCreate() {
    super.onCreate();
    // Init android library
    MyAwesomeLibrary.init(this);
    }
    }
    105
    @nisrulz

    View Slide

  106. AutoInit Android Library
    public class MyApplication extends Application {
    @Override
    public void onCreate() {
    super.onCreate();
    // Init android library
    MyAwesomeLibrary.init(this);
    }
    }
    106
    @nisrulz

    View Slide

  107. AutoInit Android Library
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:name=".MyApplication"
    ... >
    107
    @nisrulz

    View Slide

  108. AutoInit Android Library
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:name=".MyApplication"
    ... >
    108
    @nisrulz

    View Slide

  109. AutoInit Android Library
    ContentProvider can be used to simplify the process.
    109
    @nisrulz

    View Slide

  110. AutoInit Android Library
    ContentProvider can be used to simplify the process.
    Simply because ContentProvider
    ● Is created and initialized (on the main thread)
    before all other components
    ● Participate in manifest merging at build time.
    110
    @nisrulz

    View Slide

  111. AutoInit Android Library
    public class AwesomeLibInitProvider extends ContentProvider {
    ...
    @Override
    public boolean onCreate() {
    // get the context (Application context)
    Context context = getContext();
    // initialize AwesomeLib here
    AwesomeLib.getInstance().init(context);
    return false;
    }
    ...
    }
    111
    @nisrulz

    View Slide

  112. AutoInit Android Library
    public class AwesomeLibInitProvider extends ContentProvider {
    ...
    @Override
    public boolean onCreate() {
    // get the context (Application context)
    Context context = getContext();
    // initialize AwesomeLib here
    AwesomeLib.getInstance().init(context);
    return false;
    }
    ...
    }
    112
    @nisrulz

    View Slide

  113. AutoInit Android Library
    package="github.nisrulz.sample.awesomelib">

    android:name=".AwesomeLibInitProvider"
    android:authorities="${applicationId}.awesomelibinitprovider"
    android:enabled="true"
    android:exported="false"/>


    113
    @nisrulz

    View Slide

  114. AutoInit Android Library
    package="github.nisrulz.sample.awesomelib">

    android:name=".AwesomeLibInitProvider"
    android:authorities="${applicationId}.awesomelibinitprovider"
    android:enabled="true"
    android:exported="false"/>


    114
    @nisrulz

    View Slide

  115. AutoInit Android Library
    package="github.nisrulz.sample.awesomelib">

    android:name=".AwesomeLibInitProvider"
    android:authorities="${applicationId}.awesomelibinitprovider"
    android:enabled="true"
    android:exported="false"/>


    115
    @nisrulz

    View Slide

  116. AutoInit Android Library
    package="github.nisrulz.sample.awesomelib">

    android:name=".AwesomeLibInitProvider"
    android:authorities="${applicationId}.awesomelibinitprovider"
    android:enabled="true"
    android:exported="false"/>


    116
    @nisrulz

    View Slide

  117. AutoInit Android Library
    ContentProvider can be used to simplify the process.
    117
    @nisrulz

    View Slide

  118. AutoInit Android Library
    ContentProvider can be used to simplify the process.
    Challenges:
    ● There can be only one Content Provider with a given
    “authority” string
    ● Only run on main thread
    118
    @nisrulz

    View Slide

  119. AutoInit Android Library
    ContentProvider can be used to simplify the process.
    119
    @nisrulz

    View Slide

  120. AutoInit Android Library
    ContentProvider can be used to simplify the process.
    Why this is a bad idea:
    ● Increases startup time
    ● Bloats applications even when not used
    ● Abusing functionality of ContentProvider
    120
    @nisrulz

    View Slide

  121. AutoInit Android Library
    ContentProvider can be used to simplify the process.
    Why this is a bad idea:
    ● Increases startup time (Solution: async initialize)
    ● Bloats applications even when not used
    ● Abusing functionality of ContentProvider
    121
    @nisrulz

    View Slide

  122. AutoInit Android Library
    Some android libraries that use this...
    122
    @nisrulz

    View Slide

  123. AutoInit Android Library
    ProcessLifecycleOwner
    [androidx.lifecycle:lifecycle-extensions:2.0.0]

    android:name="androidx.lifecycle.ProcessLifecycleOwnerInitializer"
    android:authorities="${applicationId}.lifecycle-process"
    android:exported="false"
    android:multiprocess="true" />

    123
    @nisrulz

    View Slide

  124. AutoInit Android Library
    Firebase
    [com.google.firebase:firebase-common:16.0.5]

    android:name="com.google.firebase.provider.FirebaseInitProvider"
    android:authorities="${applicationId}.firebaseinitprovider"
    android:exported="false"
    android:initOrder="100" />

    124
    @nisrulz

    View Slide

  125. AutoInit Android Library
    Facebook-Core
    [com.facebook.android:facebook-core:4.34.0]

    android:name="com.facebook.internal.FacebookInitProvider"
    android:authorities="${applicationId}.FacebookInitProvider"
    android:exported="false" />

    125
    @nisrulz

    View Slide

  126. AutoInit Android Library
    Facebook-Marketing
    [com.facebook.android:facebook-marketing:4.34.0]

    android:name="com.facebook.marketing.internal.MarketingInitProvider"
    android:authorities="${applicationId}.MarketingInitProvider"
    android:exported="false" />

    126
    @nisrulz

    View Slide

  127. AutoInit Android Library
    Crashlytics
    [com.crashlytics.sdk.android:crashlytics:2.9.5]

    android:name="com.crashlytics.android.CrashlyticsInitProvider"
    android:authorities="${applicationId}.crashlyticsinitprovider"
    android:exported="false"
    android:initOrder="90" />

    127
    @nisrulz

    View Slide

  128. AutoInit Android Library
    Picasso
    // Pre - v2.71828
    Picasso.with(this).load("......").into(imageView);
    // After - v2.71828
    Picasso.get().load("......").into(imageView);
    128
    @nisrulz

    View Slide

  129. AutoInit Android Library
    Picasso
    // Pre - v2.71828
    Picasso.with(this).load("......").into(imageView);
    // After - v2.71828
    Picasso.get().load("......").into(imageView);
    129
    @nisrulz

    View Slide

  130. AutoInit Android Library
    Picasso
    [com.squareup.picasso:picasso:2.71828]

    android:name=".PicassoContentProvider"
    android:authorities="${applicationId}.com.squareup.picasso3"
    android:exported="false"/>

    130
    @nisrulz

    View Slide

  131. Links/References
    Android Libraries I have built:
    https://github.com/nisrulz/nisrulz.github.io#open-source-co
    ntributions
    Auto initialize android library example:
    https://github.com/nisrulz/android-examples/tree/develop/Au
    toInitLibrary
    Lifecycle Aware android library example:
    https://github.com/nisrulz/android-examples/tree/develop/Li
    feCycleCompForLib
    131
    @nisrulz

    View Slide

  132. twitter.com/nisrulz
    github.com/nisrulz
    www.nisrulz.com
    132

    View Slide

  133. twitter.com/nisrulz
    github.com/nisrulz
    www.nisrulz.com
    133

    View Slide