2013-06-20 7 views
29

Ich kann run-as (oder ndk-gdb) für das Galaxy S4 mit Jellybean 4.2.2 nicht ausführen.run-as-Paket 'a.b.c' ist unbekannt - Galaxy S4 Jellybean oder Android 4.3

~ $ adb shell 
[email protected]:/ $ run-as a.b.c ls 
run-as: Package 'a.b.c' is unknown 

Es gibt mehrere Antworten für dieses Problem für Pre-ICS-Geräte, aber die scheinen in ICS behoben wurden.

Update - Aug 2013: Nach dem Erscheinen auf dem Galaxy S4 mit Jellybean 4.2.2 scheint das Run-as-Problem nun auf allen 4.3 Geräten zu liegen. Siehe hierzu Android bug.

Siehe die anerkannte Android-Ausgabe here.

Update - November 2013: Google veröffentlichte die patches, die Lauf-wie in Android 4.4 zu beheben.

+0

Nur der Vollständigkeit halber ... das Paket ist auf dem Gerät installiert? – CommonsWare

+0

Ja. Ich bin in der Lage, die App mit adb-Shell starten zu starten -n abc/{Aktivität} –

+0

Hinweise auf http://developer.samsung.com/forum/thread/ndk-debugging-with-gdb/77/178834, aber nicht klar, wie man ndk-gdb für nicht gerootete Geräte ändert. –

Antwort

12

gefunden Erfolg durch das Hinzufügen dieser zu der Aktivität:

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

Dann wickelte ich startGdbServer in einem Android-Dienst und die Aktualisierung den NDK-GDB-Skript auf den Server anstelle des Laufes als Befehl zu starten.

Hier ist das Manifest Zusatz:

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

Hier sind die entsprechenden NDK-GDB Änderungen (in 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) 
+0

Wenn der App-Fork von einem SSH-Server ausgeführt wird, der als Benutzer-ID ausgeführt wird, erhalten Sie möglicherweise eine gewisse Flexibilität, um gdbserver später unabhängig vom Status der App zu starten. –

+0

Danke Chris. Ich wickelte StartGdbServer in einem Android-Dienst ein und aktualisierte das Skript ndk-gdb, um den Server anstelle des Befehls run-as zu starten. Bis jetzt scheint dies die fehlerhaften Samsung-Geräte als debuggbar zu machen. –

+0

Wenn du sagst "indem du das zur Aktivität hinzufügst", meinst du, du hast das zu der bestehenden Aktivität in deiner App hinzugefügt? Oder haben Sie eine neue App erstellt, um den GDB-Server zu starten? Kannst du erklären, wie du es in einen Android-Dienst eingepackt hast und welche Änderungen du am "ndk-gdb" -Skript vorgenommen hast? –

0

Eine Sache, die mein Nexus endete Fixierung 7 aus Dadurch ist Installieren verschiedener ADB-Treiber. Ich habe auch das Gerät erneut geblitzt (obwohl ich nicht sicher bin, ob dies tatsächlich das Problem behoben hat). Wie in einer anderen Antwort (meins) erwähnt, war das Rooten erforderlich - wenn es auch in meinem Fall nicht half.

-1

Es gibt ein bekanntes Problem mit der neuesten Version von Nexus 7. Einfach auf 4.2 herunterstufen (oder 4.3 ohne das Mini-Update erhalten) und Sie sollten in Ordnung sein. Es gibt eine Diskussion hier darüber:

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

+0

Wie bereits in der Frage beschrieben. –

0

In meinem Fall war es ein Problem des Kern App:

[email protected]:/ $ run-as com.android.phone transfer_bugreport ls 
run-as: Package 'com.android.phone' is unknown 

Paket, das in AndroidManifest.xml in <maninfest> Tag hat coreApp="true" von /data/system/packages.list ausgeschlossen sind und somit wirklich unbekannt für run-as.