run-as软件包'abc'未知 – Galaxy S4 Jellybean或Android 4.3

我不能为运行Jellybean 4.2.2的Galaxy S4运行run-as(或ndk-gdb)。

~ $ adb shell shell@android:/ $ run-as abc ls run-as: Package 'abc' is unknown 

对于ICS之前的设备,这个问题有多个答案,但是这些问题似乎已经在ICS中得到了解决。

更新 – 2013年8月:在最初出现在Galaxy S4和Jellybean 4.2.2之后,run-as问题现在似乎在所有的4.3设备上。 看到这个Android的错误 。

请参阅此处确认的Android问题。

更新 – 2013年11月:Google发布了修复运行的补丁 (如Android 4.4)。

Solutions Collecting From Web of "run-as软件包'abc'未知 – Galaxy S4 Jellybean或Android 4.3"

通过添加到活动中find成功:

 private void startGdbServer() { try { new ProcessBuilder() .command(getFilesDir().getParent() + "/lib/gdbserver", "tcp:5039", "--attach" ,"" + android.os.Process.myPid()) .redirectErrorStream(true) .start(); } catch (IOException e) { Log.e(TAG, "IOException failed to start gdbserver"); } } 

然后,我在一个Android服务中包装了startGdbServer,并更新了ndk-gdb脚本来启动服务器,而不是run-as命令。

以下是清单的附加内容:

 <service android:enabled="true" android:name="com.apportable.activity.GdbServerService" android:label="@string/app_name" android:icon="@drawable/icon"> <intent-filter > <action android:name="apportable.FoundationTests.GdbServerService" /> </intent-filter> </service> 

下面是相关的ndk-gdb的变化(在Python中):

  remote_gdbserver = '/data/data/' + env['APPLICATION_IDENTIFIER'] + '/lib/gdbserver' print "Attaching to pid " + pid # Android 4.2 requires the --user 0 option. Earlier versions cannot have it results = env.Execute([env['ADB'], 'shell', 'am']) if "--user" in results: user_option = "--user 0" else: user_option = "" adb.AsyncShell(env, 'am startservice ' + user_option + ' -a ' + env['APPLICATION_IDENTIFIER'] + '.GdbServerService --es gdbserver_name ' + remote_gdbserver + ' --ei gdbserver_port ' + str(env['ANDROID_REMOTE_DEBUG_PORT'])) # HACK: magic number. ensure the gdb server is actually up and running time.sleep(2) # 1 is usually enough, but not always, like after reboot or with heavy system load adb.Forward(env, env['ANDROID_LOCAL_DEBUG_PORT'], env['ANDROID_REMOTE_DEBUG_PORT']) adb.Pull(env, process_path, '/system/bin/app_process') setup_path = '"' + setup_path + '"' if env['CGDB'] is not None: cmd = [env['CGDB'], '-d', env['GDB'], '--', '-x', setup_path] else: cmd = [env['GDB'], '-x', setup_path] env.RunCommand(cmd) 

有一件事,最终修复我的Nexus 7这样做,是安装不同的ADB驱动程序。 我也重新刷新了设备(虽然我不确定这是否确实是固定的)。 正如在另一个回答(我的)中提到的那样,生根是必需的 – 事实上,对我来说也没有帮助。

在我的情况下,这是一个核心应用程序的问题:

 shell@android:/ $ run-as com.android.phone transfer_bugreport ls run-as: Package 'com.android.phone' is unknown 

<maninfest>标签coreApp="true"中的AndroidManifest.xml<maninfest>包被从/data/system/packages.list中排除,因此对于run-as真的是未知的。

Nexus 7的最新版本存在一个已知的问题。简单地降级到4.2(或没有mini-update的4.3版本),你应该没问题。 这里有一个关于它的讨论:

http://code.google.com/p/android/issues/detail?id=58373