Android mmap失败:启动时参数无效

问题描述 投票:0回答:1

奇怪的问题是,当我的android项目assets的总大小超过2G时,它将引发异常java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.empty.test.cn/com.empty.test.EmptyActivity}。首先,我的程序pid日志如下:

08-08 19:35:03.025 20852 20852 E filemap : mmap(3040186368,3909364) failed: Invalid argument
08-08 19:35:03.025 20852 20852 W zipro   : Error opening archive /data/app/com.empty.test.cn-1/base.apk: File mapping failed
08-08 19:35:03.025 20852 20852 D asset   : failed to open Zip archive '/data/app/com.empty.test.cn-1/base.apk'
08-08 19:35:03.042  4259 22711 D vol.VolumeDialogControl.VC: setLayoutDirection
08-08 19:35:03.056  3830  3830 D Telecom : com.android.server.telecom.ui.MissedCallNotifierImpl$1: Action received: android.intent.action.CONFIGURATION_CHANGED.
08-08 19:35:03.057  3830  3830 D GameManagerService: onDisplayChanged. displyId: 0
08-08 19:35:03.057  3830  3830 D GameManagerService: dpi: 420, longPixel: 1920, shortPixel: 1080
08-08 19:35:03.075 20852 20852 D AndroidRuntime: Shutting down VM
08-08 19:35:03.088  3830  4123 D MdnieScenarioControlService:  packageName : com.empty.test.cn    className : com.empty.test.EmptyActivity
08-08 19:35:03.117 20852 20852 E AndroidRuntime: FATAL EXCEPTION: main
08-08 19:35:03.117 20852 20852 E AndroidRuntime: Process: com.empty.test.cn, PID: 20852
08-08 19:35:03.117 20852 20852 E AndroidRuntime: java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.empty.test.cn/com.empty.test.EmptyActivity}: java.lang.ClassNotFoundException: Didn't find class "com.empty.test.EmptyActivity" on path: DexPathList[[zip file "/data/app/com.empty.test.cn-1/base.apk"],nativeLibraryDirectories=[/data/app/com.empty.test.cn-1/lib/arm, /data/app/com.empty.test.cn-1/base.apk!/lib/armeabi-v7a, /system/lib, /vendor/lib]]
08-08 19:35:03.117 20852 20852 E AndroidRuntime:    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2819)
08-08 19:35:03.117 20852 20852 E AndroidRuntime:    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2988)
08-08 19:35:03.117 20852 20852 E AndroidRuntime:    at android.app.ActivityThread.-wrap14(ActivityThread.java)
08-08 19:35:03.117 20852 20852 E AndroidRuntime:    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1631)
08-08 19:35:03.117 20852 20852 E AndroidRuntime:    at android.os.Handler.dispatchMessage(Handler.java:102)
08-08 19:35:03.117 20852 20852 E AndroidRuntime:    at android.os.Looper.loop(Looper.java:154)
08-08 19:35:03.117 20852 20852 E AndroidRuntime:    at android.app.ActivityThread.main(ActivityThread.java:6682)
08-08 19:35:03.117 20852 20852 E AndroidRuntime:    at java.lang.reflect.Method.invoke(Native Method)
08-08 19:35:03.117 20852 20852 E AndroidRuntime:    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
08-08 19:35:03.117 20852 20852 E AndroidRuntime:    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
08-08 19:35:03.117 20852 20852 E AndroidRuntime: Caused by: java.lang.ClassNotFoundException: Didn't find class "com.empty.test.EmptyActivity" on path: DexPathList[[zip file "/data/app/com.empty.test.cn-1/base.apk"],nativeLibraryDirectories=[/data/app/com.empty.test.cn-1/lib/arm, /data/app/com.empty.test.cn-1/base.apk!/lib/armeabi-v7a, /system/lib, /vendor/lib]]
08-08 19:35:03.117 20852 20852 E AndroidRuntime:    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
08-08 19:35:03.117 20852 20852 E AndroidRuntime:    at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
08-08 19:35:03.117 20852 20852 E AndroidRuntime:    at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
08-08 19:35:03.117 20852 20852 E AndroidRuntime:    at android.app.Instrumentation.newActivity(Instrumentation.java:1086)
08-08 19:35:03.117 20852 20852 E AndroidRuntime:    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2809)
08-08 19:35:03.117 20852 20852 E AndroidRuntime:    ... 9 more
08-08 19:35:03.117 20852 20852 E AndroidRuntime:    Suppressed: java.io.IOException: No original dex files found for dex location (arm) /data/app/com.empty.test.cn-1/base.apk ()
08-08 19:35:03.117 20852 20852 E AndroidRuntime:        at dalvik.system.DexFile.openDexFileNative(Native Method)
08-08 19:35:03.117 20852 20852 E AndroidRuntime:        at dalvik.system.DexFile.openDexFile(DexFile.java:373)
08-08 19:35:03.117 20852 20852 E AndroidRuntime:        at dalvik.system.DexFile.<init>(DexFile.java:113)
08-08 19:35:03.117 20852 20852 E AndroidRuntime:        at dalvik.system.DexFile.<init>(DexFile.java:78)
08-08 19:35:03.117 20852 20852 E AndroidRuntime:        at dalvik.system.DexPathList.loadDexFile(DexPathList.java:359)
08-08 19:35:03.117 20852 20852 E AndroidRuntime:        at dalvik.system.DexPathList.makeElements(DexPathList.java:323)
08-08 19:35:03.117 20852 20852 E AndroidRuntime:        at dalvik.system.DexPathList.makeDexElements(DexPathList.java:263)
08-08 19:35:03.117 20852 20852 E AndroidRuntime:        at dalvik.system.DexPathList.<init>(DexPathList.java:126)
08-08 19:35:03.117 20852 20852 E AndroidRuntime:        at dalvik.system.BaseDexClassLoader.<init>(BaseDexClassLoader.java:48)
08-08 19:35:03.117 20852 20852 E AndroidRuntime:        at dalvik.system.PathClassLoader.<init>(PathClassLoader.java:64)
08-08 19:35:03.117 20852 20852 E AndroidRuntime:        at com.android.internal.os.PathClassLoaderFactory.createClassLoader(PathClassLoaderFactory.java:43)
08-08 19:35:03.117 20852 20852 E AndroidRuntime:        at android.app.ApplicationLoaders.getClassLoader(ApplicationLoaders.java:58)
08-08 19:35:03.117 20852 20852 E AndroidRuntime:        at android.app.LoadedApk.createOrUpdateClassLoaderLocked(LoadedApk.java:535)
08-08 19:35:03.117 20852 20852 E AndroidRuntime:        at android.app.LoadedApk.getClassLoader(LoadedApk.java:568)
08-08 19:35:03.117 20852 20852 E AndroidRuntime:        at android.app.ActivityThread.getTopLevelResources(ActivityThread.java:2042)
08-08 19:35:03.117 20852 20852 E AndroidRuntime:        at android.app.LoadedApk.getResources(LoadedApk.java:787)
08-08 19:35:03.117 20852 20852 E AndroidRuntime:        at android.app.ContextImpl.<init>(ContextImpl.java:2262)
08-08 19:35:03.117 20852 20852 E AndroidRuntime:        at android.app.ContextImpl.createAppContext(ContextImpl.java:2206)
08-08 19:35:03.117 20852 20852 E AndroidRuntime:        at android.app.ContextImpl.createAppContext(ContextImpl.java:2192)
08-08 19:35:03.117 20852 20852 E AndroidRuntime:        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5767)
08-08 19:35:03.117 20852 20852 E AndroidRuntime:        at android.app.ActivityThread.-wrap3(ActivityThread.java)
08-08 19:35:03.117 20852 20852 E AndroidRuntime:        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1699)
08-08 19:35:03.117 20852 20852 E AndroidRuntime:        ... 6 more
08-08 19:35:03.122  4259  4259 D ViewRootImpl@16afd9[DockedStackDivider]: mHardwareRenderer.destroy()#4
08-08 19:35:03.129  3830  7600 D Debug   : !@DumpState : SHIP
08-08 19:35:03.129  3830  7600 D Debug   : !@DumpState : debug level:0x4f4c
08-08 19:35:03.129  3830  7600 D Debug   : !@Dumpstate : Finally, system will skip dumpstate
08-08 19:35:03.131  3830  7600 W ActivityManager:   Force finishing activity com.empty.test.cn/com.empty.test.EmptyActivity

