Пакеты приложений Android: при синтаксическом анализе пакета возникла проблема (только модуль динамических функций)
Я пытаюсь реализовать комплект приложений Android, и мне нужно, чтобы он работал за пределами магазина 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
,
Используя Build > Bundle Bundle (s) / APK (s) > Build Bundle (s), все работает нормально, я получаю 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.apk
а также dynamic_feature-master.apk
просто перетаскивая их из out.apks
открыл в WinRar.
Я устанавливаю base-master.apk
и работает нормально, за исключением, когда я нажимаю на кнопку, потому что, очевидно, бросает java.lang.ClassNotFoundException
не найти ModuleActivity
,
Хотя, когда я пытаюсь установить мой dynamic_feature-master.apk
Я получаю сообщение о том, что There was a problem while parsing the package
и я не вижу заметной ошибки в logcat, когда выходит это сообщение. Я не знаю, как идти вперед.
2 ответа
Нехорошо просто распаковывать apks с помощью winrar out.apks
файл. Если вы хотите установить только базовый apk, вы можете сделать это с помощью (я предполагаю, что имя вашего базового модуля base-master
):
bundletool install-apks --apks=D:\folder\out.apks --modules="base-master"
--modules
Опция дает вам возможность установить только указанные модули. Тем не менее, я думаю, что нет способа проверить динамическую доставку (загрузка динамических модулей по требованию) локально, поскольку ваше приложение взаимодействует с библиотекой Play Core.
Кстати, если вы настаиваете на извлечении APK, вы можете использовать пакетный инструмент:
bundletool extract-apks
--apks=D:\folder\out.apks
--output-dir=D:\folder2
Когда вы используете 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
сделать то же самое. Если вы чувствуете необходимость в этом, подайте запрос на функцию в проекте gitub bundletool.
Однако обратите внимание, что он не имитирует точно, что произойдет, когда вы устанавливаете модуль через API Play Core, и, в частности, вы не получите INSTALLED
Перезвоните.
Наилучший способ проверить установку модулей на сегодняшний день - пройти внутренний тестовый трек Play Console.
Надеюсь, это поможет,