2012-06-07 3 views
67

Использование ADB оболочки очистить данные приложенияОчистить пользовательские данные приложений Android

adb shell pm clear com.android.browser 

Но при выполнении этой команды из приложения

String deleteCmd = "pm clear com.android.browser";  
     Runtime runtime = Runtime.getRuntime(); 
     try { 
      runtime.exec(deleteCmd); 
     } catch (IOException e) { 
      e.printStackTrace();     
     } 

Выпуск:

Это не очистка данных пользователя не дает никаких исключений, хотя я дал следующее разрешение.

<uses-permission android:name="android.permission.CLEAR_APP_USER_DATA"/> 

Вопрос:

Как очистить данные приложения, используя ADB оболочки?

+3

ли вы какое-либо решение, чтобы очистить данные для наружного применения? –

+1

Не думайте, что стороннее приложение должно иметь разрешение на очистку пользовательских данных другого приложения. Было бы беспорядок, если бы это произошло. – StoneLam

ответ

1

Afaik Данные приложения браузера НЕ доступны для других приложений, так как он хранится в private_mode. Таким образом, выполнение этой команды может привести к работе только с корневыми устройствами. В противном случае вы должны попробовать другой подход.

+0

Инструменты командной строки не предназначены для использования приложениями. Вероятно, они будут работать только для полупривилегированного пользователя adb shell, который рассматривается как несколько сопоставимый с полномочиями на пользователя, нажимая кнопки в GUI, если приложение настроек системы. –

2

Очистить данные приложения Пожалуйста, воспользуйтесь этим способом.

public void clearApplicationData() { 
    File cache = getCacheDir(); 
    File appDir = new File(cache.getParent()); 
    if (appDir.exists()) { 
     String[] children = appDir.list(); 
     for (String 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 &amp;&amp; dir.isDirectory()) { 
     String[] 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(); 
} 
+0

Я пытаюсь это сделать, используя это может очистить наши собственные данные кэша приложений, мне нужно очистить другие пользовательские данные приложения от нашего приложения – UdayaLakmal

+2

@UdayaLakmal, вы не должны очищать данные кэша другого приложения, потому что андроид предназначен для защиты приложений от потенциально вредоносных действий других приложений. –

-4

Если вы хотите сделать вручную, то Вы также можете очистить пользовательские данные, нажав “Clear Data” кнопки в Settings–>Applications–>Manage Aplications–> ВАШЕЙ ЗАЯВКИ

or Is there any other way to do that? 

Тогда Download code here

enter image description here

+0

Я хочу сделать это прагматично, этот пример, который вы предлагаете, я уже пробовал, но это не то, что я ищу – UdayaLakmal

+0

, если вы попробовали это, пожалуйста, поделитесь тем, что вы попробовали этот. ok проверяем на другой способ .. !! –

4

командного pm clear com.android.browser требует разрешения root.
Итак, сначала запустите su.

Вот пример кода:

private static final String CHARSET_NAME = "UTF-8"; 
String 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(); 
String result = stdoutReader.getResult(); 

Класс 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 StringBuffer mBuffer; 
    private String mCharset; 
    private CountDownLatch mCountDownLatch; 

    StreamReader(InputStream is, String charset) { 
     this.is = is; 
     mCharset = charset; 
     mBuffer = new StringBuffer(""); 
     mCountDownLatch = new CountDownLatch(1); 
    } 

    String getResult() { 
     try { 
      mCountDownLatch.await(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     return mBuffer.toString(); 
    } 

    @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(); 
     } 
    } 
} 
-2
// 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(); 
} 
+1

Это может (если используется с соответствующим разрешением) удалять общие файлы в Внешнем хранилище без учета ассоциации приложений. Это ** не будет ** удалять личные файлы любого приложения, о чем и шла речь. –

127

Эта команда работает для меня:

adb shell pm clear packageName 
+3

Проблема выполняется из приложения android ... – UdayaLakmal

+1

Возможно ли использовать adb для очистки кеша? –

+0

@androiddeveloper Это также очищает кеш-память –

0

Здравствуйте 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()){ 
      String[] children = appDir.list(); 
      for(String 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()) { 
      String[] 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(); 
    } 
} 

Пожалуйста, проверьте это и дайте мне знать ...

Вы можете загрузить код из here

0

ADB деинсталлировать com.package.packagename

выполнить эту команду на оболочке АБР.

ADB деинсталлировать com.package.packagename -k

-k сохраняет пользовательские данные

Смежные вопросы