2010-10-12 10 views
0

J'ai une application sur le marché qui est pour les appareils enracinés seulement. J'ai testé l'application de manière approfondie sur un G1, MT3G et Cliq sans racines. Je reçois un certain nombre de notes faibles de personnes avec des appareils supposément enracinés, disant que l'application leur dit qu'ils ne sont pas enracinées (bien sûr, ils ne laissent généralement pas d'informations importantes comme quel téléphone et quelle rom)Android: App ne fonctionne pas sur certains appareils enracinés ... Pourquoi?

Ici est le code qui génère l'erreur ... quelqu'un peut-il voir quel pourrait être le problème?

final Button button = (Button) findViewById(R.id.******); 
     button.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       String command1 = "mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system"; 
       String command2 = "cp -f /sdcard/******* /etc/"; 
       String command3 = "dos2unix -u /etc/*****"; 
       String command4 = "mount -o ro,remount -t yaffs2 /dev/block/mtdblock3 /system"; 

       execCommandLine1(command1); 
       execCommandLine1(command2); 
       execCommandLine1(command3); 
       execCommandLine1(command4); 
} 



void execCommandLine1(String command) 
    { 
     Runtime runtime = Runtime.getRuntime(); 
     Process proc = null; 
     OutputStreamWriter osw = null; 

     try 
     { 
      proc = runtime.exec("su"); 
      osw = new OutputStreamWriter(proc.getOutputStream()); 
      osw.write(command); 
      osw.flush(); 
      osw.close(); 
     } 
     catch (IOException ex) 
     { 

      Log.e("execCommandLine()", "Command resulted in an IO Exception: " + command); 
      return; 
     } 
     finally 
     { 
      if (osw != null) 
      { 
       try 
       { 
        osw.close(); 
       } 
       catch (IOException e){} 
      } 
     } 

     try 
     { 
      proc.waitFor(); 
     } 
     catch (InterruptedException e){} 

     if (proc.exitValue() != 0) 
     { 
      **// Error Dialog that is being erroneously displayed** 

     } 
     else { 

       // Success Dialog 
     } 

    } 
+0

Et l'erreur est ... quoi? – CommonsWare

+0

J'imagine que certains périphériques n'ont pas leur système de fichiers '/ system' dans'/dev/block/mtdblock3', ou qu'ils ne sont pas installés avec 'dos2unix' ou dans le chemin. –

+0

@CommonsWare Mon dialogue d'erreur est affiché sur certains périphériques enracinés ... indiquant que (proc.exitValue()! = 0) qui ne devrait pas arriver sur un téléphone enraciné, à moins que quelque chose ne va pas avec mes commandes ou la façon dont je je les exécute –

Répondre

0

Je suis d'accord avec le commentaire de Christopher: vous semblez faire quelques hypothèses:

  • /system est à /dev/block/mtdblock3
  • /dev/block/mtdblock3 est yaffs2
  • /etc/ est un hardlink ou symlink à quelque chose /system
  • mount existe
  • dos2unix existe
  • cp existe
  • su existe

La plupart des ceux-ci devraient être testables lors de l'exécution, bien que le chèque /etc/ peut-être un peu délicat. Test de ce genre de choses sur la première manche de votre application, puis faire ce sens:

  • un « désolé, cette application ne fonctionnera pas » si vous détectez un échec
  • désactiver le menu/bouton/whatever cela conduit à tout ce qui est l'exécution de votre code
+0

Joyeux 50k rep! ;) –

+0

J'ai trouvé cette commande flottant sur Internet ... il est supposé monter le point de montage approprié et fs: grep "/ system"/proc/mounts | awk '{system ("mount -o rw, remonte -t" $ 3 "" $ 1 "" $ 2)}' Cependant, il ne semble pas fonctionner ... des suggestions? –

+0

@Frank Bozzo: FWIW, je ne vois ni 'awk' ni' grep' sur mon émulateur. Cependant, gardez à l'esprit que vous avez tout ce langage de programmation appelé "Java" à votre disposition. :-) Lisez ce fichier et analysez-le en Java pour déterminer ce dont vous avez besoin. – CommonsWare

Questions connexes