web-dev-qa-db-fra.com

run-as Package 'a.b.c' est inconnu - Galaxy S4 Jellybean ou Android 4.3

Je ne peux pas exécuter run-as (ou ndk-gdb) pour le Galaxy S4 exécutant Jellybean 4.2.2.

~  $ adb Shell
shell@Android:/ $ run-as a.b.c ls
run-as: Package 'a.b.c' is unknown

Il existe plusieurs réponses à ce problème pour les périphériques pré-ICS, mais celles-ci semblent avoir été corrigées dans ICS.

Mise à jour - août 2013: après avoir apparu initialement sur le Galaxy S4 avec Jellybean 4.2.2, le problème de run-as semble maintenant être sur tous les appareils 4.3. Voir ceci Bogue Android .

Voir le Android issue Android ici ).

Mise à jour - novembre 2013: Google a publié les correctifs qui corrigent le run-as dans Android 4.4.

33
Paul Beusterien

Succès trouvé en ajoutant ceci à l'activité:

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

Ensuite, j'ai enveloppé startGdbServer dans un service Android et mis à jour le script ndk-gdb pour démarrer le serveur au lieu de la commande run-as.

Voici l'ajout manifeste:

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

Voici les modifications ndk-gdb pertinentes (en 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)
13
Paul Beusterien

Dans mon cas, c'était un problème d'application principale:

Shell@Android:/ $ run-as com.Android.phone transfer_bugreport ls
run-as: Package 'com.Android.phone' is unknown

Paquet qui a dans AndroidManifest.xml dans <maninfest> tag coreApp="true" sont exclus de /data/system/packages.list et donc vraiment inconnu pour run-as.

0
pevik

Une chose qui a fini par empêcher mon Nexus 7 de le faire, est d'installer différents pilotes ADB. J'ai également re-flashé l'appareil (même si je ne suis pas sûr si c'est bien ce qui l'a réparé). Comme mentionné dans une autre réponse (la mienne) était que l'enracinement serait nécessaire - alors qu'en fait, cela n'a pas aidé dans mon cas non plus.

0
Mike Weir