如下是我這個系列的相關文章,有興趣能夠參考一下,能夠給個喜歡或者關注個人文章。 [Android]如何作一個崩潰率少於千分之三噶應用app--章節列表java
國內的插件化出不了海,而Google終於也出了組件化和插件化的模型了,這一節就是帶你感覺一下來自官方的威力。 1.只有上線google市場的應用才能使用。 2.先下載Android Studio 3.3吧,gradle會默認使用最新的4.9,騷年 不符合以上的條件的同窗,請自動略過吧android
1.初始下載的大小更加小 2.能夠只下載地區資源 3.安裝更加快 4.能夠動態更新json
1.手機要有google store和google play 2.須要上傳你的簽名文件到google play 3.最低版本支持api 21 4.低於api21的第一次下載就會下載完整包,會優化地區和資源配置,可是沒法作到動態更新 5.base app不能大於100M,動態更新的aab文件不要大於10M,並且最好要有下載提示api
1.Base App 首次安裝到手機的資源和文件,基礎的dex資源bash
2.Configuration APKs native libraries 和適配當前手機屏幕分辨率的資源網絡
3.Dynamic feature APKs 不須要在首次安裝就加載的模塊,動態加載模塊,打包後是.aab後綴的文件。架構
操做基礎介紹 動態更新的module必須使用Dynamic Feature Module app
默認就是選擇Android 5.0版本 ide
應用於app商店使用下載和安裝動態功能的模塊,若是下載的機型低於api21,會直接全量下載動態模塊。 組件化
建立後生成的AndroidManifest.xml文件,其中dist中的內容是用於動態更新配置的。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:dist="http://schemas.android.com/apk/distribution"
package="com.hotflyer.bussiness">
<dist:module
dist:onDemand="true"
dist:title="@string/title_bussiness">
<dist:fusing dist:include="true" />
</dist:module>
</manifest>
複製代碼
1.最重要使用到的庫是play:core,這個庫是使用動態更新提供接口
api 'com.google.android.play:core:1.3.0'
複製代碼
2.依賴關係如圖
加載到模塊的時候使用到SplitInstallRequest// Create request to install a feature module by name.
val request = SplitInstallRequest.newBuilder()
.addModule(name)
.build()
// Load and install the requested feature module.
manager.startInstall(request)
複製代碼
3.添加加載監聽
/** Listener used to handle changes in state for install requests. */
private val listener = SplitInstallStateUpdatedListener { state ->
val multiInstall = state.moduleNames().size > 1
state.moduleNames().forEach { name ->
// Handle changes in state.
when (state.status()) {
SplitInstallSessionStatus.DOWNLOADING -> { //網絡拉取動態模塊
// In order to see this, the application has to be uploaded to the Play Store.
displayLoadingState(state, "Downloading $name")
}
SplitInstallSessionStatus.REQUIRES_USER_CONFIRMATION -> { //須要用戶確認選項(如更新play商店)
/*
This may occur when attempting to download a sufficiently large module.
In order to see this, the application has to be uploaded to the Play Store.
Then features can be requested until the confirmation path is triggered.
*/
startIntentSender(state.resolutionIntent().intentSender, null, 0, 0, 0)
}
SplitInstallSessionStatus.INSTALLED -> { //成功下載回調
onSuccessfulLoad(name, launch = !multiInstall)
}
SplitInstallSessionStatus.INSTALLING -> //安裝中
displayLoadingState(state, "Installing $name")
SplitInstallSessionStatus.FAILED -> { //安裝失敗
Log.e(TAG, "Error: ${state.errorCode()} for module ${state.moduleNames()}")
}
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
manager = SplitInstallManagerFactory.create(this) //拆分app管理
initializeViews()
}
override fun onResume() {
// Listener can be registered even without directly triggering a download.
manager.registerListener(listener) //註冊監聽
super.onResume()
}
override fun onPause() {
// Make sure to dispose of the listener once it's no longer needed. manager.unregisterListener(listener) //銷燬監聽 super.onPause() } 複製代碼
4.跳轉到相應關係,由於依賴關係的問題,只能經過包名跳轉。
/** Launch an activity by its class name. */
private fun launchActivity(className: String) {
Intent().setClassName(packageName, className)
.also {
startActivity(it)
}
}
複製代碼
可是熟悉跳轉邏輯,應該會明白這種狀況,能夠作一個適配的路由也是能夠正常跳轉的。
5.還能動態移除模塊
/** Request uninstall of all features. */
private fun requestUninstall() {
toastAndLog("Requesting uninstall of all modules." +
"This will happen at some point in the future.")
val installedModules = manager.installedModules.toList()
manager.deferredUninstall(installedModules).addOnSuccessListener {
toastAndLog("Uninstalling $installedModules")
}
}
複製代碼
6.須要注意的是動態添加native so須要使用SplitInstallHelper.loadLibrary加載
SplitInstallHelper.loadLibrary(this, "hello-jni")
複製代碼
7.base module中須要配置dynamicFeature,纔會編譯AndroidManifest.xml中方向合併Dynamic library的AndroidManifest.xml
android{
dynamicFeatures = [':features:kotlin',
':features:java',
':features:native',
':features:assets', ":bussiness"]
}
複製代碼
在build/intermediates/merged_manifests中能夠找到合併的AndroidManifest
8.在build/intermediates/feature_set_metadata中能夠看到feature-metadata.json 上面是有一些Dynamic library的信息的
9.play core的庫是通過混淆的,除了個別幾個對外使用的文件外,所有混淆,部分原理只能參照國內的插件化了。 提供了SplitCompat.install的方式安裝,可是最低只兼容到api19,即4.4
10.須要配置Application,有兩種方式,繼承SplitCompatApplication,或者使用SplitCompat.install(this)
11.編譯方式如圖,會生成.aab格式的文件
1.由於會將四大組件信息都預先註冊到合併的base AndroidManifest當中,那麼沒法新增四大組件,暫時不能像國內這樣熱更新。 2.比較適合使用的場景是熱修復和地區適配場景。 3.動態library也是須要上傳給google審覈的
相比於普通的組件化架構,其啓動入口是從base 的Application當中,其餘的動態模塊都須要下載後才能使用。
那麼就須要一個啓動加載畫面下載App module和重要的module,而後再使用後臺下載加載其餘內容,而後模塊跳轉前,須要捕獲異常和預斷定模塊加載是否完成,保證程序不會崩潰。
……2018.7.23更新…… google store 發佈應用,須要選擇是否使用App Bundle,若是使用了,那麼將會從新去打包文件。會形成,你在google市場上下載的包和在其餘市場中下載的包,包簽名不一致,沒法覆蓋安裝。若是在國內渠道發佈,將沒法用google市場中的app覆蓋安裝。 若是保持簽名選退出計劃,若是使用Android app bundle 選繼續
詳細說明這個只有一次機會,選擇以後,不會存在更改了,因此請慎重。
羣1已滿,能夠進羣2學習組件化