tarea superusuario soportada rootear permisos permiso operacion habilitar fallo explorador esta deja dar copiar con como activar android file attributes setattr

superusuario - habilitar explorador root android



¿Cómo configuro los atributos de usuario extendidos en los archivos de Android? (1)

¿Hay alguna manera para que mi aplicación de Android recupere y establezca los atributos de usuario extendidos de los archivos? ¿Hay alguna forma de usar java.nio.file.Files en android? ¿Hay alguna forma de usar setfattr y getfattr desde mi aplicación dalvik? Sé que Android usa el sistema de archivos ext4, así que supongo que debería ser posible. ¿Alguna sugerencia?


La biblioteca Android Java y la biblioteca Bionic C no son compatibles. Entonces debe usar código nativo con llamadas de sistema de Linux para eso.

Aquí hay un código de muestra para comenzar, probado en Android 4.2 y Android 4.4.

XAttrNative.java

package com.appfour.example; import java.io.IOException; public class XAttrNative { static { System.loadLibrary("xattr"); } public static native void setxattr(String path, String key, String value) throws IOException; }

xattr.c

#include <string.h> #include <jni.h> #include <asm/unistd.h> #include <errno.h> void Java_com_appfour_example_XAttrNative_setxattr(JNIEnv* env, jclass clazz, jstring path, jstring key, jstring value) { char* pathChars = (*env)->GetStringUTFChars(env, path, NULL); char* keyChars = (*env)->GetStringUTFChars(env, key, NULL); char* valueChars = (*env)->GetStringUTFChars(env, value, NULL); int res = syscall(__NR_setxattr, pathChars, keyChars, valueChars, strlen(valueChars), 0); if (res != 0) { jclass exClass = (*env)->FindClass(env, "java/io/IOException"); (*env)->ThrowNew(env, exClass, strerror(errno)); } (*env)->ReleaseStringUTFChars(env, path, pathChars); (*env)->ReleaseStringUTFChars(env, key, keyChars); (*env)->ReleaseStringUTFChars(env, value, valueChars); }

Esto funciona bien en el almacenamiento interno, pero no en el almacenamiento externo (emulado) que utiliza el sistema de archivos sdcardfs u otras funciones del kernel para deshabilitar funciones no compatibles con el sistema de archivos FAT, como enlaces simbólicos y atributos extendidos. Podría decirse que hacen esto porque se puede acceder al almacenamiento externo conectando el dispositivo a una PC y los usuarios esperan que la copia de archivos adelante y atrás preserve toda la información.

Entonces esto funciona:

File dataFile = new File(getFilesDir(),"test"); dataFile.createNewFile(); XAttrNative.setxattr(dataFile.getPath(), "user.testkey", "testvalue");

mientras esto arroja IOException con el mensaje de error: "Operación no soportada en el punto final de transporte":

File externalStorageFile = new File(getExternalFilesDir(null),"test"); externalStorageFile.createNewFile(); XAttrNative.setxattr(externalStorageFile.getPath(), "user.testkey", "testvalue");