android中执行shell脚本或者需要root权限代码的方法

/*****************************************************************

*version:android4.2

*author:冷雨

*嵌入式开发群:122879839

*****************************************************************/

android开发中测试team传过来一个很奇葩的问题。如果我们在apk中去调用一些编译好的c可执行代码,会遇到一些权限问题,但是当我们利用adb或者串口在shell中直接去执行那些c代码却可以获得正确的执行结果。

这其实是android中的权限问题,我们apk代码是不容易去执行一些root权限的程序的。但是,在实际开发中我们确实是希望我们的apk可以获得这种执行权利,如果遇到这种需求怎么办呢?

幸好我拥有我们设备的bsp环境,利用bsp环境我们可以去完成这种需求。

1.可以执行root权限的代码有哪些方式呢?很显然是利用init程序,那里启动了整个系统几乎所有代码,当然可以去执行一些简单的root代码,我们可以简单的写个service去执行那些程序。

2.如何让init去执行这些代码呢?其实就是在我们需要执行的时候让他们去执行,在不需要的时候就不去启动。答案是利用android的属性系统。

3.利用service启动的代码如何与我们的apk进行交互呢?利用socket或者其他进程间通信方法,或者service启动的代码简单的把结果写到一个文件中,让我们的apk再去读那些文件。

搞定那三点我们现在就可以去完成这个任务了。

一.

首先,我们需要在system/core/rootdir/init.rc文件中添加一个service.

service test /xxx/test
    class core
    oneshot
    disabled
解释一下,

service:关键字。

test:service的名字。

/xxx/test:当该service启动的时候执行的可执行程序路径及名称。

class core:service的类型,除此之外还有class main。

oneshot:属性标志,代表该service一旦死掉就不再重启。

disabled:属性标志,代表在默认启动的时候,不去启动该service。

二.

编写test应用程序,并将该应用程序放置于对应的目录 。

核心代码如下:

        FILE *fp = NULL;
        char buf[1024], str[1024];
        //char *str;
        str[0] = '\0';
        memset(buf, 0, sizeof(buf));
        if (NULL == (fp = popen("/xxx/command", "r"))){
                ALOGD("service test: execute the command %s\n", strerror(errno));
                return -1;
        }

        ALOGD("service test: after open\n");
        while (NULL !=fgets(buf, sizeof(buf), fp)){
                //ALOGD("shellcommand: the result is %s\n", buf);
                strcat(str, buf);
        }


        ALOGD("service test:read the data is %s\n", str);
        fclose(fp);

在这段代码中我们利用android的log系统将我们看到的信息输出来,这样利用logcat就可以查看了。

三.

apk文件的代码操作。

引入对应的包:import android.os.SystemProperties;

在需要调用对应root权限的地方使用如下方式启动代码。

SystemProperties.set("ctl.start", "test");

由于我们使用的sdk中并不包含该类和方法,所以在使用IDE工具的时候可能或提示出错,不用理会。

修改AndroidManifest.xml文件,在其manifest节点中添加android:sharedUserId="android.uid.system"。我的如下。


四.

在bsp环境下编译对应代码。


这样我们就可以使用apk去启动需要root权限执行的程序代码了。


你可能感兴趣的:(android系统开发)