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に登場した後、run-as問題はすべての4.3デバイスで発生しているようです。こちらをご覧ください Androidのバグ 。
確認済みのAndroidの問題 はこちら をご覧ください。
更新-2013年11月:GoogleはAndroid 4.4でrun-asを修正する パッチ を投稿しました。
これをアクティビティに追加することで成功しました:
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サービスでラップし、run-asコマンドの代わりにndk-gdbスクリプトを更新してサーバーを起動します。
マニフェストの追加は次のとおりです。
<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)
私の場合、コアアプリの問題でした。
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
については本当に不明です。
Nexus 7でこれを修正してしまったことの1つは、異なるADBドライバーをインストールすることです。また、デバイスを再フラッシュしました(これが実際にそれを修正したのかどうかはわかりませんが)。別の答え(私の)で述べたように、ルート化が必要になるということでした-実際には、それは私の場合も助けにはなりませんでした。