标签: dynamic-feature

在基本模块中找不到动态功能模块中的 Android 提供程序

我在我的动态功能模块中使用了一些库。这些库正在向清单中添加一些提供程序。

例如在我的动态模块中的 build.gradle 文件中:

dependencies {
    ...
    implementation 'com.github.esafirm.android-image-picker:imagepicker:1.11.1'
    ...
}
Run Code Online (Sandbox Code Playgroud)

该库将以下标记添加到清单中:

<provider
        android:name="com.esafirm.imagepicker.helper.ImagePickerFileProvider"
        android:authorities="{$applicationId}.imagepicker.provider"
        android:exported="false"
        android:grantUriPermissions="true" >
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/image_picker_provider_paths" />
</provider>
Run Code Online (Sandbox Code Playgroud)

问题是当我构建我的基本模块时,应用程序崩溃了,因为它找不到提供者。我该如何解决这个问题?

正如此处所述

应用程序基本模块的清单与任何其他应用程序模块的清单相似。请记住,当 Google Play 生成您应用的基础 APK 时,它会将所有模块的清单合并到基础 APK 的清单中。

但为什么只有供应商受到影响?活动是否被忽略?

这是我得到的堆栈跟踪:

java.lang.RuntimeException: Unable to get provider com.esafirm.imagepicker.helper.ImagePickerFileProvider: java.lang.ClassNotFoundException: Didn't find class "com.esafirm.imagepicker.helper.ImagePickerFileProvider" on path: DexPathList[[zip file "/data/app/ir.rashin.mototel-h7B8g42gBcVABkik16vqzw==/base.apk"],nativeLibraryDirectories=[/data/app/ir.rashin.mototel-h7B8g42gBcVABkik16vqzw==/lib/x86, /system/lib]]
    at android.app.ActivityThread.installProvider(ActivityThread.java:6396)
    at android.app.ActivityThread.installContentProviders(ActivityThread.java:5938)
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5853)
    at android.app.ActivityThread.access$1100(ActivityThread.java:199)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1650)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6669)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
 Caused by: java.lang.ClassNotFoundException: …
Run Code Online (Sandbox Code Playgroud)

android android-manifest android-app-bundle dynamic-feature dynamic-delivery

9
推荐指数
1
解决办法
1180
查看次数

动态功能模块上的 UI Espresso 测试

Firebase 测试实验室接受 App Bundle / APK 和 android 测试 APK,并且带有动态功能模块的 UI 测试在 Firebase 测试实验室中失败。错误是关于一些多 dex 问题,表明在基本 apk 中找不到功能模块,如果他们不处理动态功能模块,这是有道理的。想知道是否有人遇到过同样的问题,或者 Firebase 测试实验室团队的某个人可以帮助解决这个问题。

所以问题是为动态功能模块运行 Espresso UI 测试,android studio 无法运行它们,但最新的 gradle 插件可以正确处理它。它基本上首先安装基本模块,然后尝试安装功能测试 apk,一切正常。(对特定方法运行测试有一些问题,但这不是我的问题)。有效的命令行是著名的 connectedAndroidTest 命令。问题是在 Firebase 测试实验室上运行这些。

android-espresso firebase-test-lab dynamic-feature

9
推荐指数
1
解决办法
745
查看次数

无法访问动态特征模块的资源

我正在尝试将新的 Android 动态交付功能添加到我的应用程序中,但是我尝试访问动态功能模块的资源一直失败。

基本思想是加载一个没有代码但一堆矢量文件作为可绘制资源的模块。

我能够加载模块,甚至访问给定模块的资产,但我不知道如何访问资源。

         val res = context.createPackageContext(context.packageName, 0).also {
            SplitCompat.install(it)
         }.resources

         val assetsStream = res.assets.open("test.txt")
         val assetContent = assetsStream.bufferedReader()
                 .use {
                    it.readText()
                 }
         var iconResourceId = res.getIdentifier(stringIdentifier, IDENTIFIER_DRAWABLE, context.packageName)
Run Code Online (Sandbox Code Playgroud)

正如我所说,我能够阅读资产 txt 文件中的文本,但我似乎没有在资源中找到任何可绘制对象。

当我尝试获取我知道在动态模块的资源文件夹中的可绘制对象时,我得到一个 ResourcesNotFoundException

我已通读 Google 提供的 Android 文档,但找不到有关如何访问下载的模块资源的详细信息

https://developer.android.com/guide/app-bundle/playcore#access_installed_modules

android dynamic-feature dynamic-delivery

8
推荐指数
1
解决办法
684
查看次数

如何生成包含动态功能模块的完整APK文件

