Android动态功能不在.apk中

时间:2018-12-10 22:38:21

标签: android kotlin-android-extensions

我的项目包含一个名为feature_login的动态功能

enter image description here

AndroidManifest.xml文件中,我将功能配置为included而不是on demand

<manifest ...>
    <dist:module
            dist:onDemand="false" dist:title="@string/title_feature_login">
        <dist:fusing dist:include="true"/>
    </dist:module>
</manifest>

因此,我假定默认情况下,给定功能将包含在.apk文件中。但是当我使用Android Studio生成.apk时

enter image description here

似乎不包含该功能,因为当我按下启动该功能的按钮时,应用崩溃了。

但是当我使用Run按钮在模拟器上的Android Studio中运行该应用程序时,该应用程序可以正常工作。

问题

  1. 动态功能是否适合登录之类的用例?
  2. 如何构建包含动态功能的调试应用?
  3. 如果dist:onDemand="false"dist:fusing dist:include="true"是否包含.apk中的动态功能?
  4. 动态功能是否适合您希望拥有单独的模块(例如,登录名,配置文件详细信息等)或更适合使用库模块的情况?

3 个答案:

答案 0 :(得分:1)

动态功能需要与app-bundle(而不是APKs)一起使用。

调试应用程序时,可以通过修改现有的run/debug configuration来包含动态功能。

首先,选择所需的Android应用配置,然后 在常规标签中要部署的动态功能下,选中要在部署时包括的每个动态功能模块旁边的框 您的应用。

答案 1 :(得分:1)

  
      
  1. 动态功能是否适合登录之类的用例?
  2.   

如果可以在仍然使用登录名的情况下将依赖关系与应用程序的其余部分脱钩,请确保。

  
      
  1. 如何构建包含动态功能的调试应用?
  2.   

使用bundletool或使用Android Studio通过应用程序捆绑流程进行操作。 您还可以在所有相关的调试apk中使用Observable<SearchState> get data { return _requestStream.asyncMap((page) => _refreshData(page)); } ,然后使用Future<SearchState> _refreshData(int page) { ... return SeachState(data: 'some data'); }

  
      
  1. 如果./gradlew assembleadb install-multiple是否包含.apk中的动态功能?
  2.   

不。定影标志与.aab有关。当目标设备在API <21上运行时,会接受APK融合。

  
      
  1. 动态功能是否适合您希望拥有单独的模块(例如,登录名,配置文件详细信息等)或更适合使用库模块的情况?
  2.   

我建议将动态功能模块用于面向用户的功能。所以例如个人资料,登录名,购物车,高级会员无论什么都是不错的起点。 有一些高级用例可以节省更多设备空间,但是它们依赖于通过on demandconditional delivery进行延迟交付。

有关更多信息,建议您查看Plaid示例应用程序或观看the presentations on the topic中的一个。

答案 2 :(得分:0)

如果选择了 Build APKs 选项,那么它将创建多个与您应用中的动态功能数量相同的 Apk。

但似乎要求是创建一个具有所有动态功能的 APK,所以要做到这一点

a) 对于调试版本:

Edit Configuration -> General -> (Look for dynamic features to deploy option) -> 选择所有动态特性以将它们包含到构建中 -> Apply -> OK

b) 对于发布版本:

生成已签名的 App Bundle 并按照以下步骤操作:

i) 从以下链接下载捆绑工具: https://github.com/google/bundletool/releases/download/1.5.0/bundletool-all-1.5.0.jar

ii) 在终端或 android studio 终端中执行以下命令,在上述 bundle 的同一目录中

java -jar bundletool-all-1.5.0.jar build-apks --bundle {path/of/yours/.aab} --output {output/path}/name-of-output.apks --ks <key-path> --key-pass pass:{key-password} --ks-key-alias {key-alias}
--ks-pass pass:{key-alias-password} --overwrite --mode=universal

用您自己的值替换 {} 字符串,执行上述命令后,它将创建一个通用的 .apks 文件。 (注意是 .apks ,不是 .apk)

iii) 将 .apks 安装到设备中:

adb install -r <output/path>/name-of-output.apks

希望它会有所帮助。