Android App Bundle:解析包时出现问题(仅限动态功能模块)
Android App Bundles: there was a problem while parsing the package (dynamic feature module only)
我正在尝试实施 Android App Bundle,我需要它在 Play 商店 之外工作。
- 我创建了一个新项目,其中 activity 包含一个按钮
- 我通过 File > New > New Module 创建了一个新的动态功能模块> 动态功能模块
现在我的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
中的按钮。
使用 Build > Build Bundle(s)/APK(s) > Build Bundle(s) 一切正常,我得到我的 app.aab
文件,然后使用 bundletool
和以下命令生成 out.apks
文件
java -jar bundletool-all-0.9.0.jar build-apks --bundle=D:\folder\app.aab --output=D:\folder\out.apks
然后,我提取 base-master.apk
和 dynamic_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 中没有看到任何明显的错误。我不知道如何前进。
直接用winrar out.apks
文件解压apks不行。如果你只想安装基础 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
当您使用 adb install
而没有附加标志时,它会尝试替换该应用(从而删除基本 APK)。由于动态模块APK缺少base,所以安装失败
要在基本 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 管理中心的内部测试轨道。
希望对您有所帮助,
我正在尝试实施 Android App Bundle,我需要它在 Play 商店 之外工作。
- 我创建了一个新项目,其中 activity 包含一个按钮
- 我通过 File > New > New Module 创建了一个新的动态功能模块> 动态功能模块
现在我的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
中的按钮。
使用 Build > Build Bundle(s)/APK(s) > Build Bundle(s) 一切正常,我得到我的 app.aab
文件,然后使用 bundletool
和以下命令生成 out.apks
文件
java -jar bundletool-all-0.9.0.jar build-apks --bundle=D:\folder\app.aab --output=D:\folder\out.apks
然后,我提取 base-master.apk
和 dynamic_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 中没有看到任何明显的错误。我不知道如何前进。
直接用winrar out.apks
文件解压apks不行。如果你只想安装基础 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
当您使用 adb install
而没有附加标志时,它会尝试替换该应用(从而删除基本 APK)。由于动态模块APK缺少base,所以安装失败
要在基本 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 管理中心的内部测试轨道。
希望对您有所帮助,