【问题标题】:Exception from android.app.NativeActivity.onCreate() in Android NDK application (Android 6.0 only)Android NDK 应用程序中的 android.app.NativeActivity.onCreate() 异常(仅限 Android 6.0)
【发布时间】:2019-06-13 14:09:51
【问题描述】:

我最近更新了 Android Studio 和所有 SDK 库(2019 年 6 月),突然我的一些用户在应用程序启动时开始遇到这种崩溃。

就我所见,它只发生在 Android 6.0 上。

该应用是一个Android Native App,使用NDK和app_glue基类,编译SDK=26。

有没有其他人经历过类似的事情?

我没有 Android 6.0 手机。我尝试创建虚拟设备,但无法在虚拟设备上复制问题。 它适用于数千名其他玩家(Android 7、8、9)

这是异常调用堆栈 =================================

java.lang.RuntimeException: 
  at android.app.ActivityThread.performLaunchActivity 
(ActivityThread.java:3253)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3349)
  at android.app.ActivityThread.access$1100 (ActivityThread.java:221)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1794)
  at android.os.Handler.dispatchMessage (Handler.java:102)
  at android.os.Looper.loop (Looper.java:158)
  at android.app.ActivityThread.main (ActivityThread.java:7224)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1230)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1120)

Caused by: java.lang.IllegalArgumentException: 
  at android.app.NativeActivity.onCreate (NativeActivity.java:170)
  at android.app.Activity.performCreate (Activity.java:6876)
  at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1135)
  at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3206)

更新: 只有最新的 Gradle 版本:3.4.1 才会出现此问题 当我恢复到 3.2.1 时,崩溃消失了。 Gradle 似乎做了一些不同的事情,导致 Android 6.0 中的应用程序崩溃。

【问题讨论】:

  • 这个调试文本是不够的,因为“IllegalArgumentException”发生在刚刚新建/创建的 Activity 内部,可能是在它的“on...()”方法之一中。请检查可能引发异常的东西(也许你抛出这个异常?或者可能是某个库?)

标签: android exception android-ndk native


【解决方案1】:

如果你在this commit from 5 years ago 中检查NativeActivity implementation in AOSP(下一个是3 年零7 个月前,应该是6.0 之后),你会发现line 170 抛出一个IllegalArgumentException

mNativeHandle = loadNativeCode(path, funcname, Looper.myQueue(),
        getAbsolutePath(getFilesDir()), getAbsolutePath(getObbDir()),
        getAbsolutePath(getExternalFilesDir(null)),
        Build.VERSION.SDK_INT, getAssets(), nativeSavedState);
if (mNativeHandle == 0) {
    throw new IllegalArgumentException("Unable to load native library: " + path);
}

这意味着无法找到您的本机库(或某些引用的库),或者可能由于某种原因无法加载它。

我将使用 Cmd-shift-A -> "Analyze APK..." 检查是否所有本机库都存在所有架构。一个可能的问题是,由于某种原因,它被排除在某些架构之外,因此在大多数设备上都可以正常工作,但在某些设备上却失败了。

【讨论】:

  • 这似乎是合乎逻辑和合理的解释。我会做检查并报告任何结果。感谢您的回复,
  • 希望它有助于找到根本原因。
  • 从这一行引发了异常:String path = null; File libraryFile = new File(ai.applicationInfo.nativeLibraryDir, System.mapLibraryName(libname)); if (libraryFile.exists()) { path = libraryFile.getPath(); } if (path == null) { throw new IllegalArgumentException("Unable to find native library: " + libname); } 它只是检查文件是否存在。我仍然不明白为什么这只发生在某些 Android 6.0 中。
  • 该文件正在尝试查找您的本机库。发生这种情况的原因有很多,一个是 64 位环境中的混合库架构。基本上,这意味着您必须拥有所有受支持架构中的所有库。例如,如果您只编译库的 32 位架构,但包含另一个同时具有 32 位和 64 位的库,则加载可能会失败。请参阅:xrubio.com/2015/09/…xrubio.com/2018/02/…
  • 我找到了解决我的问题的方法,就是恢复到以前的 gradle 版本:classpath 'com.android.tools.build:gradle:3.2.1' .有问题的 Gradle 是 classpath 'com.android.tools.build:gradle:3.4.1'。我不知道 Gradle 是否对 Android 6.0 崩溃负全部责任,但恢复到以前的版本似乎可以避免这个问题。我将尝试与 gradle 团队就此进行沟通。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多