我的项目具有动态功能模块,我想生成调试或发布包含动态功能的APK。目前,我只能获取基本的APK文件。

基本上,我会像正常应用程序一样生成一个APK文件。但是我无法使用动态功能。是的,我知道动态功能将基于AAB起作用。

有什么方法可以制作普通(基本+所有模块)APK文件?请帮忙。

谢谢

android dynamic-feature

6
推荐指数
2
解决办法
1111
查看次数

由于构建风格问题,无法添加动态功能模块

我想在现有的应用程序中实现一个新的动态功能模块,但由于产品风味问题而不得不放弃。

示例代码可以在这里找到。https://github.com/henningBunk/dynamic_feature_problem

我有三个模块:

  1. 应用程序。应用程序的主要模块。它有两种产品口味:

store:amazongoogle
pay_status:freepro

产生四种组合 :amazonFreeamazonProgoogleFreegooglePro

它取决于lib并列dynamic_feature为动态功能。

  1. 库。一个库模块,app并且dynamic_feature依赖于这个模块。lib只有味道pay_status。所以当我构建例如时。将应用程序作为googleFree风味,lib 将构建它的free风味。

  2. 动态特征。新功能应该是动态功能。这个模块不应该有任何风格。这取决于应用程序和库。

三个 gradle 文件简化为产品风格和依赖项,如下所示:

应用程序模块build.gradle:

apply plugin: 'com.android.application'

