run-as 包 'a.b.c' 未知 - Galaxy S4 Jellybean 或 Android 4.3
Posted
技术标签:
【中文标题】run-as 包 \'a.b.c\' 未知 - Galaxy S4 Jellybean 或 Android 4.3【英文标题】:run-as Package 'a.b.c' is unknown - Galaxy S4 Jellybean or Android 4.3run-as 包 'a.b.c' 未知 - Galaxy S4 Jellybean 或 Android 4.3 【发布时间】:2013-06-17 16:18:48 【问题描述】:我无法为运行 Jellybean 4.2.2 的 Galaxy S4 运行 run-as(或 ndk-gdb)。
~ $ adb shell
shell@android:/ $ run-as a.b.c ls
run-as: Package 'a.b.c' is unknown
对于 ICS 之前的设备,此问题有多个答案,但这些似乎已在 ICS 中得到修复。
更新 - 2013 年 8 月:最初出现在带有 Jellybean 4.2.2 的 Galaxy S4 上之后,运行方式问题现在似乎出现在所有 4.3 设备上。看到这个Android bug。
请参阅已确认的 Android 问题 here。
更新 - 2013 年 11 月:Google 发布了 patches,用于修复 Android 4.4 中的运行方式。
【问题讨论】:
为了完整起见......设备上安装了那个包? 是的。我可以使用 adb shell am start -n a.b.c/activity 启动应用程序 developer.samsung.com/forum/thread/ndk-debugging-with-gdb/77/… 的线索,但不清楚如何为非 root 设备更改 ndk-gdb。 【参考方案1】:通过将其添加到活动中发现成功:
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");
然后我将 startGdbServer 包装在 Android 服务中并更新 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)
【讨论】:
让应用派生出一个以其用户 ID 运行的 ssh 服务器可能会给您相当程度的灵活性,以便随后独立于应用的状态启动 gdbserver。 谢谢克里斯。我最终将 startGdbServer 包装在 Android 服务中并更新 ndk-gdb 脚本以启动服务器而不是 run-as 命令。到目前为止,这似乎使有缺陷的三星设备与其他任何设备一样可调试 当您说“通过将其添加到活动中”时,您的意思是您将其添加到应用中的现有活动中吗?或者您是否创建了一个新应用程序只是为了启动 GDB 服务器?您能否说明您是如何将其封装在 Android 服务中的,以及您对ndk-gdb
脚本所做的更改?
等等,我在 ndk-gdb.py 中看不到任何类似的行。那是我们应该修改的文件正确吗?还是我错过了什么?
在当前的SDK版本(1.1.03)中,代码序列从.apportable/SDK/site_scons/android/sdk.py的第770行开始【参考方案2】:
最终解决我的 Nexus 7 的问题的一件事是安装不同的 ADB 驱动程序。我还重新刷新了设备(尽管我不确定这是否确实是修复它的原因)。正如另一个答案(我的)中提到的那样,需要生根 - 事实上,它对我的情况也没有帮助。
【讨论】:
【参考方案3】:最新版本的 Nexus 7 存在一个已知问题。只需降级到 4.2(或在没有小更新的情况下获取 4.3)就可以了。这里有一个讨论:
http://code.google.com/p/android/issues/detail?id=58373
【讨论】:
【参考方案4】:就我而言,这是核心应用程序的问题:
shell@android:/ $ run-as com.android.phone transfer_bugreport ls
run-as: Package 'com.android.phone' is unknown
在AndroidManifest.xml
中具有<maninfest>
标签coreApp="true"
的包被排除在/data/system/packages.list
之外,因此对于run-as
来说真的是未知的。
【讨论】:
以上是关于run-as 包 'a.b.c' 未知 - Galaxy S4 Jellybean 或 Android 4.3的主要内容,如果未能解决你的问题,请参考以下文章
.Net MAUI 'run-as' 命令失败,出现'run-as:无法设置功能:不允许操作
解决run-as: Package '' is unknown
[Android]利用run-as命令在不root情况下读取data下面的数据