大多数应用程序项目不需要太多的努力来支持动态交付。这是因为包含应用程序基本APK的代码和资源的模块是标准的应用程序模块,在Android Studio中创建新应用程序项目时,默认情况下会得到这个模块。也就是说,将下面的app插件应用于其构建的模块。gradle文件提供应用程序基本功能的代码和资源。

// The standard application plugin creates your app's base module.
apply plugin: 'com.android.application'

此模块中包含的所有代码和资源都包含在应用程序的基本APK中。

除了为应用程序提供核心功能外,baseModule 还提供许多构建配置和清单条目,这些配置和清单条目会影响整个应用程序项目。例如,应用程序包的签名由base moudle块提供的信息决定,并且所有应用程序apk的版本控制都在基本模块清单中的versionCode属性上指定。下面将描述基本模块的其他重要方面。

 

Base module manifest

App base module的manifest类似于任何其他应用程序模块。请记住,当谷歌Play生成应用程序的base APK时,它将所有模块的清单合并到base APK的清单中。所以,如果你正在考虑在你的app项目中添加动态功能模块,那么你应该记住base的APK manifest的一些方面:

1.因为Base APK总是先安装的,所以它应该为你的app提供主入口点。也就是说,它应该声明一个activity with the following intent filter:

<intent-filter>
     <action android:name="android.intent.action.MAIN" />
     <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

2.当按需下载动态功能模块时,运行Android 6.0 (API level 23)及以下版本的设备在完成新模块的安装之前需要重新启动应用程序。但是,如果希望能够在下载后立即访问下载模块的代码和资源,则应该在manifest中包含对SplitCompat库的支持。

3.同样,在运行Android 6.0 (API级别23)或更低的设备上,应用程序需要重新启动才能应用新的清单条目。因此,如果在下载动态特性模块时需要某些权限或服务,请考虑将它们包含在基本模块的manifest中。

4.Android App Bundles包括对未压缩的本地库的支持。因此,如果您在应用程序中包含本机库,并希望减少磁盘使用,请在基本模块的清单中包含以下内容:

<application
    android:extractNativeLibs="false"
    ... >

 

Base module构建配置

对于大多数现有的应用程序项目,您不需要更改基本模块的构建配置中的任何内容。但是,如果您正在考虑将动态特性模块添加到您的app项目中,那么对于基本模块的构建配置,您应该记住以下几个方面:

1.App signing:您不需要在构建配置文件中包含签名信息,除非您希望从命令行构建应用程序包。但是,如果确实包含签名信息,则应该只将其包含在Base module的构建配置文件中。

2.Code shrinking:如果您想为整个应用程序项目(包括其动态特性模块)启用代码收缩,必须从基本模块的构建开始执行。gradle文件。也就是说,您可以在动态特性模块中包含自定义的ProGuard规则,但是动态特性模块构建配置中的minifyEnabled属性将被忽略

3.The splits block is ignored在构建应用程序包时,Gradle会忽略android.splits block中的属性。如果你想控制你的app bundle支持哪种类型的配置,那就使用android吧。绑定以禁用配置apk的类型。

4.App versioning:Base module确定整个应用程序项目的版本代码和版本名称。

 

重新启用或禁用配置apk类型

默认情况下,当您构建一个app bundle时,它支持为每一组语言资源、屏幕密度资源和ABI库生成配置apk。使用android。在基本模块的构建中捆绑块。gradle文件,如下所示,你可以禁用对一种或多种配置apk的支持:

android {
    // When building Android App Bundles, the splits block is ignored.
    splits {...}

    // Instead, use the bundle block to control which types of configuration APKs
    // you want your app bundle to support.
    bundle {
        language {
            // Specifies that the app bundle should not support
            // configuration APKs for language resources. These
            // resources are instead packaged with each base and
            // dynamic feature APK.
            enableSplit = false
        }
        density {
            // This property is set to true by default.
            enableSplit = true
        }
        abi {
            // This property is set to true by default.
            enableSplit = true
        }
    }
}

 

管理应用程序更新

通过Android App Bundle 和 Dynamic Delivery,你不再需要为你上传到谷歌Play的多个apk管理版本代码。相反,你只管理一个版本代码在你的应用程序的基本模块,如下所示:

// In your base module build.gradle file
android {
    defaultConfig {
        …
        // You specify your app’s version code only in the base module.
        versionCode 5
        versionName "1.0"
    }
}

上传app bundle后,谷歌Play使用base module中的version code 将相同的version vode 分配给它从该包生成的所有apk。也就是说,当一个设备下载并安装您的app时,该app的所有split apk共享相同的version code。

当你想用新的代码或资源更新你的app时,你必须在你的app base module 中更新版本代码,并构建一个新的、完整的app bundle。当您将该app bundle上传到谷歌Play时,它将根据base module指定的version code生成一组新的apk。随后,当用户更新您的app时,谷歌Play为他们提供当前安装在设备上的所有apk的更新版本。也就是说,所有已安装的apk都更新为新版本代码。

注意:因为您不再需要为您的应用程序的所有apk管理version code,您不再需要包含基于设备配置动态修改version code的逻辑。

 

下载其他配置apk

上述更新流的一个例外是,当已安装的应用程序需要额外的配置apk时。考虑这样一个用户,他在已经下载了您的应用程序之后更改了默认的系统语言。如果您的应用程序支持该语言,那么设备就会从谷歌Play请求并下载这些语言资源的额外配置apk。但是,这种对应用程序的更新不会更改其version code,因此设备只下载并安装所需的配置APKs。