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

App Modularization: From Zero to Hero

App Modularization: From Zero to Hero

As your app becomes more complex and build speeds begin to increase, app modularization starts to enter the conversation. Does the concept seem fuzzy to you? Or, do you know what it means in theory but have no clue where to start in your apps?

In this talk, you will get an answer to the Five Ws on app modularization - what, why, when, where and how. You'll learn:

What Dynamic Feature Modules are and how that relates to modularization
How to identify features to modularize and all the steps to take in the process
All the pain points to look out for based on our experience

You'll get all the information you need to modularize your apps and reap the benefits!

Moyinoluwa Adeyemi

August 09, 2019
Tweet

More Decks by Moyinoluwa Adeyemi

Other Decks in Technology

Transcript

  1. APP MODULARIzation:
    FROM ZERO TO HERO!
    Moyinoluwa Adeyemi
    @moyheen

    View Slide

  2. APP
    “Separating logical components of your
    app project into discrete modules”
    2

    View Slide

  3. WHY?
    3

    View Slide

  4. WHY?
    × Cleaner codebase
    4

    View Slide

  5. WHY?
    × Cleaner codebase
    × Separation of concerns
    5

    View Slide

  6. WHY?
    × Cleaner codebase
    × Separation of concerns
    × Faster build times
    6

    View Slide

  7. WHY?
    × Cleaner codebase
    × Separation of concerns
    × Faster build times
    × Dynamic delivery
    7

    View Slide

  8. WHY?
    × Cleaner codebase
    × Separation of concerns
    × Faster build times
    × Dynamic delivery
    × App Bundles
    8

    View Slide

  9. When?
    9

    View Slide

  10. WHEN?
    start?
    10

    View Slide

  11. WHEN?
    start? middle?
    11

    View Slide

  12. WHEN?
    start? middle?
    middle?

    12

    View Slide

  13. WhO?
    13

    View Slide

  14. YOU, SITTING IN THIS TALK?
    14

    View Slide

  15. WHERE?
    15

    View Slide

  16. IT DEPENDS!
    16

    View Slide

  17. ZOLA APP
    17

    View Slide

  18. ZOLA APP
    18

    View Slide

  19. HOW?
    19

    View Slide

  20. dYNAMIC
    FEATURE
    MODULES
    20

    View Slide

  21. dYNAMIC
    FEATURE
    MODULES
    21

    View Slide

  22. dYNAMIC
    FEATURE
    MODULES
    22

    View Slide

  23. ARCHITECTURE - IN THE BEGINNING
    23
    :app

    View Slide

  24. ARCHITECTURE - MULTIPLE MODULES (FIRST PASS)
    24
    :database
    :app

    View Slide

  25. ARCHITECTURE - MULTIPLE MODULES (FIRST PASS)
    25
    :database
    :order
    :lead :service :installation
    :app
    :inventory

    View Slide

  26. ARCHITECTURE - MULTIPLE MODULES (SECOND PASS)
    26
    :database

    View Slide

  27. ARCHITECTURE - MULTIPLE MODULES (SECOND PASS)
    27
    :database
    :core

    View Slide

  28. ARCHITECTURE - MULTIPLE MODULES (SECOND PASS)
    28
    :database :test_shared
    :core

    View Slide

  29. ARCHITECTURE - MULTIPLE MODULES (SECOND PASS)
    29
    :database
    :core :app
    :test_shared

    View Slide

  30. ARCHITECTURE - MULTIPLE MODULES (SECOND PASS)
    30
    :database
    :order
    :lead :service :installation
    :core
    :inventory
    :app
    :test_shared

    View Slide

  31. MANIFEST.XML FILE
    dist:instant="false"
    dist:onDemand="false"
    dist:title="@string/title_dynamic_feature">


    31

    View Slide

  32. MANIFEST.XML FILE - INTENT FILTER
    android:name=".DynamicFeatureActivity">




    32

    View Slide

  33. START ACTIVITY FROM A DIFFERENT MODULE
    fun goToTasks(context: Context) =
    Intent(Intent.ACTION_VIEW).apply {
    setClassName(context.packageName,
    "$BASE_PACKAGE.features.service.TasksActivity")
    }
    33

    View Slide

  34. 34
    SETTINGS.GRADLE FILE (ROOT)
    include ':app', ':dynamic_feature'

    View Slide

  35. 35
    BUILD.GRADLE FILE (APP)
    dynamicFeatures = [":dynamic_feature"]

    View Slide

  36. 36
    CORE_TEST_DEPEndencies.GRADLE FILE (ROOT)
    apply from: '../core_test_dependencies.gradle'

    View Slide

  37. R class
    import com.offgrid.electric.confetti.R
    import com.offgrid.electric.confetti.features.order.R as orderR
    37

    View Slide

  38. R class
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(orderR.layout.activity_customer_edit)
    38

    View Slide

  39. CONTINUOUS INTEGRATION
    39

    View Slide

  40. ANY GOTCHAS?
    40

    View Slide

  41. APOLLO GRAPHQL ‍♀
    41
    “Couldn’t find some schema files for the variant
    stagingDebug. Please ensure a valid
    schema.json file exists under the variant source
    sets”

    View Slide

  42. APOLLO GRAPHQL
    42
    sourceSets {
    main {
    java.srcDirs += ['src/main/graphql']
    }
    }

    View Slide

  43. APOLLO GRAPHQL
    43
    apollo {
    customTypeMapping = ["DateTime": "java.util.Date"]
    schemaFilePath = "../../com/my/example/schema.json"
    outputPackageName = "com.my.example.features.feature"
    }

    View Slide

  44. DEPENDENCY INJECTION with dagger - thE problem
    44
    http://adavis.info/2019/06/dagger-multibinding-in-dynamic-feature-modules.html

    View Slide

  45. DEPENDENCY INJECTION with dagger - thE problem
    45
    http://adavis.info/2019/06/dagger-multibinding-in-dynamic-feature-modules.html
    class ConfettiJobCreator @Inject constructor(
    private val jobs: @JvmSuppressWildcards MapProvider>
    ) : JobCreator {
    override fun create(tag: String): Job? = jobs[tag]?.get()
    }

    View Slide

  46. DEPENDENCY INJECTION with dagger - thE problem
    46
    http://adavis.info/2019/06/dagger-multibinding-in-dynamic-feature-modules.html
    ...
    @Binds
    @IntoMap
    @StringKey(SomeJob.JOB_TAG)
    internal abstract fun bindSomeJob(job: SomeJob): Job
    ...

    View Slide

  47. DEPENDENCY INJECTION with dagger - thE problem
    47
    http://adavis.info/2019/06/dagger-multibinding-in-dynamic-feature-modules.html

    View Slide

  48. DEPENDENCY INJECTION with dagger - the solution
    48
    http://adavis.info/2019/06/dagger-multibinding-in-dynamic-feature-modules.html

    View Slide

  49. 49
    Localization - l10n
    Handling multiple string.xml files while
    using a translation tool?

    View Slide

  50. Unit tests
    50

    View Slide

  51. Unit tests
    51

    View Slide

  52. DISTRIBUTION
    52

    View Slide

  53. Credits
    × Presentation template by SlidesCarnival
    × http://adavis.info/2019/06/dagger-multibinding-in-dynamic-feature-modul
    es.html
    × https://github.com/android/plaid
    × https://codelabs.developers.google.com/codelabs/your-first-dynamic-app
    × https://medium.com/androiddevelopers/a-patchwork-plaid-monolith-to-
    modularized-app-60235d9f212e
    53

    View Slide

  54. THANKS!
    Moyinoluwa Adeyemi
    @moyheen
    54

    View Slide