2013-06-20 47 views
29

我無法爲運行Jellybean 4.2.2的Galaxy S4運行run-as(或ndk-gdb)。run-as軟件包'a.b.c'未知 - Galaxy S4 Jellybean或Android 4.3

~ $ adb shell 
[email protected]:/ $ 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。

+0

只是爲了完整性...該軟件包安裝在設備上? – CommonsWare

+0

是的。我可以使用adb shell啓動應用程序,但我的開始是-n abc/{activity} –

+0

http://developer.samsung.com/forum/thread/ndk-debugging-with-gdb/77/178834的線索,但不清楚如何更改non-rooted設備的ndk-gdb。 –

回答

12

實測值通過添加這對活動的成功:

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腳本啓動服務器,而不是在運行方式命令。

這裏的清單另外:

<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) 
+0

使應用程序脫離以其用戶標識運行的ssh服務器可能會給您一定程度的靈活性,以便隨後啓動獨立於應用程序狀態的gdbserver。 –

+0

謝謝克里斯。我最終將startGdbServer封裝在一個Android服務中,並更新了ndk-gdb腳本來啓動服務器,而不是run-as命令。到目前爲止,這看起來像三星設備一樣具有可調試性,可以作爲其他任何設備使用。 –

+0

當您說「通過將此添加到活動中」時,您的意思是您是否將此添加到應用中的現有活動中?還是你創建了一個新的應用程序來啓動GDB服務器?你能否澄清一下你如何在Android服務中封裝它,以及你對'ndk-gdb'腳本所做的更改? –

0

一件事,結束了從做這個固定我的Nexus 7,是安裝不同的ADB驅動程序。我也重新刷新了設備(儘管我不確定這是否確實是固定的)。正如另一個答案(我的)中提到的那樣,生根是必需的 - 事實上,它對我的​​情況也沒有幫助。

0

對我來說,這是核心應用程序的問題:

[email protected]:/ $ 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