簡體   English   中英

Android應用程序捆綁包:解析程序包時出現問題(僅動態功能模塊)

[英]Android App Bundles: there was a problem while parsing the package (dynamic feature module only)

我想實現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);

在附加到我MainActivity的按鈕的OnClickListener中。

使用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.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中沒有發現任何明顯的錯誤。 我不知道該如何前進。

當您使用無附加標志的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控制台的內部測試軌道。

希望能有所幫助,

僅使用winrar out.apks文件提取apk是out.apks 如果您只想安裝基本apk,則可以通過以下方式進行安裝(我假設您的基本模塊的名稱為base-master ):

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

--modules選項使您可以僅安裝指定的模塊。 但是,我猜沒有辦法在本地測試動態交付(按需下載動態模塊),因為您的應用程序與Play Core庫進行交互。

順便說一句,如果您堅持要提取APK,可以使用bundle工具

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM