Android 修改系统文件 访问权限

来源:互联网 发布:ubuntu高级选项怎么用 编辑:程序博客网 时间:2024/05/16 01:02

我这里编译都是在Android源码包下,文章比较针对系统开发人员。以proc/cmdline为例,连接手机敲入命令可以看到默认情况下普通用户没有proc/cmdline的任何操作权限,如下所示:


root@android:/ # cat /proc/cmdline                                             
console=ttymxc0,115200 androidboot.console=ttymxc0 vmalloc=400M init=/init video=mxcfb0:dev=ldb,LDB-1k,if=RGB666,bpp=32 video=mxcfb1:off video=mxcfb2:off video=mxcfb3:off fbmem=28M androidboot.hardware=freescale
root@android:/ # ll /proc/cmdline                                              
-r--r----- root     radio           0 2014-04-25 05:29 cmdline
root@android:/ #




修改权限的大致思路就,

1、用c语言编写编译出一个脚本,我们运行该脚本来修改文件访问权限。

2、在init.rc里需要配置一个service,并为service指定要执行的脚本。这样我们就可以通过启动service运行其指定的脚本。(不自动开机执行服务,交给上层去控制)

3、通过jni来启动服务,主要接口就是 property_set("ctl.start",serviceName);


下面逐步介绍如何修改系统文件访问权限:

1、新建文件夹chgperexe并在文件夹下新建两个文件Android.mk及openper.c

Android.mk内容如下:

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SHARED_LIBRARIES := libcutils liblog
LOCAL_MODULE := openfileper
LOCAL_SRC_FILES := openper.c
LOCAL_PRELINK_MODULE := false
include $(BUILD_EXECUTABLE)

openper.c内容如下:

#include <stdio.h>
#include <stdlib.h>
int main()
{
system("chmod 444 /proc/cmdline");
        return 0;
}

chmod 444 /proc/cmdline”命令就是将/proc/cmdline的访问权限修改为 "-r--r--r--",不建议使用命令"chmod o+r /proc/cmdline",因为我用该命令修改权限失败。

在Android源码下编译chgperexe,编译成功后会在system/bin目录下生成名为openfileper的脚本(一个可执行文件)。

2、配置init.rc。

在init.rc中加入以下内容,我声明了一个名为perservice的服务,并指定服务启动后执行/system/bin/openper脚本。

service  perservice  /system/bin/openfileper

oneshot

disabled


备注:oneshot:在服务退出后不重启。

  disabled:这个服务的级别将不会自动启动,它必须被依照服务名指定启动才可以启 动。如果需要service自动启动就不需要配置这一项了,那么第三步就不用看了。


3、ok,现在我们来看如何启动服务。我是通过jni来启动服务,新建文件夹chgperjni,在文件夹下新建文件chgperjni.c,Android.mk及文件夹inc。inc中需要一个properties.h文件,它是一个系统文件,可以在system/core/include/cutils下找到,直接拷贝过来就行了

chgperjni.c的内容如下:

#include <string.h>
#include <jni.h>

#include "properties.h"
#include "utils.h"

jint Java_mobile_chgper_ChgperActivity_startPerService(JNIEnv* env,jobject thiz){
return (jint)property_set("ctl.start","openper");
}


jint Java_mobile_chgper_ChgperActivity_stopPerService(JNIEnv* env,jobject thiz){
return (jint)property_set("ctl.stop","openper");
}

Android.mk的内容如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE_TAGS :=optional
LOCAL_C_INCLUDES := $(LOCAL_PATH)/inc 

LOCAL_SHARED_LIBRARIES :=libcutils

LOCAL_MODULE    := chgperjni
LOCAL_SRC_FILES := chgperjni.c
LOCAL_PRELINK_MODULE := false
include $(BUILD_SHARED_LIBRARY)

编译chgperjni在system/libs下生成so文件。

4、新建一个工程Chgper。工程也要放到源码下编译同时工程必须具有System权限。如何使工程具有System权限可以参考http://my.unix-center.net/~Simon_fu/?p=531这篇文字,写的很好。


工程编译完后安装apk,打开应用后proc/cmdline的访问权限就改变了,如下图。




chgperexe,chgperjni,工程Chgper都已打包上传至http://download.csdn.net/detail/goleftgoright/4169056



0 0