在调试某应用的时候,经常要清除apk初始化产生的数据,初始化会在/data/data/com.xxx.xx目录下和/sdcard/下新建很多文件,每次都要点到 设置->应用->软件名->清除数据。闲操作麻烦,想使用自动化一键清除。
0x1 穷举遍历删除文件夹
开始想到的是获取su权限后枚举/data/data/com.xx.xx目录下的文件夹,逐个删除文件夹
1 public static boolean removeAppData( String packageName ) 2 { 3 File file = new File( "/data/data/" + packageName ); 4 System.out.println( "包名为:" + packageName ); 5 if ( file.exists( ) ) 6 { 7 DataOutputStream os = null; 8 DataInputStream is = null; 9 DataInputStream es = null; 10 BufferedReader buf = null; 11 Process p = null; 12 try 13 { 14 p = Runtime.getRuntime( ).exec( "su" );// 获得root权限 15 os = new DataOutputStream( p.getOutputStream( ) ); 16 // is = new DataInputStream( p.getInputStream( ) ); 17 buf = new BufferedReader( new InputStreamReader( p.getInputStream( ) ) ); 18 es = new DataInputStream( p.getErrorStream( ) ); 19 os.writeBytes( "ls /data/data/" + packageName + "/ \n" ); 20 os.flush( ); 21 List< String > list = new ArrayList< String >( ); 22 list.add( "cache" ); 23 list.add( "databases" ); 24 list.add( "files" ); 25 list.add( "shared_prefs" ); 26 for ( int i = 0; i < list.size( ); i++ ) 27 { 28 os.writeBytes( "rm -f -r /data/data/" + packageName + "/" + ( String ) list.get( i ) + " \n" );// 删除文件和文件夹 29 System.out.println( "遍历 " + ( String ) list.get( i ) ); 30 os.flush( ); 31 } 32 os.flush( ); 33 os.writeBytes( "exit\n" ); 34 os.flush( ); 35 os.close( ); 36 p.destroy( ); 37 } 38 catch ( IOException e ) 39 { 40 try 41 { 42 os.close( ); 43 is.close( ); 44 } 45 catch ( IOException e1 ) 46 { 47 e1.printStackTrace( ); 48 } 49 p.destroy( ); 50 } 51 return true; 52 } 53 else 54 { 55 return false; 56 } 57 }
效果还行,使用穷举遍历文件夹名进行删除,虽说效率低下 起码想要的功能实现了
0x2 使用pm 命令删除
无意在google看到某文章(研究删除数据到底会删除那些文件/夹)所使用的pm clear命令,尝试修改之后发现瞬间高大上!!!
1 try 2 { 3 p = Runtime.getRuntime( ).exec( "su" ); 4 os = new DataOutputStream( p.getOutputStream( ) ); 5 is = new DataInputStream( p.getInputStream( ) ); 6 os.writeBytes( "pm clear " + packageName + " \n" ); 7 os.flush( ); 8 os.writeBytes( "echo test \n" );// 回显test 并获得test,确保上面的代码已经执行 9 os.flush( ); 10 String result = is.readLine( ); 11 os.writeBytes( "exit\n" ); 12 os.flush( ); 13 os.close( ); 14 p.destroy( ); 15 } 16 catch ( IOException e ) 17 { 18 e.printStackTrace( ); 19 }
时间: 2024-10-18 05:40:16