安装到系统(固件)的Android应用程序在启动时崩溃,但在安装在数据/数据中时则不会崩溃

时间:2013-02-25 07:36:23

标签: android android-ndk firmware

我必须让我的应用程序为固件映像工作。我的应用程序在正常应用程序安装到数据/数据/包/ ...时效果很好但是当我将它包含在固件中时它会在启动时崩溃。

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

首先,我怀疑访问文件空间数据/数据/包/文件并完全删除它的使用,但它仍然崩溃。我已经把Toasts放进去看看应用程序在加载过程中的进展情况,但我只是偶尔得到第一个吐司,所以我认为它有重大问题。

我也完全使用了SharedPreferences和Bundle但它仍然会立即崩溃。

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

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

我还应该提一下,我的应用程序使用Android NDK很多,但我假设它在第一次使用之前崩溃,因为我没有事件在第一次访问之前获得Toasts。

所以我的问题:有没有办法调试安装到系统文件夹的应用程序?我需要任何特殊权限吗?我需要为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

2 个答案:

答案 0 :(得分:1)

好的,经过很多头痛我找到了原因。系统/库中的本机库在安装时没有更新,而是使用了相当旧的版本。手动更新库解决了问题。我将不得不与制造商讨论这个问题。

答案 1 :(得分:0)

根据我在这里看到的内容:

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

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