ClassNotFoundException不太重要,因为在加载第一个Java类时会触发它。如果删除自定义应用程序,将从MainActivity中抛出相同的异常。

mmap(3040186368,3909364) failed: Invalid argument的第一行错误消息可以在AOSP第178行中找到,请参见此处:

ALOGE("mmap(%lld,%zu) failed: %s\n",
        (long long)adjOffset, adjLength, strerror(errno));

这意味着跳过3909364字节后尝试加载3040186368字节。

经过多次尝试,我当然发现,当资产大小超过2G(甚至带有随机字节测试文件)时,就会触发此问题。 adjOffset是64位off64_t,但是int322147483648,肯定是2G。我以为android系统正在尝试加载跨越大资产偏移量的dexres。但我不明白为什么会发生此问题。

gradle配置是multiDexEnabled trueminifyEnabled false,除去gralde.properties以外的所有org.gradle.jvmargs=-Xmx6144m -Xss256k -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -XX:MaxHeapSize=512m。问题在于删除所有jar,aar,gradle实现库和子模块之后。但是jniLib仍然保留,包含诸如统一引擎的通用库。

[gradle-wrapper版本最高为5.5.1,具有全局配置build.gradle:]]

//build.gradle
buildscript {
    repositories {
        google()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.2'
        classpath 'com.google.gms:google-services:4.2.0'
    }
}

每次构建都是干净的工作区,然后完全构建并完全卸载并重新安装。

有人在这个问题上遇到麻烦吗?

奇怪的问题是,当我的android项目资产总大小超过2G时,它将引发异常java.lang.RuntimeException:无法实例化活动ComponentInfo {com.empty.test.cn/com ....

android mmap
1个回答
0
投票

我面临相同的问题,logcat几乎相同。

2019-09-27 21:43:20.604 26342-26342/? E/filemap: mmap(2248417280,6719092) failed: Invalid argument
2019-09-27 21:43:20.604 26342-26342/? E/ziparchive: Zip: failed to intialize central directory.
2019-09-27 21:43:20.604 26342-26342/? W/zipro: Error opening archive /data/app/com.test.demo1-NX2RtU1xmUWB_22HMdR3TA==/base.apk: File mapping failed
2019-09-27 21:43:20.604 26342-26342/? D/asset: failed to open Zip archive '/data/app/com.test.demo1-NX2RtU1xmUWB_22HMdR3TA==/base.apk'
© www.soinside.com 2019 - 2024. All rights reserved.