Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to generate full APK file including dynamic feature module

My project has dynamic feature module and I would like to generate debug or release APK including the dynamic feature. Currently I can get only base APK file.

Basically I would generate an APK file like normal application. But I couldn't do with dynamic feature. Yes, I know dynamic feature will work based on AAB.

Is there any ways to make a normal(base + all modules) APK file?. Please help on this.

Thanks

like image 866
chain Avatar asked Feb 23 '19 17:02

chain


People also ask

What is dynamic feature module?

Dynamic feature modules allow you to separate certain features and resources from the base module of your app and include them in your app bundle. Through Dynamic Delivery, users can later download and install those components on demand after they've already installed the base APK of your app.

How is dynamic feature module implemented?

To add a dynamic feature module to your app project using Android Studio(3.2 Canary 14+), proceed as follows: Note : Before creating a dynamic module, you have to create you app bundle. Select File > New > New Module from the menu bar. In the Create New Module dialog, select Dynamic Feature Module and click Next.

How is APK file created?

To generate a signed APK file, open the Build menu from the toolbar and select Generate Signed Bundle/APK. This opens up a screen where you have to select between creating an Android App Bundle and creating an APK file. Check the APK radio button and proceed to the next window.


3 Answers

I don't see it documented anywhere, but the Android Gradle build tools include tasks to extract the universal APK for you. You can use something similar to:

./gradlew :yourmodule:packageDebugUniversalApk

Under the hood it uses bundletool and does essentially the same thing as the other answer, but it's nice to be able to do it from Gradle.

like image 90
kabuko Avatar answered Oct 16 '22 14:10

kabuko


You can specify if your on demand module needs to be included in the universal APK that is usually generated for older devices, and then you can use bundletool to generate an Universal APK from the App Bundle:.

In this particular case, you can use something like:

bundletool build-apks --bundle <bundle_file> --output <APKS file> --ks <key_store> --key-pass <jks password> --ks-key-alias <key_alias> --ks-pass <key password> --overwrite --mode=universal

The key point is to include the --mode=universal this instruct bundletool to generate an Universal APK that will include all modules that have <dist:fusing dist:include="true"/> in the manifest.

In a similar way, when you run your project from Android Studio on a device, using the default configuration for Run (Deploy = Default APK) it includes all of your on demand modules.
Instead, when you run the application from Studio using the Run configuration (Deploy = APK from AppBundle) you can pick and choose which modules are installed.

However, in both cases, you cannot test on demand module downloads if you don't go through the Play store.

Note (November 2020)

As reported in another answer below, the Android Gradle Plugin includes a couple of undocumented tasks that can be used to generate Debug and unsigned Release universal APKs of your application.

The task related to the Debug version can be a quick alternative if you just need this type of build:

./gradlew :app:packageDebugUniversalApk

This task will generate (by default) app/build/outputs/universal_apk/debug/app-debug-universal.apk.

Update June 2019

Google introduced at I/O Internal App Sharing that allows to allow testing easily your App Bundles and APKs, including debug builds:

With internal app sharing, you can quickly share an app bundle or APK with your internal team and testers by uploading an APK or app bundle on the internal app sharing upload page.

like image 44
pfmaggi Avatar answered Oct 16 '22 15:10

pfmaggi


Download bundletool jar file from Github (Latest release > Assets > bundletool-all-version.jar file). Rename that file to bundletool.jar

  1. Generate your aab file from Android Studio eg: myapp-release.aab
  2. Run following command:

java -jar "path/to/bundletool.jar" build-apks --bundle=myapp-release.aab --output=myapp.apks --ks="/path/to/myapp-release.keystore" --ks-pass=pass:myapp-keystore-pass --ks-key-alias=myapp-alias --key-pass=pass:myapp-alias-pass

  1. myapp.apks file will be generated
  2. below is the command to generate the universal apk

java -jar bundletool.jar build-apks --bundle=nhl.aab --output=nhl.apks --mode=universal

`

like image 1
Vivek Kumar Samele Avatar answered Oct 16 '22 15:10

Vivek Kumar Samele