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
Modularizing your Android App
Search
Himanshu Singh
October 12, 2019
Technology
320
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Modularizing your Android App
This PPT is about Modularising your Android App using dynamic delivery.
Himanshu Singh
October 12, 2019
More Decks by Himanshu Singh
See All by Himanshu Singh
Debugging as a Skill
himanshoe
0
130
Elevating your App’s performance
himanshoe
0
96
FOMO in Android
himanshoe
1
980
Composing your Canvas : DroidCon
himanshoe
2
490
Composing in your Canvas
himanshoe
0
190
Backend Engineering for Android Developers
himanshoe
0
600
Mastering CameraX API
himanshoe
0
230
kotlin.pdf
himanshoe
0
140
Golang.pdf
himanshoe
0
190
Other Decks in Technology
See All in Technology
あなたの知らないバージョン命名規則
sat
PRO
2
480
NANDでも描画したい!
nichica906
3
650
dbt in Microsoft Fabric
ryomaru0825
0
220
私がブラウザを自作したくなった理由
supurazako
1
280
AIペネトレーションテスト・ セキュリティ検証「AgenticSec」紹介資料
laysakura
2
9.4k
Rust×eBPFでEDRっぽいものをつくる
sunlife3
2
920
案件に一番詳しいAIを Amazon Bedrock AgentCore で作る ― 知見が知見を生むチームへ / Compounding Knowledge with AgentCore
yusukeshimizu
1
180
会社紹介資料 / Sansan Company Profile
sansan33
PRO
24
430k
Kiro WebとCloud Sessions
nagisa53
2
180
【CEDEC2026】Creative Approaches to Localizing the Dialects and Unique Speech of Umamusume: Pretty Derby Characters in English
cygames
PRO
4
26k
20260817_生成AIの動向と中学校・高等学校での活用を考える_v1.00_公開用
doradora09
PRO
0
210
Knowledge Catalog を活用したメタデータ自動付与パイプライン構築
supership
0
130
Featured
See All Featured
Balancing Empowerment & Direction
lara
6
1.2k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
Making the Leap to Tech Lead
cromwellryan
135
10k
A Soul's Torment
seathinner
6
3.5k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
360
Un-Boring Meetings
codingconduct
0
390
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
470
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
73
41k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.3k
Paper Plane
katiecoart
PRO
2
53k
Transcript
Himanshu Singh @hi_man_shoe Modularizing your Android App
Himanshu Singh @hi_man_shoe About Me? Sr Android Engineer @roomiapp Instructor
and open source contributor @ Mindorks.com
Android Developers ?
Android Developers ?
Let’s Talk about the problem
Let’s Talk about the problem ચાલો શરૂ કરીએ ?
None
Module Bug Release Android Development Graph Feature
Solution to this ??
Multi - Modules
What and Whys of Multi Modules
Let’s talk about What
Let’s Talk about What Why
None
Library Modules Dynamic Delivery Modules
Library Modules Dynamic Delivery Modules
Let’s start with the code
Let’s start with the code
Create an Android Project (App Module)
Create an Android Project (App Module)
None
Create an Android Project (App Module) Goto File-> New ->
New Module and select Dynamic Feature Module (>Kitkat)
None
On the next screen, you will get a few options
to configure your module.
On the next screen, you will get a few options
to configure your module.
Press Finish :)
Final Project Looks like :)
What we want to achieve ?
<RelativeLayout> <Button android:id="@+id/buttonClick"/> <Button android:id="@+id/buttonOpenNewsModule android:visibility="gone"/> <Button android:id="@+id/buttonDeleteNewsModule" android:visibility="gone"/> </RelativeLayout>
android { ....... dynamicFeatures = [":news_feature"] } In app’s build.gradle
file
apply plugin: 'com.android.dynamic-feature' dependencies { ..... implementation project(':app') } In
new_feature’s build.gradle file
<dist:module dist:instant="false" dist:onDemand="true" dist:title="@string/title_news_feature"> <dist:fusing dist:include="true"/> </dist:module> In the manifest
of the dynamic Module,
<dist:module dist:instant="false" dist:onDemand="true" dist:title="@string/title_news_feature"> <dist:fusing dist:include="true"/> </dist:module>
<dist:module dist:instant="false" dist:onDemand="true" dist:title="@string/title_news_feature"> <dist:fusing dist:include="true"/> </dist:module>
implementation 'com.google.android.play:core:1.6.3' To make your module downloadable on demand add
the following in the app-module's build.gradle,
Pro Tip #1 • Treat the dynamic-module as the individual
app itself
dependencies { ..... api 'androidx.appcompat:appcompat:1.0.2' api 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'com.google.android.play:core:1.6.1' }
In the manifest of the app’s module,
This is our project
dependencies { ..... api 'androidx.appcompat:appcompat:1.0.2' api 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'com.google.android.play:core:1.6.1' }
In the manifest of the app’s module,
dependencies { ..... api 'androidx.appcompat:appcompat:1.0.2' api 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'com.google.android.play:core:1.6.1' }
In the manifest of the app’s module,
Let's learn how to make the dynamic-feature downloadable from the
app's module.
class MainActivity : AppCompatActivity() { lateinit var splitInstallManager: SplitInstallManager lateinit
var request: SplitInstallRequest val DYNAMIC_FEATURE = "news_feature" override fun onCreate(savedInstanceState: Bundle?) { .... } } In App’s MainActivity
override fun onCreate(savedInstanceState: Bundle) { .... initDynamicModules() } private fun
initDynamicModules() { splitInstallManager = SplitInstallManagerFactory.create(this) request = SplitInstallRequest .newBuilder() .addModule(DYNAMIC_FEATURE) .build(); } In App’s MainActivity
Implement Clicks :)
In App’s MainActivity override fun onCreate(savedInstanceState: Bundle) { ........ buttonClick.setOnClickListener
{ if (!isDynamicFeatureDownloaded(DYNAMIC_FEATURE)) { downloadFeature() } else { buttonDeleteNewsModule.visibility = View.VISIBLE buttonOpenNewsModule.visibility = View.VISIBLE } } }
In App’s MainActivity private fun isDynamicFeatureDownloaded(feature: String): Boolean = splitInstallManager.installedModules.contains(feature)
In App’s MainActivity private fun downloadFeature() { splitInstallManager.startInstall(request) .addOnFailureListener {
//on Failure Handle } .addOnSuccessListener { buttonOpenNewsModule.visibility = View.VISIBLE buttonDeleteNewsModule.visibility = View.VISIBLE } .addOnCompleteListener { } }
None
Let’s Open the News Activity
In App’s MainActivity buttonOpenNewsModule.setOnClickListener { val intent = Intent() .setClassName(this,
"com.mindorks.news_feature.newsloader.NewsLoaderActivity") startActivity(intent) }
In App’s MainActivity buttonOpenNewsModule.setOnClickListener { val intent = Intent() .setClassName(this,
"com.mindorks.news_feature.newsloader.NewsLoaderActivity") startActivity(intent) }
In App’s MainActivity buttonDeleteNewsModule.setOnClickListener { val list = listOf(DYNAMIC_FEATURE) splitInstallManager.deferredUninstall(list)
.addOnSuccessListener { buttonDeleteNewsModule.visibility = View.GONE buttonOpenNewsModule.visibility = View.GONE } }
Library Modules
Create an Android Project (App Module) Goto File -> New
-> New Module
None
And Use it how you use other libraries :)
Pro Tip #2 • Checkout Darshan’s Talk to understand this
module for the library creation
When ???
Library Modules Dynamic Delivery Modules
Library Modules Dynamic Delivery Modules
Why this approach ???
• Easily Manageable By Multiple Devs • Maintainability • Reduced
APK Size • Testing New Features
• Easily Manageable By Multiple Devs • Maintainability • Reduced
APK Size • Testing New Features
• Easily Manageable By Multiple Devs • Maintainability • Reduced
APK Size • Testing New Features
• Easily Manageable By Multiple Devs • Maintainability • Reduced
APK Size • Testing New Features
Link to project https://tiny.cc/gdgahm
Any Question? Himanshu Singh @hi_man_shoe
Thanks :) Himanshu Singh @hi_man_shoe