Android应用程序捆绑包:解析程序包时出现问题(仅动态功能模块)

时间:2019-04-04 15:42:14

标签: android module android-app-bundle dynamic-delivery

我正在尝试实施Android App Bundle,并且需要它在Play商店的外部范围内工作。

  • 我创建了一个新项目,其中的活动包含一个按钮
  • 我通过文件> 新建> 新模块> 动态功能模块创建了新的动态功能模块

现在,我的Android项目结构如下:(省略了没有意义的文件)

app
 ├ AndroidManifest.xml
 ├ java
 │  └ my.package.name
 │    └ MainAtivity
 └ res
    └ layout
       └ activity_main.xml

dynamic_feature
 ├ AndroidManifest.xml
 ├ java
 │  └ my.package.name_dynamic_feature
 │     └ ModuleActivity
 └ res
    └ layout
       └ activity_module.xml
Gradle Scripts
 ├ build.gradle (project)
 ├ bulid.gradle (app)
 └ build.gradle (dynamic_feature)

我的build.gradle (app)文件包含

apply plugin: 'com.android.application'
android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "my.package.name"
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    dynamicFeatures = [":dynamic_feature"]
    bundle {
        language { enableSplit = true}
        density { enableSplit = true}
        abi { enableSplit = true}
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    api 'com.android.support:appcompat-v7:28.0.0-rc02'
    api 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

我的build.gradle (dynamic_feature)文件包含

apply plugin: 'com.android.dynamic-feature'
android {
    compileSdkVersion 28
    defaultConfig {
        minSdkVersion 21
        targetSdkVersion 28
    }
}
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation project(':app')
}

出于测试目的,我请求dynamic_feature

Intent intent = new Intent()
    .setClassName(MainActivity.this, "my.package.name_dynamic_feature.ModuleActivity");
startActivity(intent);

OnClickListener中附加到按钮上的MainActivity中。

使用构建> 构建捆绑包/ APK > 构建捆绑包,一切正常,我明白了app.aab文件,然后通过以下命令使用out.apks生成bundletool文件

java -jar bundletool-all-0.9.0.jar build-apks --bundle=D:\folder\app.aab --output=D:\folder\out.apks

然后,我将base-master.apkdynamic_feature-master.apk提取出来,只需将它们从WinRar中打开的out.apks中拖出即可。

我安装了base-master.apk并可以正常工作,除了单击按钮外,因为它显然抛出java.lang.ClassNotFoundException却找不到ModuleActivity

当我尝试安装dynamic_feature-master.apk时,我收到一条消息,提示There was a problem while parsing the package,并且当出现此消息时,logcat中没有发现任何明显的错误。我不知道如何前进。

2 个答案:

答案 0 :(得分:2)

当您使用adb install且没有其他标志时,它将尝试替换该应用程序(从而删除基本APK)。由于动态模块APK缺少基本功能,因此无法安装。

要在基本APK顶部手动安装动态模块APK(及其配置拆分),可以使用以下命令:

adb install-multiple -r --dont-kill -p com.myapp module-master.apk module-en.apk module-armv7a.apk module-xxxhdpi.apk

我们可能应该在bundletool中添加一个便捷方法来做到这一点。如果您有此需要,请在bundletool github project上提出功能请求。

但是请注意,它不能完全模拟当您通过Play Core API安装模块时会发生的情况,尤其是不会获得INSTALLED回调。

今天测试模块安装的最佳方法是通过Play控制台的内部测试轨道。

希望有帮助,

答案 1 :(得分:0)

仅使用winrar out.apks文件提取apk是不可行的。如果您只想安装基本apk,则可以通过以下方式进行安装(我假设您的基本模块的名称为base-master):

bundletool install-apks --apks=D:\folder\out.apks --modules="base-master"

通过--modules选项,您可以仅安装指定的模块。但是,我猜没有办法在本地测试动态交付(按需下载动态模块),因为您的应用与Play Core library进行了交互。

顺便说一句,如果您坚持要提取APK,则可以使用bundle tool

bundletool extract-apks 
     --apks=D:\folder\out.apks
     --output-dir=D:\folder2