Пакеты приложений Android: при синтаксическом анализе пакета возникла проблема (только модуль динамических функций) - PullRequest
1 голос
/ 04 апреля 2019

Я пытаюсь реализовать комплект приложений 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.

Использование Сборка > Сборка комплекта (ов) / APK (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, появляется сообщение «1061 *», и я не вижу заметной ошибки в logcat, когда появляется это сообщение. Я не знаю, как идти вперед.

Ответы [ 2 ]

2 голосов
/ 07 апреля 2019

Когда вы используете 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Базовый API, в частности, вы не получите обратный вызов INSTALLED.

На сегодняшний день лучший способ проверить установку модулей - это пройти внутренний тестовый трек консоли Play.

Надеюсь, это поможет,

0 голосов
/ 05 апреля 2019

Нельзя просто распаковать apks, используя файл winrar out.apks.Если вы хотите установить только базовый apk, вы можете сделать это следующим образом (я предполагаю, что имя вашего базового модуля base-master):

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

Опция --modules дает вам возможность установитьтолько указанные модули.Тем не менее, я думаю, что нет способа проверить динамическую доставку (загрузка динамических модулей по требованию) локально, так как ваше приложение взаимодействует с библиотекой Play Core .

Кстати, если вы настаиваете на извлечении APK, вы можете использовать bundle tool :

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