Android如何修改系统文件访问权限

原创 2012年03月24日 14:38:02

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



修改权限的大致思路就,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,仅攻参考。


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

android 读写sd卡的权限设置

在Android中,要模拟SD卡,要首先使用adb的mksdcard命令来建立SD卡的镜像,如何建立,大家上网查一下吧,应该很容易找到,这里不说这个问题.     但是在应用程序执行起来以后,我...

在Android java代码中如何改变文件的权限

在LINUX下每个文件都有一个权限的属性 ,那么在Android中怎么用java改变某个文件的权限呢?Android中有两种方法可以改变文件的权限1. 用openFileOutput方法:FileOu...

Android 通过java代码实现修改指定路径文件的读写权限。

方法一; Runtime runtime = Runtime.getRuntime(); runtime.exec("chmod 777 "+""); 注意命令chmod 777 后面要...

Android 文件系统及权限修改

1、android文件系统

Android应用获取root权限,修改系统文件

Android系统权限说明 首先对Android权限等级进行一下说明,简单的分为一般用户、系统用户和超级用户。 一般的用户权限在Manifest.xml文件中使用标签进行申请,比如sd卡读写权...

Android-txt阅读器-利用RandomAccessFile按页读取(utf-8)

这里只是我用java做的小尝试里面存在很多bug还没有处理完;真正的解码的话建议大家使用FBreader,这是一个开源项目,非常的屌。 切入正题,下面是我处理的时候的一些思路。 为进行...

NDK/Jni底层获取root权限的四种思路

很多时候对Android系统底层进行操作(如查看/data/data/下的数据)是没有权限的,但是有时候我们需要在Jni层进行类似的操作,那么我们如何获取root权限呢?这边提供四种思路供大家参考。

NDK编程实践之调用系统命令实现权限临时提升

实验环境: Windows

init.rc解析与chmod 改变文件属性没用

android的init.rc语法是独有的,可以说是一种语言吧。        init.rc的语法分为行为(Actions),、命令(Commands) 、服务(Services)、选项(Opti...

android如何在init.rc中添加/dev/字符设备节点创建权限

android如何在init.rc中添加/dev/字符设备节点创建权限 system/core/init/init.c system/core/init/keywords.h:77...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)