Android 根应用程序不工作:无法从终端或 Java 中删除文件

Posted

技术标签:

【中文标题】Android 根应用程序不工作:无法从终端或 Java 中删除文件【英文标题】:Android root app not working: Can't remove file from terminal or Java 【发布时间】:2012-10-26 01:23:42 【问题描述】:

我正在为clearing browser localstore 开发一个简单的根应用程序,也许稍后会添加其他内置应用程序无法实现的功能。我正在使用roottools,root 似乎正在工作,但它不会正确删除目录:

public class MainActivity extends Activity 

    @Override
    public void onCreate(Bundle savedInstanceState) 
        RootTools.debugMode = true;

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.buttonClearBrowser).setOnClickListener(new OnClickListener() 
            @Override
            public void onClick(View arg0) 
                if (RootTools.isAccessGiven()) 
                    RootTools.remount("/data/data/com.android.browser/app_databases/", "RW");
                    Command command = new Command(0,"rm -rf /data/data/com.android.browser/app_databases/") 
                        @Override
                        public void output(int arg0, String arg1) 
                            System.out.println(arg1);
                        
                    ;
                    try 
                        RootTools.getShell(true).add(command).waitForFinish();
                     catch (InterruptedException e) 
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                     catch (IOException e) 
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                     catch (TimeoutException e) 
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    
                
            
        );
    

    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    

这应该会清除 Android 中的 html5 本地存储(您无法从浏览器应用程序中清除)。但是它只给出错误信息:

11-05 21:40:06.650: D/RootTools v2.4(22778): Remounting /data as rw
11-05 21:40:06.650: I/RootTools v2.4(22778): [nodev, relatime, nosuid, rw] AND rw
11-05 21:40:06.650: D/RootTools v2.4(22778): [nodev, relatime, nosuid, rw]
11-05 21:40:06.650: D/RootTools v2.4(22778): Using Existing Root Shell!
11-05 21:40:06.650: D/RootTools v2.4(22778): Sending command(s): rm -rf /data/data/com.android.browser/app_databases/
11-05 21:40:06.660: I/System.out(22778): rm failed for -rf, Read-only file system
11-05 21:40:06.660: D/RootTools v2.4(22778): Command 0finished.

顺便说一句,我在 adb shell 上遇到了同样的错误:

$ su
su
# rm -rf /data/data/com.android.browser/app_databases/http_m.bing.com_0
rm -rf /data/data/com.android.browser/app_databases/http_m.bing.com_0
rm failed for -rf, Read-only file system

/data 不应该是只读的,因为那是应用程序设置所在的位置。电话有问题吗?如果重要的话,这是 Android 2.2.2。具有讽刺意味的是,我可以在 root 模式下使用 Ghost Commander 浏览和删除文件。

【问题讨论】:

如果您有 root AFAIK,则无需重新挂载。 /data/data 未安装 RO。 【参考方案1】:

我相信-f 选项在android 中不被rmcommand 接受。

要确认它,请从命令行尝试不带-f 的相同命令:

rm -r /data/data/com.android.browser/app_databases/http_m.bing.com_0

问候。

【讨论】:

不错!为了将来参考,是否有完整的列表列出哪些选项可以或不能在 Android 上使用,或专门针对 Android 的手册页? 我不知道。经过几次惊喜之后,我习惯于对有效的命令选项进行一些尝试和错误:-( 哈,所以它试图删除根目录下的f 文件或其他什么,因此出现“只读”消息?内置的toolbox 二进制文件确实无法识别-f,但我认为busybox 可以(虽然不是100% 肯定)。【参考方案2】:

如上所述,您不需要重新挂载/data,它已经挂载了rw。一般在挂载/重挂载的时候需要给挂载点的路径作为参数:/system/data//mnt/sdcard等。给出完整路径/data/data/com.foobar.app/files/foobaz.txt传递给@时会报错987654327@ 命令。

当然还有一个问题,为什么/data 似乎是ro。在运行这段代码之前你做了什么特别的事情吗?

【讨论】:

注释该行给出相同的结果。 重启后试了rm命令,还是报错。 你确定你真的有root吗?这是什么手机?

以上是关于Android 根应用程序不工作:无法从终端或 Java 中删除文件的主要内容,如果未能解决你的问题,请参考以下文章

android中无法绕过的根检测方法

从图库中裁剪的 android-image 无法正常工作

[LGOJ1273]有线电视网

从终端运行时出现运行时错误,但不是从 Eclipse

错误记录在 Android Studio 的 Terminal 终端执行 gradlew 报错 ( 无法将“gradlew”项识别为 cmdlet函数脚本文件或可运行程序的名称。请检查名称 )

错误记录在 Android Studio 的 Terminal 终端执行 gradlew 报错 ( 无法将“gradlew”项识别为 cmdlet函数脚本文件或可运行程序的名称。请检查名称 )