【问题标题】:Android app installed to system (firmware) crashes on start but not when installed in data/data安装到系统(固件)的 Android 应用程序在启动时崩溃,但在安装在数据/数据中时不会崩溃
【发布时间】:2013-02-26 16:24:57
【问题描述】:

我必须让我的应用程序为固件映像工作。当我的应用程序像普通应用程序一样安装到数据/数据/包/...时运行良好,但是当我将它包含在固件中时,它在启动时崩溃。

这是我第一次开发固件应用程序,我不知道其中的差异,而且很难在 Google 上找到任何东西。事实上,我还没有发现任何有用的东西。

首先我怀疑访问了文件空间数据/数据/包/文件并完全删除了它的使用,但它仍然崩溃。我已经放入 Toasts 以查看应用程序在加载过程中的进展情况,但我时不时地只得到第一个 toast,所以我预计它会出现重大问题。

我还取消了对 SharedPreferences 和 Bundle 的所有使用,但它仍然会立即崩溃。

我什至基本上把整个项目都拿出来了,只加载了一个布局到 MainActivity。仍然崩溃。

只是为了测试,我创建了一个简单的应用程序,它只显示一个 Hello World 并将其加载到系统中。它开始没有任何问题。

我还应该提到,我的应用经常使用 Android NDK,但我假设它在第一次使用之前就崩溃了,因为我没有在第一次访问之前获取 Toast。

所以我的问题是:有什么方法可以调试安装到系统文件夹的应用程序?我需要任何特殊权限吗?我需要为 ndk 指定“固件”吗?一般来说,在创建系统应用时需要注意哪些差异?

这里是堆栈跟踪:

02-26 09:40:42.041: E/Trace(1790): error opening trace file: No such file or directory (2)
02-26 09:40:42.071: D/dalvikvm(1790): WAIT_FOR_CONCURRENT_GC blocked 0ms
02-26 09:40:42.241: D/dalvikvm(1790): No JNI_OnLoad found in /system/lib/libpackage.so 0x4220f7d0, skipping init
02-26 09:40:42.721: D/dalvikvm(1790): GC_FOR_ALLOC freed 568K, 6% free 13110K/13852K, paused 15ms, total 15ms
02-26 09:40:42.721: I/dalvikvm-heap(1790): Grow heap (frag case) to 16.638MB for 3850256-byte allocation
02-26 09:40:42.731: D/dalvikvm(1790): GC_FOR_ALLOC freed 30K, 5% free 16840K/17616K, paused 9ms, total 9ms
02-26 09:40:42.771: I/MainActivity(1790): ON RESUME
02-26 09:40:42.951: W/dalvikvm(1790): No implementation found for native Lcom/mypackage/MainView;.MyJNICall:()[I
02-26 09:40:42.951: D/AndroidRuntime(1790): Shutting down VM
02-26 09:40:42.951: W/dalvikvm(1790): threadid=1: thread exiting with uncaught exception (group=0x417ee7d0)
02-26 09:40:42.951: E/AndroidRuntime(1790): FATAL EXCEPTION: main
02-26 09:40:42.951: E/AndroidRuntime(1790): java.lang.UnsatisfiedLinkError: Native method not found: com.mypackage.MainView.MyJNICall:()[I
02-26 09:40:42.951: E/AndroidRuntime(1790):     at com.mypackage.MainView.MyJNICall(Native Method)
02-26 09:40:42.951: E/AndroidRuntime(1790):     at com.mypackage.MyManager.anotherFunction(MyManager.java:43)
02-26 09:40:42.951: E/AndroidRuntime(1790):     at com.mypackage.MainView.myMethod(MainView.java:1330)
02-26 09:40:42.951: E/AndroidRuntime(1790):     at com.mypackage.MainView.init5(MainView.java:525)
02-26 09:40:42.951: E/AndroidRuntime(1790):     at com.mypackage.MainActivity$LoadViewTask.onPostExecute(MainActivity.java:236)
02-26 09:40:42.951: E/AndroidRuntime(1790):     at com.mypackage.MainActivity$LoadViewTask.onPostExecute(MainActivity.java:1)
02-26 09:40:42.951: E/AndroidRuntime(1790):     at android.os.AsyncTask.finish(AsyncTask.java:631)
02-26 09:40:42.951: E/AndroidRuntime(1790):     at android.os.AsyncTask.access$600(AsyncTask.java:177)
02-26 09:40:42.951: E/AndroidRuntime(1790):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
02-26 09:40:42.951: E/AndroidRuntime(1790):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-26 09:40:42.951: E/AndroidRuntime(1790):     at android.os.Looper.loop(Looper.java:150)
02-26 09:40:42.951: E/AndroidRuntime(1790):     at android.app.ActivityThread.main(ActivityThread.java:4833)
02-26 09:40:42.951: E/AndroidRuntime(1790):     at java.lang.reflect.Method.invokeNative(Native Method)
02-26 09:40:42.951: E/AndroidRuntime(1790):     at java.lang.reflect.Method.invoke(Method.java:511)
02-26 09:40:42.951: E/AndroidRuntime(1790):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
02-26 09:40:42.951: E/AndroidRuntime(1790):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
02-26 09:40:42.951: E/AndroidRuntime(1790):     at dalvik.system.NativeStart.main(Native Method)
02-26 09:40:49.711: I/dalvikvm(1790): threadid=3: reacting to signal 3
02-26 09:40:49.731: I/dalvikvm(1790): Wrote stack traces to '/data/anr/traces.txt'
02-26 09:42:13.691: I/Process(1790): Sending signal. PID: 1790 SIG: 9

【问题讨论】:

  • 我得到的唯一日志是对 jni 的第一次调用有效(因为我在正确的位置获得了日志),第二次调用失败。 E/AndroidRuntime(1790): java.lang.UnsatisfiedLinkError: Native method not found:.... 但仅此而已
  • 实际上,UnsatisfiedLinkError 不是关于第二次调用,而是稍后调用。第二次调用不会引发错误,但不会执行任何操作,因为无论我指定什么作为返回值,它都会返回 0。

标签: android android-ndk firmware


【解决方案1】:

好的,经过一番头疼后,我找到了原因。 system/libs 中的本机库在安装时未更新,并且使用的是相当旧的版本。手动更新库解决了这个问题。我将不得不与制造商讨论这个问题。

【讨论】:

    【解决方案2】:

    根据我在这里看到的:

    No implementation found for native Lcom/mypackage/MainView;.MyJNICall:()[I
    

    这意味着您的实现未包含在您的代码中。确保您正在打包 JNI 实现并将其与应用程序正确链接。此外,如果您正在调用MyJNICall(),那么这假定代码在那里。

    【讨论】:

    • 此函数存在,并在作为普通应用安装时调用。固件安装有什么不同?
    • 这可能是在系统应用程序中相对于标准应用程序如何处理 JNI。只是猜测......
    • 知道如何解决这个问题吗?在这种情况下,日志不是很有帮助。 JNI 似乎没有任何日志,只有 Java。就像前几个函数被调用但实际上并没有做任何事情,只是返回一个默认值。然后函数 MyJNICall 是“未找到”事件,尽管它的定义就像前几个调用一样。很奇怪。
    • 而是将默认值移动到属性文件中,然后读取该文件.. 这样您就不需要 jni 代码
    • 为了让我的应用程序正常工作,我确实需要 jni。你的默认值是什么意思?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    相关资源
    最近更新 更多