34

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 を修正するパッチを投稿しました。

4

4 に答える 4

13

これをアクティビティに追加することで成功しました:

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)
于 2013-06-21T16:53:05.637 に答える
0

私の場合、それはコアアプリの問題でした:

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.listrun-as

于 2015-10-15T14:23:58.017 に答える
0

私のNexus 7をこれから修正することになった1つのことは、さまざまなADBドライバーをインストールすることです。また、デバイスを再フラッシュしました(これが実際に問題を解決したかどうかはわかりませんが)。別の回答(私のもの)で述べたように、ルート化が必要になるということでした-実際には、私の場合も役に立ちませんでした。

于 2013-08-05T12:27:50.600 に答える
-1

Nexus 7 の最新バージョンには既知の問題があります。単純に 4.2 にダウングレードする (またはミニ アップデートなしで 4.3 を入手する) だけで問題ありません。それについてここに議論があります:

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

于 2013-10-02T23:53:14.343 に答える