Utilisation du shell adb pour effacer les données d’application
adb shell pm clear com.android.browser
Mais lors de l’exécution de cette commande depuis l’application
Ssortingng deleteCmd = "pm clear com.android.browser"; Runtime runtime = Runtime.getRuntime(); try { runtime.exec(deleteCmd); } catch (IOException e) { e.printStackTrace(); }
Problème:
Les données utilisateur ne sont pas effacées, ni aucune exception, même si j’ai donné l’autorisation suivante.
Question:
Comment effacer les données de l’application à l’aide du shell adb ?
Les données de l’application Browser ne sont PAS clivables pour d’autres applications, car elles sont private_mode
dans private_mode
. L’exécution de cette commande pourrait donc fonctionner uniquement sur des périphériques rootés. Sinon, vous devriez essayer une autre approche.
Cette commande a fonctionné pour moi:
adb shell pm clear packageName
La commande pm clear com.android.browser
nécessite une autorisation root.
Donc, lancez su
abord.
Voici l exemple de code:
private static final Ssortingng CHARSET_NAME = "UTF-8"; Ssortingng cmd = "pm clear com.android.browser"; ProcessBuilder pb = new ProcessBuilder().redirectErrorStream(true).command("su"); Process p = pb.start(); // We must handle the result stream in another Thread first StreamReader stdoutReader = new StreamReader(p.getInputStream(), CHARSET_NAME); stdoutReader.start(); out = p.getOutputStream(); out.write((cmd + "\n").getBytes(CHARSET_NAME)); out.write(("exit" + "\n").getBytes(CHARSET_NAME)); out.flush(); p.waitFor(); Ssortingng result = stdoutReader.getResult();
La classe StreamReader
:
import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.concurrent.CountDownLatch; class StreamReader extends Thread { private InputStream is; private SsortingngBuffer mBuffer; private Ssortingng mCharset; private CountDownLatch mCountDownLatch; StreamReader(InputStream is, Ssortingng charset) { this.is = is; mCharset = charset; mBuffer = new SsortingngBuffer(""); mCountDownLatch = new CountDownLatch(1); } Ssortingng getResult() { try { mCountDownLatch.await(); } catch (InterruptedException e) { e.printStackTrace(); } return mBuffer.toSsortingng(); } @Override public void run() { InputStreamReader isr = null; try { isr = new InputStreamReader(is, mCharset); int c = -1; while ((c = isr.read()) != -1) { mBuffer.append((char) c); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (isr != null) isr.close(); } catch (IOException e) { e.printStackTrace(); } mCountDownLatch.countDown(); } } }
Pour effacer les données d’application, essayez de cette façon.
public void clearApplicationData() { File cache = getCacheDir(); File appDir = new File(cache.getParent()); if (appDir.exists()) { Ssortingng[] children = appDir.list(); for (Ssortingng s : children) { if (!s.equals("lib")) { deleteDir(new File(appDir, s));Log.i("TAG", "**************** File /data/data/APP_PACKAGE/" + s + " DELETED *******************"); } } } } public static boolean deleteDir(File dir) { if (dir != null && dir.isDirectory()) { Ssortingng[] children = dir.list(); for (int i = 0; i < children.length; i++) { boolean success = deleteDir(new File(dir, children[i])); if (!success) { return false; } } } return dir.delete(); }
Bonjour UdayaLakmal,
public class MyApplication extends Application { private static MyApplication instance; @Override public void onCreate() { super.onCreate(); instance = this; } public static MyApplication getInstance(){ return instance; } public void clearApplicationData() { File cache = getCacheDir(); File appDir = new File(cache.getParent()); if(appDir.exists()){ Ssortingng[] children = appDir.list(); for(Ssortingng s : children){ if(!s.equals("lib")){ deleteDir(new File(appDir, s)); Log.i("TAG", "File /data/data/APP_PACKAGE/" + s +" DELETED"); } } } } public static boolean deleteDir(File dir) { if (dir != null && dir.isDirectory()) { Ssortingng[] children = dir.list(); for (int i = 0; i < children.length; i++) { boolean success = deleteDir(new File(dir, children[i])); if (!success) { return false; } } } return dir.delete(); } }
S'il vous plaît vérifier ceci et faites le moi savoir ...
Vous pouvez télécharger le code à partir d' ici
adb désinstaller com.package.packagename
exécuter cette commande sur le shell ADB.
adb désinstaller com.package.packagename -k
-k conservera les données utilisateur
// To delete all the folders and files within folders recursively File sdDir = new File(sdPath); if(sdDir.exists()) deleteRecursive(sdDir); // Delete any folder on a device if exists void deleteRecursive(File fileOrDirectory) { if (fileOrDirectory.isDirectory()) for (File child : fileOrDirectory.listFiles()) deleteRecursive(child); fileOrDirectory.delete(); }
Si vous voulez le faire manuellement, vous pouvez également effacer vos données utilisateur en cliquant sur le bouton “Clear Data”
dans Settings–>Applications–>Manage Aplications–>
VOTRE APPLICATION.
or Is there any other way to do that?
Alors téléchargez le code ici