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

标签 android linux linux-kernel android-activity

我是 Linux 内核的新手。我正在尝试从内核模块开始一项 Activity 。 这是我一直在尝试做的事情:

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);

我没有发现我的代码有任何问题。但问题是 Activity 没有开始。我每次都在我的 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

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

最佳答案

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

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

am 被设计为在 adb shell 中使用,所以通过运行检查它将继承什么:

adb shell 'echo $BOOTCLASSPATH'

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

通过制作您自己的 shell 脚本来执行所有设置:将所有这些用户空间配置细节保留在内核之外可能会更清晰:额外的步骤以及 stock am 脚本的作用。

关于android - 如何从内核模块android启动一个Activity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23089847/

相关文章:

android - 如何在android中合并音频和视频文件

linux - 无法通过 ssh 成功声明 -f

c - 信号问题,定时器(SIGEV_SIGNAL)

linux - 如何检查目录的 md5hash 并将其与包含发送到目标目录的所有文件的哈希值的文件进行比较

linux-kernel - 使用yocto进行内核选择

linux-kernel - 不同进程的相同虚拟地址如何映射到不同的物理地址

java - 如何在 tcp 端口上使用二进制通信协议(protocol)发送数据包

android - 使用 epublib 搜索 epub 内容

php - 如何使用GCM向应用程序推送消息?

linux - 是否在内核中使用像 sprintf 这样的用户空间函数?