android {
    dynamicFeatures = [":faq"]

    flavorDimensions "store", "pay_status"

    productFlavors {
        google { dimension "store" }
        amazon { dimension "store" }

        free { dimension "pay_status" }
        pro { dimension "pay_status" } …
Run Code Online (Sandbox Code Playgroud)

dependencies android gradle dynamic-feature

6
推荐指数
1
解决办法
2053
查看次数

为什么android studio组装我们的dyanimc功能模块测试apk?

我们有一个核心的android应用程序模块(称为app)和一个动态功能模块(称为replay)。即使这是DFM,我们也会在安装时将其包括在内。在我们的DFM的AndroidManifest.xml中:

<dist:module
    dist:instant="false"
    dist:title="@string/title_replay">
    <dist:delivery>
        <dist:install-time />
    </dist:delivery>
    <dist:fusing dist:include="true" />
</dist:module>
Run Code Online (Sandbox Code Playgroud)

我们可以使用CL中的DFM构建apk: $ ./gradlew app:assembleDebug

现在在测试时间...我们的replay功能模块中没有任何仪器测试,只有app模块中。这样我们就可以从命令行运行检测测试了:$ ./gradlew app:connectedDebugAndroidTest

但是,我们最近开始尝试在Android Studio中运行检测测试我们再次只想在app模块上运行测试:

在此处输入图片说明

现在的问题是,我们收到一堆奇怪的“ Android资源链接失败”错误:

What went wrong:
Execution failed for task ':replay:processDebugAndroidTestResources'.
/Users/user/.gradle/caches/transforms-2/files-2.1/48609a786af4d1714850acbdd03ace31/jetified-beacon-ui-1.0.3/

AndroidManifest.xml:15:9-19:54: AAPT: error: resource string/hs_beacon_empty (aka com.example.feature.replay.test:string/hs_beacon_empty) not found.
Run Code Online (Sandbox Code Playgroud)

我们通过几个第三方依赖项(facebook,leakcanary,beacon等)获取这些文件。它们似乎都是将值添加到现有xml文件(strings.xml,AndroidManifest.xml)的库。

看起来是replay构建过程的一部分,AAPT试图在我们的replay模块中查找实际上在其他库中的资源。但是为什么AAPT寻找我们在replay功能模块:com.example.android.feature.replay.test:string/hs_beacon_empty

我对AAPT如何合并动态模块的资源没有完全的了解,而对于仪表测试apk来说,我什至没有了解。

我不明白为什么通过CL可以正常工作,所以我查看了Android Studio构建日志的顶部,并在运行工具测试时看到了这一点。

Executing tasks: [:replay:assembleDebug, :replay:assembleDebugAndroidTest, :app:assembleDebug, :app:assembleDebugAndroidTest]
Run Code Online (Sandbox Code Playgroud)

因此,现在更基本的问题是,为什么在运行针对应用模块的测试时,Android Studio为何尝试汇编重播和重播测试代码?


FWIW我正在运行Android Studio和AGP 3.5 …

android android-testing dynamic-feature

6
推荐指数
2
解决办法
189
查看次数

无法在以下项目变体之间进行选择 :features:myDynamicFeatureModule:

我正在我正在从事的项目方面试验 Android 的动态功能模块(又名按需模块)。

在我的 PoC(概念验证)项目中,动态功能模块 (DFM) 工作正常,gradle 可以毫无问题地构建项目。在完成我的 PoC 之后,我决定将其应用于现有项目。但是,gradle 无法通过以下方式构建项目:

Could not determine the dependencies of task ':my-app:checkSomeBuildFlavorDebugLibraries'.

> Could not resolve all task dependencies for configuration ':my-app:someBuildFlavorDebugMetadataValues'.
   > Could not resolve project :features:myDynamicFeatureModule.
     Required by:
         project :my-app
      > Cannot choose between the following variants of project :features:myDynamicFeatureModule:
          - anotherBuildFlavorDebugAndroidTestCompile
          - anotherBuildFlavorDebugAndroidTestRuntime
          - ...
        All of them match the consumer attributes:

          - Variant 'anotherBuildFlavorDebugAndroidTestCompile' capability myproject.features:myDynamicFeatureModule:unspecified:
              - Unmatched attributes:
                  - Required com.android.build.api.attributes.BuildTypeAttr 'debug' but no value provided.
                  - Required …
Run Code Online (Sandbox Code Playgroud)

android gradle android-build-flavors dynamic-feature dynamic-delivery

6
推荐指数
1
解决办法
5926
查看次数

如何从 .aar 文件中排除 .jar 文件

有没有办法从 .aar 文件中排除 .jar 文件。我的项目没有运行,因为我有一个包含 .aar 文件的模块,其中 Gson.jar 用作库,并且我的主应用程序中也需要它,所以我还需要实现 Gson 依赖项。当我尝试运行我的项目时,出现 multidex 错误:

任务“:app:transformClassesWithBundleMultiDexListForDevelopmentBuildDebug”执行失败。

com.android.build.api.transform.TransformException:生成主 dex 列表时出错。

请帮我解决这个问题。谢谢

dependencies android gson android-gradle-plugin dynamic-feature

5
推荐指数
1
解决办法
1901
查看次数

动态功能更新

我正在我的 Android 应用程序中引入动态功能,并且想知道如果我将仅包含动态功能模块更新的新版本上传到商店会出现什么情况?所有用户都会看到有更新吗?或者只有安装了动态功能的人才能看到它?

举个例子以确保问题清楚。假设该应用程序具有动态功能 D。用户 A 安装了该应用程序,并且还安装了动态功能 D。用户 B 安装的应用程序没有动态功能 D。如果应用程序开发人员将更新上传到仅在动态功能部分有更新的商店。用户 B 会看到应用中有更新吗?

android google-play dynamic-feature

5
推荐指数
1
解决办法
845
查看次数

从主模块的动态特征模块的可绘制文件夹访问图形

为了将我的游戏应用程序分解为 Instant 和 Installable 版本,我对动态模块拆分 API 交付感到满意。我一直在关注此处的 Codelabs 教程https://codelabs.developers.google.com/codelabs/on-demand-dynamic-delivery/index.html#0。不幸的是,它使用 Kotlin 作为 MainActivity 代码,该代码不如 Java 特定,但如果您已经完成了 Kotlin 教程,仍然可以很好地遵循。该示例包括使用以下内容访问“资产”功能模块中“资产”文件夹中的文本图块:

private const val packageName = "com.google.android.samples.dynamicfeatures.ondemand"

val assetManager = createPackageContext(packageName, 0).assets
// Now treat it like any other asset file.
val assets = assetManager.open("assets.txt")
val assetContent = assets.bufferedReader()
           .use {
               it.readText()
           }
Run Code Online (Sandbox Code Playgroud)

现在我只想访问动态功能模块的可绘制文件夹中的图形文件。我将只使用我的动态功能模块来存储大型图形,这些图形将使我超过 10 MG 的即时应用程序下载限制。什么是最干净的方法来做到这一点?

主要的“应用程序”模块:

在此处输入图片说明

“应用程序”中的 Java 代码:

loadTexture(R.drawable.aaa_image);

Bitmap bitmap;
public void loadTexture(final int resourceId){
    bitmap = BitmapFactory.decodeResource(context.getResources(), resourceId, options);
    ***
Run Code Online (Sandbox Code Playgroud)

动态交付的“安装资产”模块:

在此处输入图片说明

'app'中的仍然是java代码,不会到达:

 loadTexture(R.drawable.testgraphic);
 cannot resolve symbol 'testgraphic'
Run Code Online (Sandbox Code Playgroud)

graphics android module dynamic-feature

5
推荐指数
2
解决办法
1187
查看次数