Skip to content

App Crashes when using bundle.config with abi splits set to negate. #8979

Description

@dellis1972

Android application type

.NET Android (net7.0-android, net8.0-android, etc.)

Affected platform version

.net8.0-android, .net9.0-android

Description

When using a bundle.config with the following contents

{
	"compression": { },
	"optimizations": {
		"splitsConfig": {
			"splitDimension": [
				{
						"value": "ABI",
						"negate": true
				}
			 ],
		}
	}
}

the app crashes at runtime with the following error.

At least a single application lib directory must be added"

Steps to Reproduce

  1. Download the attached repo app.
  2. Build and run it using the latest main of .net android.

Did you find any workaround?

Changing "negate": true to "negate": false fixes the issue.

Relevant log output

No response

Activity

  1. dellis1972 commented on May 23, 2024

    @dellis1972
    ContributorAuthor
  2. dellis1972 commented on May 24, 2024

    @dellis1972
    ContributorAuthor
  3. dellis1972 commented on May 24, 2024

    @dellis1972
    ContributorAuthor

    So I think I know what is causing the issue

    This is the contents of the apks file which google will generate for a specific device.

    This is with negate set to false

     extracting: foo/toc.pb              
     extracting: foo/asset-slices/assetpack1-astc.apk  
     extracting: foo/asset-slices/assetpack1-dxt1.apk  
     extracting: foo/asset-slices/assetpack1-etc1_rgb8.apk  
     extracting: foo/asset-slices/assetpack1-master.apk  
     extracting: foo/asset-slices/assetpack1-paletted.apk  
     extracting: foo/splits/base-arm64_v8a.apk  
     extracting: foo/splits/base-arm64_v8a_2.apk  
     extracting: foo/splits/base-armeabi_v7a.apk  
     extracting: foo/splits/base-armeabi_v7a_2.apk  
     extracting: foo/splits/base-master.apk  
     extracting: foo/splits/base-master_2.apk  
     extracting: foo/splits/base-master_3.apk  
     extracting: foo/splits/base-x86.apk  
     extracting: foo/splits/base-x86_2.apk  
     extracting: foo/splits/base-x86_64.apk  
     extracting: foo/splits/base-x86_64_2.apk
    

    This is with it set to true

     extracting: foo/toc.pb              
     extracting: foo/asset-slices/assetpack1-astc.apk  
     extracting: foo/asset-slices/assetpack1-dxt1.apk  
     extracting: foo/asset-slices/assetpack1-etc1_rgb8.apk  
     extracting: foo/asset-slices/assetpack1-master.apk  
     extracting: foo/asset-slices/assetpack1-paletted.apk  
     extracting: foo/splits/base-master.apk  
     extracting: foo/splits/base-master_2.apk  
     extracting: foo/splits/base-master_3.apk
    

    If we look at the contents of "base-master.apk" in the latter, we see that it contains ALL .so files for all abis not just the resources. On the former , those .so files are split into a seperate base-XXX.apk .

  4. dellis1972 commented on May 24, 2024

    @dellis1972
    ContributorAuthor

    So I tried this patch https://gist.github.com/dellis1972/2a3f62c4b7728dd33c621d823640fba7

    This adds an additional fallback to

    if (Util::ends_with (apk, SharedConstants::split_config_abi_apk_name)) {
    
    if (Util::ends_with (apk, SharedConstants::split_config_abi_apk_name) || Util::ends_with (apk, SharedConstants::base_apk_name)) {
    

    Now I get an error

    Abort message: '/Users/dean/Documents/Sandbox/Xamarin/xamarin-android/src/native/monodroid/embedded-assemblies.hh:180 (ensure_valid_assembly_stores): Invalid or incomplete assembly store data
    

    So something about the assembly stores gets messed up by this.

  5. grendello commented on May 24, 2024

    @grendello
    Contributor

    The problem is here https://github.com/xamarin/xamarin-android/blob/main/src/native/runtime-base/android-system.cc#L740-L747

    Previously, whenever split configs were present, the shared libraries always lived in a file named split_config.ARCH.apk (with ARCH replaced by e.g. arm64) and so, for performance reasons, we skip scanning anything that's not a file named like that if we detect that split_config.* files exist.

    In this case the split files do exist, but shared libraries are all in base.apk and the architecture-specific split config doesn't exist at all:

    $ adb shell run-as com.xamarin.runapplicationwithassetpacktextureformats ls -l /data/app/~~SiaOe7UQLju6w_cxUf4LsA==/com.xamarin.runapplicationwithassetpacktextureformats-Z7cymJN9yrWULwTPJncm_Q==/
    total 28479
    -rw-r--r-- 1 system system 29080982 2024-05-24 18:07 base.apk
    drwxr-xr-x 3 system system     3452 2024-05-24 18:07 lib
    -rw-r--r-- 1 system system     8478 2024-05-24 18:07 split_assetpack1.apk
    -rw-r--r-- 1 system system     8559 2024-05-24 18:07 split_assetpack1.config.astc.apk
    -rw-r--r-- 1 system system    16808 2024-05-24 18:07 split_config.xxxhdpi.apk

    I need to think about it a bit, so that we don't hurt startup performance with the fix.

  6. added a commit that references this issue on Jun 17, 2024
    a954a33
  7. locked and limited conversation to collaborators on Jul 19, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions