El paquete ''abc'' de ejecución-como es desconocido: Galaxy S4 Jellybean o Android 4.3
android-ndk gdb (4)
En mi caso, era un problema de la aplicación principal:
shell@android:/ $ run-as com.android.phone transfer_bugreport ls
run-as: Package ''com.android.phone'' is unknown
Los paquetes que se encuentran en AndroidManifest.xml
en la etiqueta <maninfest>
coreApp="true"
se excluyen de /data/system/packages.list
y, por lo tanto, son realmente desconocidos para run-as
.
No puedo ejecutar run-as (o ndk-gdb) para el Galaxy S4 con Jellybean 4.2.2.
~ $ adb shell
shell@android:/ $ run-as a.b.c ls
run-as: Package ''a.b.c'' is unknown
Hay varias respuestas para este problema para dispositivos pre-ICS, pero parece que se han corregido en ICS.
Actualización: agosto de 2013: después de aparecer inicialmente en el Galaxy S4 con Jellybean 4.2.2, el problema de ejecución ahora parece estar en todos los dispositivos 4.3. Ver este error de Android .
Vea el problema de Android reconocido aquí .
Actualización: noviembre de 2013: Google publicó los patches que corren run-as en Android 4.4.
Hay un problema conocido con la versión más reciente de Nexus 7. Simplemente, baje la versión a 4.2 (u obtenga 4.3 sin la mini-actualización) y debería estar bien. Aquí hay una discusión al respecto:
Se encontró éxito agregando esto a la actividad:
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");
}
}
Luego envolví startGdbServer en un servicio Android y actualicé el script ndk-gdb para iniciar el servidor en lugar del comando run-as.
Aquí está la adición de manifiesto:
<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>
Aquí están los cambios relevantes de ndk-gdb (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)
Una cosa que terminó arreglando mi Nexus 7 al hacer esto, es instalar diferentes controladores ADB. También volví a flashear el dispositivo (aunque no estoy seguro de si esto fue realmente lo que lo solucionó). Como mencioné en otra respuesta (la mía) fue que se requeriría enraizamiento, cuando en realidad tampoco ayudó en mi caso.