2010-08-06 41 views
24

Possible Duplicate:
Determine if running on a rooted device¿Cómo determinar si un dispositivo Android está rooteado programáticamente?

¿Cómo se determina (mediante programación) si un dispositivo Android es: arraigado Ejecución de una copia agrietada de su software o ROM.

Tengo información confidencial en mi base de datos, y me gustaría encriptarla cuando el teléfono está rooteado, también conocido como el usuario tiene acceso a la base de datos. ¿Cómo lo detecto?

Respuesta

26

La detección de enraizamiento es un juego de gato y ratón y es difícil hacer detección de enraizamiento que funcione en todos los dispositivos para todos los casos.

Si aún necesita algunos básica enraizamiento de detección de comprobar el código de abajo:

/** 
    * Checks if the device is rooted. 
    * 
    * @return <code>true</code> if the device is rooted, <code>false</code> otherwise. 
    */ 
    public static boolean isRooted() { 

    // get from build info 
    String buildTags = android.os.Build.TAGS; 
    if (buildTags != null && buildTags.contains("test-keys")) { 
     return true; 
    } 

    // check if /system/app/Superuser.apk is present 
    try { 
     File file = new File("/system/app/Superuser.apk"); 
     if (file.exists()) { 
     return true; 
     } 
    } catch (Exception e1) { 
     // ignore 
    } 

    // try executing commands 
    return canExecuteCommand("/system/xbin/which su") 
     || canExecuteCommand("/system/bin/which su") || canExecuteCommand("which su"); 
    } 

    // executes a command on the system 
    private static boolean canExecuteCommand(String command) { 
    boolean executedSuccesfully; 
    try { 
     Runtime.getRuntime().exec(command); 
     executedSuccesfully = true; 
    } catch (Exception e) { 
     executedSuccesfully = false; 
    } 

    return executedSuccesfully; 
    } 

Probablemente no siempre es correcta. Probado en ~ 10 dispositivos en 2014.

+4

¿Quieres decir rooteado con una herramienta específica que agrega Superuser.apk? No existe una forma programática garantizada para determinar si un dispositivo está rooteado, ya que la mayoría de los controles podrían ser eludidos. – dljava

+1

He estado utilizando esta verificación en mi producto, pero recientemente el Nexus 7.1 informa fallas en todos estos (no hay ningún comando 'which' instalado) y SuperSu no se está instalando en la carpeta/system/app. – Graeme

+0

Puede ser que también debería echar un vistazo a http://stackoverflow.com/questions/1101380/determine-if-running-on-a-rooted-device –

1

El official licensing guide dice:

A limitation of the legacy copy-protection mechanism on Android Market is that applications using it can be installed only on compatible devices that provide a secure internal storage environment. For example, a copy-protected application cannot be downloaded from Market to a device that provides root access, and the application cannot be installed to a device's SD card.

Parece que usted se beneficiaría del uso de ese legado poli-protección para evitar que su aplicación sea instalada en dispositivos con.

Puede lanzar una versión separada que se puede instalar en dispositivos rooteados con una base de datos cifrada.

+0

Pero, ¿cómo pueden detectar si el dispositivo está rooteado o no? Como ha mencionado hackbod (desarrollador de Android), no es posible detectarlo. http://stackoverflow.com/questions/3576989/how-can-you-detect-if-the-device-is-rooted-in-the-app –

5

Si la información es confidencial, probablemente solo deba encriptarla para todos los usuarios. De lo contrario, un usuario podría instalar su aplicación sin necesidad de root, luego rootear y leer su base de datos una vez que los datos hayan sido escritos.

+0

El problema es que si su contenido es contenido multimedia (mp3, mp4) , incluso cifrado originalmente, y desea reproducir en el reproductor multimedia, necesita utilizar un archivo descifrado temporal en algún momento, al que se puede acceder desde un dispositivo rooteado. –

Cuestiones relacionadas