1

好的,我对 android 编程很陌生,我正在制作一个根应用程序,用一个按钮将特定文件推送到 /system/framework

我怎样才能做到这一点?我尝试了命令样式,但没有一个工作

4

1 回答 1

1

您需要采取许多步骤才能做到这一点。

首先(当然)设备需要植根。您可以通过多种方式进行检查。

以下代码将检查“su”命令是否返回命令未找到错误(su 二进制文件存在)以及是否安装了超级用户应用程序以在您请求权限后授予权限。

 private boolean isDeviceRooted() {

            // check for SU command in shell
            if ((new ExecShell().executeCommand(ExecShell.SHELL_COMMAND.su_check) != null) && (appInstalled("eu.chainfire.supersu.nonag") || appInstalled("eu.chainfire.supersu") || appInstalled("com.noshufou.android.su") || appInstalled("com.koushikdutta.superuser"))) {
                Log.i(TAG, "Device Rooted");
                return true;
            }

            // check for SU application installed
            if (appInstalled("eu.chainfire.supersu.nonag") || appInstalled("eu.chainfire.supersu") || appInstalled("com.noshufou.android.su") || appInstalled("com.koushikdutta.superuser")) {
                Log.i(TAG, "Device Rooted");
                return true;
            }

            Log.i(TAG, "Device Not Rooted");
            return false;
        }


        private boolean appInstalled(String uri) {
            PackageManager pm = getPackageManager();
            boolean app_installed = false;
            try {
                pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
                app_installed = true;
            } catch (PackageManager.NameNotFoundException e) {
                app_installed = false;
            }
            return app_installed;
        }

如果此代码返回 false,您可以设置标志或显示和错误,否则继续。

然后,一旦您知道设备已植根,您就需要执行必要的根命令来执行您需要的操作。

以下代码将命令的 String[] 作为输入,并以 root 身份顺序执行它们。

public boolean RunAsRoot(String[] cmds) {
    Process p;
    try {
        p = Runtime.getRuntime().exec("su");
        DataOutputStream os = new DataOutputStream(p.getOutputStream());
        try {
            for (String tmpCmd : cmds) {
                os.writeBytes(tmpCmd + "\n");
            }
            os.writeBytes("exit\n");
            os.flush();
            return true;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return false;
    }
}

在您的情况下,您首先需要将 /system 挂载为 rw。网上有很多信息可以帮助您找到所需的命令,但它看起来像 mount -o remount rw /system mount -o remount rw /system

然后,您想使用mv或移动您想要的文件cp

使用 root 命令的一个例子是

String[] cmds = {"mount -o remount rw /system mount -o remount rw /system", "cp /sdcard/myfile /system/framework/myfile"};
if(!RunAsRoot(cmds)){
    //Commands failed to run, show an error/retry
}

这涵盖了作为根功能的“硬”位。

可以在此处找到按钮的简单教程。

程序流程可以是

onCreate(){
    checkIsRooted();
    Button x = (Button) findViewById(R.id.x);
    x.setOnClickListener(onClickListener());
}

onClickListener(){
    onClick(){
        String[] cmds = {...};
        if(!runAsRoot(cmds))
            AlertDialog.Builder.makeText(...).show();
    }
}

请注意,这是伪代码,您不能复制和粘贴此代码以使其正常工作,您需要自己正确操作!

于 2013-09-26T01:38:01.047 回答