Mover la ubicación de instalación en un dispositivo Android 5 Lollipop no rooteado

Tengo un Moto G (segunda generación) con Android 5.02. La tarjeta SD interna tiene aproximadamente 8 Gb y tengo una tarjeta SD externa con 16 Gb de espacio libre.

Mover la aplicación a SDCARD desde el menú de la aplicación la mueve a sdcard0, que es la tarjeta SD interna.

Comando de shell adb:

pm get-install-location

me da:

0[auto]

Traté de establecer la ubicación de instalación a través de:

pm set-install-location 2

Pero estoy recibiendo este error:

Error: java.lang.SecurityException: Package android does not belong to 2000

Creo que me quejo de los permisos de root.

Y debido a que es una compilación de producción que intenta:

adb root

me da:

 adbd cannot run as root in production builds

¿Hay alguna forma de configurar las aplicaciones para instalar sus datos en una tarjeta SD externa?

PD: no quiero instalar una rom personalizada o instalar un software de terceros para rootear el teléfono.

Editar: me di cuenta de que los datos de las aplicaciones se almacenaron en la carpeta /storage/sdcard0/Android, así que pensé en mover esta carpeta /storage/sdcard1/y crear un enlace simbólico de esta manera:

ln -s /storage/sdcard1/Android /storage/sdcard0/Android

¿Esto hará el trabajo?

Gracias.

Respuestas (5)

Básicamente hablando: no puedes. Al menos no sin rootear .
Las principales razones por las que Android no te permite instalar una aplicación en tu tarjeta SD externa son:

  1. Seguridad : Es la razón principal de esa restricción. Los sistemas de archivos básicos como NTFS o FAT (cualquiera de sus versiones) no permiten la administración de permisos similar a Unix.
    Esto significa: cualquier aplicación podría escribir en cualquier archivo en ese almacenamiento.
    Pensando en aplicaciones maliciosas, podrían reemplazar las aplicaciones adecuadas con otras falsas/infectadas, bloqueando su teléfono y dejándolo inutilizable.

  2. Almacenamiento volátil : no es seguro insertar su tarjeta SD externa en su dispositivo todo el tiempo. Puede expulsarlo en cualquier momento, lo que hace que su tarjeta SD no sea un buen candidato para un almacenamiento permanente. Considere que las aplicaciones se ejecutan desde su tarjeta SD y las expulsa. Esas aplicaciones simplemente fallarán y todas las demás aplicaciones guardadas en su tarjeta SD también desaparecerán. No puede usarlos en ese momento y los datos de esas aplicaciones también se ven afectados por la razón #1.

