如何从内核模块android启动一个Activity

时间:2014-04-15 16:49:32

标签: android linux linux-kernel android-activity

我是linux内核的新手。我试图从内核模块启动一个活动。 这就是我一直在尝试做的事情:

static char *envp[] =  { 
  "HOME=/", 
  "PATH=/sbin:/system/sbin:/system/bin:/system/xbin", NULL };
static char *argv[] = { "/system/bin/am", "start", "-a", "android.intent.action.MAIN", "-n", "com.whatsapp/.Conversation",  NULL};

call_usermodehelper(argv[0], argv, envp, 1);

我的代码中没有任何问题。但问题是活动没有开始。我只是每次在logcat中看到这个输出:

 D/AndroidRuntime( 7417): 
D/AndroidRuntime( 7417): >>>>>> AndroidRuntime START com.android.internal.os.RuntimeInit <<<<<<
D/AndroidRuntime( 7417): CheckJNI is ON
E/dalvikvm( 7417): ERROR: must specify non-'.' bootclasspath
W/dalvikvm( 7417): CreateJavaVM failed: dvmClassStartup failed
E/AndroidRuntime( 7417): JNI_CreateJavaVM failed

我认为代码应该正常工作。我无法使用mkdir命令。它没有任何问题。我哪里错了?

修改

BOTTCLASSPATH添加到envp有效。但现在我遇到了一个奇怪的问题。 在应用程序最初关闭的情况下执行此功能时,应用程序已打开,以及使用以下堆栈跟踪自动关闭的毫秒时间:

D/AndroidRuntime( 4116): 
D/AndroidRuntime( 4116): >>>>>> AndroidRuntime START com.android.internal.os.RuntimeInit <<<<<<
D/AndroidRuntime( 4116): CheckJNI is OFF
D/dalvikvm( 4116): Trying to load lib libjavacore.so 0x0
D/dalvikvm( 4116): Added shared lib libjavacore.so 0x0
D/dalvikvm( 4116): Trying to load lib libnativehelper.so 0x0
D/dalvikvm( 4116): Added shared lib libnativehelper.so 0x0
D/dalvikvm( 4116): No JNI_OnLoad found in libnativehelper.so 0x0, skipping init
D/dalvikvm( 4116): Note: class Landroid/app/ActivityManagerNative; has 179 unimplemented (abstract) methods
D/AndroidRuntime( 4116): Calling main entry com.android.commands.am.Am
I/ActivityManager(  653): START u0 {act=android.intent.action.MAIN flg=0x10000000 cmp=com.whatsapp/.Conversations} from pid 4116
D/AndroidRuntime( 4116): Shutting down VM
I/ActivityManager(  652): Start proc com.android.browser for activity com.android.browser/.BrowserActivity: pid=4581 uid=10030 gids={50030, 3003, 1028, 1015, 1023}
D/ActivityThread( 4581): handleBindApplication:com.android.browser
D/ActivityThread( 4581): setTargetHeapUtilization:0.75
D/ActivityThread( 4581): setTargetHeapMinFree:524288
I/ActivityManager(  652): Timeline: Activity_windows_visible id: ActivityRecord{421d7768 u0 com.google.android.googlequicksearchbox/com.google.android.launcher.GEL t1} time:347570
W/EventLoggerService( 2349): Unable to send logs Error code: 262146 | Unable to resolve host "www.google.com": No address associated with hostname
I/PowerManagerService(  652): Going to sleep due to screen timeout...
D/SurfaceFlinger(  210): Screen released, type=0 flinger=0x2a007450

当应用程序处于暂停状态时执行此命令,应用程序打开正常。

1 个答案:

答案 0 :(得分:1)

您的环境不完整。 mkdir是一个简单的本机可执行文件,但am实际上是一个shell脚本,它将am.jar加载到某种类型的dalvik虚拟机中,这似乎需要更多的设置。< / p>

具体来说,似乎抱怨BOOTCLASSPATH环境变量无效。鉴于你和脚本似乎都没有设置它,它可能是空的。

am旨在从adb shell中使用,因此请运行以下命令检查它将从中继承的内容:

adb shell 'echo $BOOTCLASSPATH'

考虑将部分或全部内容添加到您的环境中。您可能还需要设置其他内容。

通过制作自己的shell脚本来完成所有设置,可以更清楚地将所有这些用户空间配置细节保留在内核之外:附加步骤以及脚本执行的操作。