Diferencia entre revisiones de «Usuario:Juanda/android/adb»

De WikiEducator
Saltar a: navegación, buscar
(2º método: desde el PC)
 
(17 revisiones intermedias por el mismo usuario no mostrado)
Línea 27: Línea 27:
 
==Configuración previa para usar adb==
 
==Configuración previa para usar adb==
 
</div>
 
</div>
 +
 
<div class="slide">
 
<div class="slide">
 
====Windows====
 
====Windows====
 
*Tendremos que descargar el driver adb para el dispositivo.  
 
*Tendremos que descargar el driver adb para el dispositivo.  
*Puedes encontrar un  driver genérico que se encuentra en la carpeta android-sdk-windows\usb_driver del SDK Android. Aunque lo más probable es que tengas que utilizar el driver del fabricante.
+
*En la web de Android hay un [http://developer.android.com/tools/extras/oem-usb.html listado de enlaces] para la descarga de los drivers de los principales fabricantes.
*En la web de Android hay un [http://developer.android.com/tools/extras/oem-usb.html listado de enlaces] para la descarga de los drivers de los principales fabricantes.  
+
*Puedes encontrar un  driver genérico que se encuentra en la carpeta android-sdk-windows\usb_driver del SDK Android.
*Para los que no aparecen habrá que ir a sus webs o contactar con su servicio de soporte.  
+
*Lo más probable es que tengas que utilizar el driver del fabricante.
 
*A veces también hace falta otro ejecutable adb distinto al que aparece en el Android SDK.  
 
*A veces también hace falta otro ejecutable adb distinto al que aparece en el Android SDK.  
 +
</div>
 +
<div class="slide">
 +
*Para los que no aparecen habrá que ir a sus webs o contactar con su servicio de soporte.
 
*No siempre existen los drivers o funcionan como debieran ¡ojo!
 
*No siempre existen los drivers o funcionan como debieran ¡ojo!
 +
*En ocasiones para que funcione se utiliza el driver de google pero  modificando el fichero de instalación del driver: adb_usb.ini
 
</div>
 
</div>
 +
 
<div class="slide">
 
<div class="slide">
 +
 
====Mac====
 
====Mac====
*No hace falta hacer nada. Filosofia MAC: O funciona directamente o no funciona.
+
*No hace falta hacer nada.  
 +
*Filosofia MAC: O funciona directamente o no funciona.
 
</div>
 
</div>
 
<div class="slide">
 
<div class="slide">
Línea 122: Línea 130:
 
[[Archivo:Android_phone_settings.png|600px|thumb|center|(Configuración de dispositivo físico Android para despliegue de aplicaciones de desarrollo)]]
 
[[Archivo:Android_phone_settings.png|600px|thumb|center|(Configuración de dispositivo físico Android para despliegue de aplicaciones de desarrollo)]]
 
*En Android 4 la habilitación del USB Debug está en Ajustes > Opciones de Desarrollo.
 
*En Android 4 la habilitación del USB Debug está en Ajustes > Opciones de Desarrollo.
*'''Nota:''' A partir de '''Android 4.2''', las opciones de desarrollo no están visibles por defecto: ''"To make it available, go to Settings > About phone and tap Build number seven times. Return to the previous screen to find Developer options."''
 
 
</div>
 
</div>
 
<div class="slide">
 
<div class="slide">
====Desde Eclipse====
+
*'''Nota:''' A partir de '''Android 4.2''', las opciones de desarrollo no están visibles por defecto: ''"To make it available, go to Settings > About phone and tap Build number seven times. Return to the previous screen to find Developer options."''
*Indicar que queremos desplegarlo en el dispositivo al ejecutar la aplicación
+
*Cuando ejecutemos la aplicación veremos una pantalla similar a la siguiente:
+
:Eclipse->Windows->Open Perspective->DDMS
+
*Aparecerán los emuladores que tengamos corriendo y los dispositivos físicos que estén enchufados a la entrada USB del PC
+
*En caso de tener un solo dispositivo disponible esta pantalla no aparecerá.
+
 
</div>
 
</div>
 
 
  
  
 
<div class="slide">
 
<div class="slide">
 
 
== Usos más frecuents de adb ==
 
== Usos más frecuents de adb ==
 
</div>
 
</div>
 +
 
<div class="slide">
 
<div class="slide">
 
====adb help====
 
====adb help====
Línea 146: Línea 146:
 
*Veremos a continuación las más importantes
 
*Veremos a continuación las más importantes
 
</div>
 
</div>
 +
 
<div class="slide">
 
<div class="slide">
 
====Comprobación comunicación====
 
====Comprobación comunicación====
Línea 210: Línea 211:
 
</div>
 
</div>
  
<div class="slide"
+
<div class="slide">
====Error driver====
+
====Errores habituales====
 
*No se reconoce el dispositivo:
 
*No se reconoce el dispositivo:
 
<source lang="bash">
 
<source lang="bash">
Línea 217: Línea 218:
 
List of devices attached  
 
List of devices attached  
 
?????????? device
 
?????????? device
 
juanda@juanda-PC:~$
 
 
</source>
 
</source>
*Reiniciar servicio adb:
+
*False de permisos:
<source lang="bash">
+
adb kill-server
+
adb start-server
+
</source>
+
</div>
+
 
+
<div class="slide">
+
====Error no permissions====
+
 
<source lang="bash">
 
<source lang="bash">
 
juanda@juanda-PC:~$ adb devices
 
juanda@juanda-PC:~$ adb devices
Línea 235: Línea 226:
 
juanda@juanda-PC:~$  
 
juanda@juanda-PC:~$  
 
</source>
 
</source>
 +
</div>
 +
<div class="slide">
 
*Driver incorrecto
 
*Driver incorrecto
*Configuración fichero udev
+
*Configuración errónea fichero udev
 +
*Reiniciar udev:
 +
<source lang="bash">
 +
juanda@juanda-PC:/etc/udev/rules.d$ sudo service udev restart
 +
udev stop/waiting
 +
udev start/running, process 9069
 +
juanda@juanda-PC:/etc/udev/rules.d$
 +
</source>
 
*Reiniciar servicio adb:
 
*Reiniciar servicio adb:
 
<source lang="bash">
 
<source lang="bash">
Línea 243: Línea 243:
 
</source>
 
</source>
 
</div>
 
</div>
<div class="slide">
 
 
<div class="slide">
 
<div class="slide">
  
Línea 255: Línea 254:
 
</source>
 
</source>
 
</div>
 
</div>
 
+
<div class="slide">
 
==adb vía wifi==
 
==adb vía wifi==
 +
</div>
 +
<div class="slide">
 +
====Primer método: desde el terminal====
 +
*Habilitar adb desde el dispositivo movil (debemos ser root):
 +
<source lang="bash">
 +
setprop service.adb.tcp.port 5555
 +
stop adbd
 +
start adbd
 +
</source>
 +
 +
*Para deshabilitarlo:
 +
<source lang="bash">
 +
setprop service.adb.tcp.port -1
 +
stop adbd
 +
start adbd
 +
</source>
 +
</div>
  
 
<div class="slide">
 
<div class="slide">
  
 +
====2º método: desde el PC====
 +
*Desde un equipo, '''con acceso USB'''
 +
<source lang="bash">
 +
adb tcpip 5555
 +
adb connect <ip>:5555
 +
</source>
 +
*El puerto no hace falta, por defecto es el 5555
 +
*Para volver a escuchar por USB:
 +
<source lang="bash">
 +
adb usb
 +
</source>
 +
</div>
 +
<div class="slide">
 +
*Primer método: hay que teclear mucho desde el movil, ¡muy pesado!
 +
*Segundo método: hace falta llevar el cable usb, ¡una lata!
 +
*Tercer método: Instalar una aplicación en el móvil: adbWireless, WiFi ADB o ADB WiFi. ¡Necesitan acceso root!
 +
</div>
 +
<div class="slide">
 +
==Eclipse y adb==
 +
</div>
 +
<div class="slide">
 +
*Si adb no está correctamente configurado desde Eclipse no funcionará.
 +
*Indicar que queremos desplegarlo en el dispositivo al ejecutar la aplicación
 +
*Cuando ejecutemos la aplicación veremos una pantalla similar a la siguiente:
 +
:Eclipse->Windows->Open Perspective->DDMS
 +
*Aparecerán los emuladores que tengamos corriendo y los dispositivos físicos que estén enchufados a la entrada USB del PC
 +
*En caso de tener un solo dispositivo disponible esta pantalla no aparecerá.
 +
</div>
 +
<div class="slide">
 
==Ejemplos uso terminal Linux en en Android==
 
==Ejemplos uso terminal Linux en en Android==
 
</div>
 
</div>
 
<div class="slide">
 
<div class="slide">
===Actualización fichero /etc/hosts===
+
====Actualización fichero /etc/hosts====
 
*El comando para ver las interfaces del movil es netcfg (no ifconfig)
 
*El comando para ver las interfaces del movil es netcfg (no ifconfig)
 
*El fichero hosts se encuentra en /system/etc/hosts
 
*El fichero hosts se encuentra en /system/etc/hosts
Línea 274: Línea 319:
 
</source>
 
</source>
 
</div>
 
</div>
<source lang="bash">
+
 
 +
<div class="slide">
 
*Añado una o varias entradas en el fichero pero hay un error al hacer el push:
 
*Añado una o varias entradas en el fichero pero hay un error al hacer el push:
 
<source lang="bash">
 
<source lang="bash">
Línea 287: Línea 333:
 
</source>
 
</source>
 
</div>
 
</div>
<source lang="bash">
+
 
 +
<div class="slide">
 
*En muchos dispositivos la partición /system se monta como solo lectura así que hay que montarla con permisos de escritura.
 
*En muchos dispositivos la partición /system se monta como solo lectura así que hay que montarla con permisos de escritura.
 
*A continuación todas las trazas al cambiarlo en mi sistema:
 
*A continuación todas las trazas al cambiarlo en mi sistema:
Línea 299: Línea 346:
 
</source>
 
</source>
 
</div>
 
</div>
 +
 
<div class="slide">
 
<div class="slide">
 
*La partición ya tiene permisos de lectura, hacemos el push:
 
*La partición ya tiene permisos de lectura, hacemos el push:
Línea 308: Línea 356:
 
*¡Vaya! Ahora fallan los permisos....
 
*¡Vaya! Ahora fallan los permisos....
 
</div>
 
</div>
 +
 
<div class="slide">
 
<div class="slide">
 
*Cambiamos permisos fichero /etc/hosts para su sustitución:
 
*Cambiamos permisos fichero /etc/hosts para su sustitución:
Línea 322: Línea 371:
 
</source>
 
</source>
 
</div>
 
</div>
 +
 
<div class="slide">
 
<div class="slide">
 
*Comprobamos que todo ha ido bien y ponemos todo como estaba:
 
*Comprobamos que todo ha ido bien y ponemos todo como estaba:

Última revisión de 11:10 15 may 2013


¿Qué es ADB?

  • ADB son las siglas de Android Debug Bridge
  • Es una herramienta de desarrollo incluida en el SDK de Android.
  • Comunica el dispositivo Android o el emulador con el ordenador.
  • Sirve para instalar aplicaciones, ver ficheros de log, hacer push o pull de ficheros...

Cómo usar ADB

  • Debemos instalar el SDK de Android o el ADT-Bundle
  • Está situado en el directorio platform-tools.
  • Es conveniente añadirlo en la variable de entorno $PATH (fichero $HOME/.bashrc en Linux):
juanda@juanda-PC:~$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/games:/home/juanda/Android/sdk/tools:/home/juanda/Android/sdk/platform-tools
  • No es necesario ser root para utilizarlo
  • Normalmente se utiliza vía USB pero también puede hacerse vía wifi.

Configuración previa para usar adb

Windows

  • Tendremos que descargar el driver adb para el dispositivo.
  • En la web de Android hay un listado de enlaces para la descarga de los drivers de los principales fabricantes.
  • Puedes encontrar un driver genérico que se encuentra en la carpeta android-sdk-windows\usb_driver del SDK Android.
  • Lo más probable es que tengas que utilizar el driver del fabricante.
  • A veces también hace falta otro ejecutable adb distinto al que aparece en el Android SDK.
  • Para los que no aparecen habrá que ir a sus webs o contactar con su servicio de soporte.
  • No siempre existen los drivers o funcionan como debieran ¡ojo!
  • En ocasiones para que funcione se utiliza el driver de google pero modificando el fichero de instalación del driver: adb_usb.ini

Mac

  • No hace falta hacer nada.
  • Filosofia MAC: O funciona directamente o no funciona.
Ubuntu
  • Es conveniente leer la documentación sobre udev (gestión dinámica de dispositivos en Linux)
  • Tendremos que añadir el fichero 51-android.rules con los permisos y texto que figura a continuación:
root@juanda-PC:/etc/udev/rules.d# ls -l 51-android.rules 
-rw-r--r-- 1 root root 76 feb 24 11:33 51-android.rules
root@juanda-PC:/etc/udev/rules.d# cat 51-android.rules 
SUBSYSTEM=="usb", ATTR{idVendor}=="ID_DISPOSITIVO", MODE="0666", GROUP="plugdev"
root@juanda-PC:/etc/udev/rules.d#
  • Tendremos que conocer el identificador del dispositivo (ID_DISPOSITIVO), así que conectamos el dispositivo y observamos las trazas del fichero de logs del sistema:
tail -100f /var/log/syslog
Feb 24 11:12:27 juanda-PC kernel: [ 1918.767308] usb 3-1: new high-speed USB device number 6 using xhci_hcd
Feb 24 11:12:27 juanda-PC mtp-probe: checking bus 3, device 6: "/sys/devices/pci0000:00/0000:00:14.0/usb3/3-1"
Feb 24 11:12:27 juanda-PC kernel: [ 1918.784245] usb 3-1: ep 0x81 - rounding interval to 32768 microframes, ep desc says 0 microframes
Feb 24 11:12:27 juanda-PC kernel: [ 1918.784252] usb 3-1: ep 0x83 - rounding interval to 32768 microframes, ep desc says 0 microframes
Feb 24 11:12:27 juanda-PC kernel: [ 1918.784256] usb 3-1: ep 0x4 - rounding interval to 32768 microframes, ep desc says 0 microframes
Feb 24 11:12:27 juanda-PC kernel: [ 1918.784796] scsi11 : usb-storage 3-1:1.0
Feb 24 11:12:27 juanda-PC mtp-probe: bus: 3, device: 6 was not an MTP device
Feb 24 11:12:28 juanda-PC kernel: [ 1919.781950] scsi 11:0:0:0: Direct-Access     Linux    File-CD Gadget   0000 PQ: 0 ANSI: 2
Feb 24 11:12:28 juanda-PC kernel: [ 1919.782212] scsi 11:0:0:1: Direct-Access     Linux    File-CD Gadget   0000 PQ: 0 ANSI: 2
Feb 24 11:12:28 juanda-PC kernel: [ 1919.782607] sd 11:0:0:0: Attached scsi generic sg8 type 0
  • De las trazas observamos que el dispositivo se conecta como bus:3, device: 6
  • Ejecutamos lsusb para ver el vendor id del dispositivo, en nuestro caso 2207:0010:
juanda@juanda-PC:/etc/udev$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 003: ID 413c:2111 Dell Computer Corp. 
Bus 001 Device 004: ID 046d:c063 Logitech, Inc. DELL Laser Mouse
Bus 004 Device 002: ID 059f:104a LaCie, Ltd 
Bus 002 Device 003: ID 058f:6362 Alcor Micro Corp. Flash Card Reader/Writer
Bus 001 Device 006: ID 0cf3:e004 Atheros Communications, Inc. 
Bus 003 Device 006: ID 2207:0010
  • Actualizamos el fichero anterior:
juanda@juanda-PC:/etc/udev/rules.d$ cat 51-android.rules 
SUBSYSTEM=="usb", ATTR{id_vendor}=="2207", MODE="0666", GROUP="plugdev"
  • Reiniciamos el servicio de udev:
juanda@juanda-PC:/etc/udev/rules.d$ sudo service udev restart
udev stop/waiting
udev start/running, process 9069
juanda@juanda-PC:/etc/udev/rules.d$
  • Paramos y arrancamos adb (android device bridge) y comprobamos la lista de dispositivos:
juanda@juanda-PC:/etc/udev/rules.d$ adb kill-server
juanda@juanda-PC:/etc/udev/rules.d$ adb start-server
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
juanda@juanda-PC:/etc/udev/rules.d$ adb devices
List of devices attached 
emulator-5554	device

Configuración del dispositivo

(Configuración de dispositivo físico Android para despliegue de aplicaciones de desarrollo)
  • En Android 4 la habilitación del USB Debug está en Ajustes > Opciones de Desarrollo.
  • Nota: A partir de Android 4.2, las opciones de desarrollo no están visibles por defecto: "To make it available, go to Settings > About phone and tap Build number seven times. Return to the previous screen to find Developer options."


Usos más frecuents de adb

adb help

  • adb provee numerosas funciones que se pueden ver en detalle mediante el comando:
adb help
  • Veremos a continuación las más importantes

Comprobación comunicación

  • Mediante el comando: adb devices
  • Si nos sale un número de serie, es que todo está correcto:
juanda@juanda-PC:~$ adb devices
List of devices attached 
01a927828f90ccde	device
juanda@juanda-PC:~$

Comunicación vía shell

  • Mediante el comando: adb shell
  • Se pueden mandar comandos individuales de shell mediante: adb shell <command_to_be_executed_on_the_device>
  • Desde Android 4.2.2 se pide autorizar el acceso a cada ordenador desde una ventana emergente el el dispositivo movil.
  • Si el terminal resulta pequeño podemos ejecutar el siguiente comando:
stty rows 60 cols 156

Transferencia de ficheros

  • adb push <local> <remote>
Copiamos un fichero del ordenador al movil.
Se pueden incluir tanto el path local como el remoto.
  • adb pull <remote> [<local>]
Copiamos un fichero remoto (del movil) al PC.

Ver el fichero de log en tiempo real

  • adb logcat
  • Devuelve una ingente cantidad de eventos escritos en diversos registros sobre el funcionamiento del sistema
  • Es útil usar algún filtro o redirigir a un fichero.

Instalación de aplicaciones

  • adb install <file>
  • Los ficheros (aplicaciones) deben tener extensión .apk
  • Es necesario tener el side-load marcado.
  • adb install -r <file>: Para actualizar
  • adb uninstall Aplicacion.apk: Para desinstalar

Reiniciar el dispositivo

  • adb reboot
  • adb reboot bootloader
  • adb reboot recovery

Error "Device not found"

  • Se producen cuando adb no encuentra el dispositivo.
  • Podemos reiniciar el servicio de adb:
adb kill-server 
adb start-server
  • Hay que asegurarse que la opción USB debugging o Android Debug Bridge desde Ajustes->Herramientas de Desarrollo (varía un poco de versión a versión).

Errores habituales

  • No se reconoce el dispositivo:
juanda@juanda-PC:~$ adb devices
List of devices attached 
??????????	device
  • False de permisos:
juanda@juanda-PC:~$ adb devices
List of devices attached 
????????????	no permissions
juanda@juanda-PC:~$
  • Driver incorrecto
  • Configuración errónea fichero udev
  • Reiniciar udev:
juanda@juanda-PC:/etc/udev/rules.d$ sudo service udev restart
udev stop/waiting
udev start/running, process 9069
juanda@juanda-PC:/etc/udev/rules.d$
  • Reiniciar servicio adb:
adb kill-server 
adb start-server

Error en funcionamiento de dispositivos físicos y emuladores

  • El error es el siguiente:
[2013-02-22 13:55:20 - adb] Unexpected exception 'Cannot run program "/home/juanda/Android/sdk/platform-tools/adb": java.io.IOException: error=2, No existe el archivo o el directorio' while attempting to get adb version from '/home/juanda/Android/sdk/platform-tools/adb'
  • Solución, instalar los siguientes paquetes:
sudo apt-get update
sudo apt-get install ia32-libs

adb vía wifi

Primer método: desde el terminal

  • Habilitar adb desde el dispositivo movil (debemos ser root):
setprop service.adb.tcp.port 5555
stop adbd
start adbd
  • Para deshabilitarlo:
setprop service.adb.tcp.port -1
stop adbd
start adbd

2º método: desde el PC

  • Desde un equipo, con acceso USB
adb tcpip 5555
adb connect <ip>:5555
  • El puerto no hace falta, por defecto es el 5555
  • Para volver a escuchar por USB:
adb usb
  • Primer método: hay que teclear mucho desde el movil, ¡muy pesado!
  • Segundo método: hace falta llevar el cable usb, ¡una lata!
  • Tercer método: Instalar una aplicación en el móvil: adbWireless, WiFi ADB o ADB WiFi. ¡Necesitan acceso root!

Eclipse y adb

  • Si adb no está correctamente configurado desde Eclipse no funcionará.
  • Indicar que queremos desplegarlo en el dispositivo al ejecutar la aplicación
  • Cuando ejecutemos la aplicación veremos una pantalla similar a la siguiente:
Eclipse->Windows->Open Perspective->DDMS
  • Aparecerán los emuladores que tengamos corriendo y los dispositivos físicos que estén enchufados a la entrada USB del PC
  • En caso de tener un solo dispositivo disponible esta pantalla no aparecerá.

Ejemplos uso terminal Linux en en Android

Actualización fichero /etc/hosts

  • El comando para ver las interfaces del movil es netcfg (no ifconfig)
  • El fichero hosts se encuentra en /system/etc/hosts
  • Obtenemos el fichero hosts del movil para modificarlo:
juanda@dpto-01:~/Android/sdk/tools$ adb pull /etc/hosts
0 KB/s (25 bytes in 0.038s)
juanda@dpto-01:~/Android/sdk/tools$ cat hosts
127.0.0.1		    localhost
  • Añado una o varias entradas en el fichero pero hay un error al hacer el push:
juanda@dpto-01:~/Android/sdk/tools$ vi hosts 
juanda@dpto-01:~/Android/sdk/tools$ cat hosts
127.0.0.1    localhost
192.168.1.1  incidencias.jd  www.incidencias.jd
192.168.1.1  spp.jd  www.spp.jd
juanda@dpto-01:~/Android/sdk/tools$ adb push hosts /etc/hosts
failed to copy 'hosts' to '/etc/hosts': Read-only file system
juanda@dpto-01:~/Android/sdk/tools$
  • En muchos dispositivos la partición /system se monta como solo lectura así que hay que montarla con permisos de escritura.
  • A continuación todas las trazas al cambiarlo en mi sistema:
juanda@dpto-01:~/Android/sdk/tools$ adb shell
shell@android:/ $ su -
shell@android:/ # mount -o rw,remount /system                              
shell@android:/ # exit
shell@android:/ $ exit
juanda@dpto-01:~/
  • La partición ya tiene permisos de lectura, hacemos el push:
juanda@dpto-01:~/Android/sdk/tools$ adb push hosts /etc/hosts
failed to copy 'hosts' to '/etc/hosts': Permission denied
juanda@dpto-01:~/
  • ¡Vaya! Ahora fallan los permisos....
  • Cambiamos permisos fichero /etc/hosts para su sustitución:
juanda@dpto-01:~/Android/sdk/tools$ adb shell
shell@android:/ $ cd etc
shell@android:/etc $ su - 
shell@android:/system/etc # chmod 777 hosts
shell@android:/system/etc # exit
shell@android:/etc $ exit
juanda@dpto-01:~/Android/sdk/tools$ adb push hosts /etc/hosts
2 KB/s (103 bytes in 0.040s)
juanda@dpto-01:~/Android/sdk/tools$
  • Comprobamos que todo ha ido bien y ponemos todo como estaba:
juanda@dpto-01:~/Android/sdk/tools$ adb shell
shell@android:/ $ su -
shell@android:/ # cd etc 
shell@android:/etc # chmod 644 hosts
shell@android:/etc # ls -l hosts
-rw-r--r-- root     root          103 2013-04-12 13:00 hosts
shell@android:/etc # mount -o ro,remount /system
shell@android:/etc # cat hosts
127.0.0.1    localhost
192.168.1.1  incidencias.jd  www.incidencias.jd
192.168.1.1  spp.jd  www.spp.jd
shell@android:/etc #