diff --git a/androidmk/cmd/androidmk/android.go b/androidmk/cmd/androidmk/android.go index abe79179e..1ecda2d5c 100644 --- a/androidmk/cmd/androidmk/android.go +++ b/androidmk/cmd/androidmk/android.go @@ -189,6 +189,7 @@ func init() { "LOCAL_PRIVILEGED_MODULE": "privileged", "LOCAL_AAPT_INCLUDE_ALL_RESOURCES": "aapt_include_all_resources", "LOCAL_USE_EMBEDDED_NATIVE_LIBS": "use_embedded_native_libs", + "LOCAL_USE_EMBEDDED_DEX": "use_embedded_dex", "LOCAL_DEX_PREOPT": "dex_preopt.enabled", "LOCAL_DEX_PREOPT_APP_IMAGE": "dex_preopt.app_image", diff --git a/java/aar.go b/java/aar.go index f6a3d3a75..7495bdad2 100644 --- a/java/aar.go +++ b/java/aar.go @@ -76,6 +76,7 @@ type aapt struct { extraAaptPackagesFile android.Path isLibrary bool uncompressedJNI bool + useEmbeddedDex bool aaptProperties aaptProperties } @@ -182,7 +183,8 @@ func (a *aapt) buildActions(ctx android.ModuleContext, sdkContext sdkContext, ex manifestFile := proptools.StringDefault(a.aaptProperties.Manifest, "AndroidManifest.xml") manifestSrcPath := android.PathForModuleSrc(ctx, manifestFile) - manifestPath := manifestMerger(ctx, manifestSrcPath, sdkContext, staticLibManifests, a.isLibrary, a.uncompressedJNI) + manifestPath := manifestMerger(ctx, manifestSrcPath, sdkContext, staticLibManifests, a.isLibrary, + a.uncompressedJNI, a.useEmbeddedDex) linkFlags, linkDeps, resDirs, overlayDirs, rroDirs := a.aapt2Flags(ctx, sdkContext, manifestPath) diff --git a/java/android_manifest.go b/java/android_manifest.go index 6d4399ddb..e63fb8049 100644 --- a/java/android_manifest.go +++ b/java/android_manifest.go @@ -44,7 +44,7 @@ var manifestMergerRule = pctx.AndroidStaticRule("manifestMerger", "libs") func manifestMerger(ctx android.ModuleContext, manifest android.Path, sdkContext sdkContext, - staticLibManifests android.Paths, isLibrary bool, uncompressedJNI bool) android.Path { + staticLibManifests android.Paths, isLibrary bool, uncompressedJNI, useEmbeddedDex bool) android.Path { var args []string if isLibrary { @@ -62,6 +62,10 @@ func manifestMerger(ctx android.ModuleContext, manifest android.Path, sdkContext } } + if useEmbeddedDex { + args = append(args, "--use-embedded-dex=true") + } + // Inject minSdkVersion into the manifest fixedManifest := android.PathForModuleOut(ctx, "manifest_fixer", "AndroidManifest.xml") ctx.Build(pctx, android.BuildParams{ diff --git a/java/app.go b/java/app.go index 47f4f0d80..96975828d 100644 --- a/java/app.go +++ b/java/app.go @@ -73,6 +73,10 @@ type appProperties struct { // sdk_version or min_sdk_version is set to a version that doesn't support it (<23), defaults to false for other // module types where the native libraries are generally preinstalled outside the APK. Use_embedded_native_libs *bool + + // Store dex files uncompressed in the APK and set the android:useEmbeddedDex="true" manifest attribute so that + // they are used from inside the APK at runtime. + Use_embedded_dex *bool } type AndroidApp struct { @@ -141,6 +145,7 @@ func (a *AndroidApp) DepsMutator(ctx android.BottomUpMutatorContext) { func (a *AndroidApp) GenerateAndroidBuildActions(ctx android.ModuleContext) { a.aapt.uncompressedJNI = a.shouldUncompressJNI(ctx) + a.aapt.useEmbeddedDex = Bool(a.appProperties.Use_embedded_dex) a.generateAndroidBuildActions(ctx) } @@ -157,6 +162,10 @@ func (a *AndroidApp) shouldUncompressJNI(ctx android.ModuleContext) bool { // Returns whether this module should have the dex file stored uncompressed in the APK. func (a *AndroidApp) shouldUncompressDex(ctx android.ModuleContext) bool { + if Bool(a.appProperties.Use_embedded_dex) { + return true + } + if ctx.Config().UnbundledBuild() { return false }