Tengo experiencia en Linux, así que consideré este enfoque: noté que la opción de menú de la aplicación "Mover a SDCARD" creó una carpeta llamada Android en sdcard0 (la interna) con datos de aplicaciones; ¿Funcionará la creación de un enlace simbólico (en sdcard0) llamado Android a una carpeta llamada Android en sdcard1?
El problema es que Android solo almacena datos de aplicaciones y obb en archivos /sdcard/sdcard0/Android. Las aplicaciones se almacenan en una carpeta oculta llamada a la .android_secureque ni siquiera roottiene acceso (lo probé en mi dispositivo, ni siquiera puedes acceder a cdesa carpeta).
¡En realidad eso es precisamente lo que necesito! El principal problema que me hace pensar en esto son los datos, especialmente con juegos pesados. Las aplicaciones principales no son tan grandes en comparación con los datos que agregan más tarde. Entonces, ¿crees que podría funcionar?
Si son solo datos u obb , ciertamente funciona. Al menos en las versiones de Android que no hacen sdcard_rwpertenecer al rootgrupo ni presentan al usuario sdcard_rwen absoluto. Pero con un poco de cambios en los permisos, debería poder solucionarlo.
Correr ls -l /storage/sdcard0me dio esto lrwxrwxrwx root root 2015-04-20 15:59 sdcard0 -> /storage/emulated/legacyy correr ls -l /storage/sdcard0/me dio esto drwxrwx--x root sdcard_r 2014-12-20 18:16 Android.. ¿Es eso una buena o una mala noticia? Como no soy root, creo que no puedo establecer permisos.
El primer resultado era predecible, su tarjeta SD interna se encuentra en realidad en /data/media, donde storage/emulated/legacyapunta a. El otro resultado es una "solución fácil": primero debe mover la Androidcarpeta original a otra ubicación o cambiarle el nombre para hacer espacio para el enlace simbólico. A continuación, enlace y asigne /storage/sdcard1/Androidun /storage/sdcard0/Androidnombre al enlace Android. Por fin arregla todos los permisos (777). Esto es solo teórico, pero imagino que debería funcionar así.
Lo estoy probando ahora mismo. cp -R /storage/sdcard0/Android /storage/sdcard1/(demasiado inestable sobre el mvlol) entonces rm -r /storage/sdcard0/Androidentonces ln -s /storage/sdcard1/Android /storage/sdcard0/Android. Si esto funciona, el crédito es para usted, por lo que puede actualizar su respuesta. ¡Yo lo haré saber! ;-)
No lo elimine Androidromperá todas las aplicaciones en ejecución (o al menos la mayoría de ellas). Es solo un enfoque teórico fuera de mi cabeza; nada que seguir exactamente. Si es lo suficientemente rápido, es posible que pueda recuperar aplicaciones después de fallar, pero tenga en cuenta que todas las acciones se deshacen después del próximo reinicio.
¡Sí! ¡Todo se rompió! lol no pude crear un enlace simbólico: me dio el error ln: /storage/sdcard0/Android: Operation not permitted. Entonces, la siguiente pregunta es ¿cómo crear un enlace simbólico? (Revertí mis cambios y todo está bien... ¡o eso creo por ahora! jajaja)
El problema principal es: Android rastrea los accesos a los archivos y, si falta una de las Androidcarpetas, las vuelve a crear un momento después. Esta es también la razón por la cual aplicaciones como Link2SD vinculan carpetas de aplicaciones individuales en lugar de la Androidcarpeta completa. Puedes intentarlo, pero no puedo prometer el éxito.
Esto es bastante interesante porque tengo un problema con solo una carpeta de datos de un juego (que ocupa 2 Gb). Lo intentaré e informaré. Gracias. PD: Link2SD no hizo nada en mi caso.
Así es como Link2SD funcionó la última vez que lo usé. Ya no lo necesito porque mi espacio de almacenamiento es suficiente :)
No pude crear un solo enlace simbólico. ( Operation not permitted). Creo que es simplemente porque mi sdcard1está formateado en fat32. ¿A qué debo formatearlo (me refiero a su partición principal)?
Puede crear un enlace simbólico a cualquier lugar, no importa el destino (aunque fusees posible que no le permita crear un enlace simbólico a su tarjeta SD externa). Si puede, intente formatear su tarjeta SD para que ext4los permisos se puedan aplicar sin usar fuseun administrador de permisos intermedio, que bloquea la mayoría de los intentos de lectura y escritura sin el permiso adecuado del paquete.
No pude usar ext4 porque mi teléfono no lo reconoció y mantuvo w95 fat32 LBA (¿problema del kernel?!). Tampoco pude crear enlaces simbólicos por muchas razones: no root (?!), problema de fat32.. Ahora Creo que tomaré la opción B.. ^^
Solo rootpuede crear enlaces simbólicos. Ten eso en mente.

¡Básicamente puedes! ;)

  • ¡ Primero, rootee su teléfono!
  • En segundo lugar, cree una partición secundaria en su tarjeta SD (Ext.4) >= 2GB y configúrela como primaria.
  • En tercer lugar, descargue e instale la aplicación Link2sd desde playstore. Abra la aplicación y le pediré que cree un punto de montaje para su segunda partición. Seleccione Sí. Reiniciar.

Después de reiniciar, CADA aplicación que instales irá automáticamente a la tarjeta SD.

Si no sabes como crear particiones busca una guía en Google hay muchas

Eso es en realidad lo que estoy tratando de evitar: instalar software de terceros. :-)

Ese fue un gran viaje en busca de una respuesta que no implicara el enraizamiento, pero terminé:

  1. Desbloqueo de mi gestor de arranque

  2. Arrancando en TWRP sin instalarlo:

    fastboot boot recovery.img
    
  3. Instalando SuperSU de Chainfire con TWRP.

  4. Desde Terminal Emulator o el shell de adb :

    su
    pm set-install-location 2
    
  5. Desde el menú de una aplicación, con Settings > Applicationssolo presionar Move to SDCARDse mueve* - sus datos y obb - a la SDCARD externa.

  6. Eliminando SuperSU......

Desrooteo completo

No... ¡Yo no hice eso! 3 :)

Vaya a esta dirección http://developer.android.com/tools/help/shell.html#shellcommands

Android 5 y superior no es compatible con estopm get-install-location

Intente hacer una copia de seguridad de su apk y siga los pasos a continuación

adb shell pm install -r -s <path of your apk>

Ejemplo

adb shell pm install -r -s /storage/sdcard1/base.apk

-r significa reinstalar apk con datos existentes y -s significa sdcard

" Android 5 y versiones posteriores no son compatibles con esta ubicación de instalación de instalación de pm ": ¿cómo lo sabes? Prueba esto: android.googlesource.com/platform/frameworks/base/+/… . Es para Android 5.1.1. ¡Tengo soporte para este argumento en mi Android 5.0.2, 5.1.1 y 6.0.1!
Lo sentimos, pero -ses para especificar en qué dispositivo debe operar adb (" -s <serialNumber>").

Primero instale Adbd insecure ( descarga apk desde xda-developers ).

Una vez instalado en su dispositivo, ábralo y marque la casilla: "Habilitar adbd inseguro".

Ahora puede cambiar la ubicación para instalar sus aplicaciones.