简体   繁体   中英

Android Dynamic Feature : Error -2 Module Unavailable

I have been debugging all day with no result, I've followed every documentation and google code labs and uploaded the bundle to internal testing and the error persists: Module Unavailable, below is my implementation:

Module AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest 
 xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:dist="http://schemas.android.com/apk/distribution"
 package="com.appshive.shop"
 >

<dist:module
    dist:instant="false"
    dist:title="@string/measure">
    <dist:delivery>
        <dist:on-demand />
    </dist:delivery>
    <dist:fusing dist:include="true" />
</dist:module>
</manifest>

Module build.gradle:

plugins {
id 'com.android.dynamic-feature'
id 'kotlin-android'
id 'kotlin-kapt'
id 'kotlin-android-extensions'
}
android {
compileSdkVersion 30
buildToolsVersion "30.0.2"

defaultConfig {
    minSdkVersion 22
    targetSdkVersion 30
}

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
}

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
    jvmTarget = '1.8'
}
}

and the module have fragments along with some dependencies for the them.

In the base app Android Manifest:

I've added this

dynamicFeatures = [':measure']
android:name=".core.ShopApplication"

and my application id in build.gradle is: com.appshive.ecommerce

my application class extends SplitCompatApplication

class ShopApplication: SplitCompatApplication(){

override fun onCreate() {
    super.onCreate()
    Timber.plant(DebugTree())
    SplitCompat.install(this)
    startKoin {
        androidContext(this@ShopApplication)
        modules(listOf(appModule, repoModule))
    }

}

I have only 1 activity in all the project: Main Activity and it contain

private lateinit var manager: SplitInstallManager

and in onCreate I initialised it: manager = SplitInstallManagerFactory.create(this)

and I'm checking if module is available I'm opening the fragment else:

val request = SplitInstallRequest.newBuilder()
    .addModule(name)
    .build()

manager.startInstall(request).addOnSuccessListener {
    makeToast("Successss")
}.addOnFailureListener { e->
    makeToast(e.message.toString()+" as")
}

and I am registering listener to the manager:

override fun onPause() {
    manager.unregisterListener(listener)
    super.onPause()
}
override fun onResume() {
    manager.registerListener(listener)
    super.onResume()
}

that's all and then I generate signed bundle using my key and upload it to internal test after that I install it on my phone and then an error occurs: Error -2 Module Unavailable

I have tried all the methods on the internet with no luck I don't know what I'm missing. is it because of bundle signing or because of packaging?

when I change the module to install time module it works like a charm.

When I was working on this feature, I was testing with Playstore's Internal Test feature only.

Later on I came to know that there is another way to do it locally using a tool named Bundle Tool .

You can download it from given link. After downloading Bundle Tool file, you need to generate apk using it.

bundletool build-apks 
--bundle=app/build/outputs/bundle/debug/bundle.aab
--output=my_app.apks

Ref: Android App Bundle

PS. when I was doing this feature in my application, I was develop it using Java code, But I am 100% sure it will work with kotlin code as well.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM