通过修改源码 实现system组和root用户 访问sd卡

首先因为是写在仪器上的,且只会跑这个APP(修改底层实现),就是说不会进入其他的页面,只会跑这个APP相关的代码

为此需要添加修改系统时间的功能和相关的权限

做法是在AndroidMenifest.xml中添加android:sharedUserId="android.uid.system" ,将APP设置为系统级的APP。

具体做法可参考http://blog.csdn.net/fl1623863129/article/details/72843188  ps.找不到原来参考的博客了,但是原理和这个一样

同博客里一样。楼主不会编译mk,所以通过签名实现的


与此同时,客户要求保存的实验结果等数据库需要10w+,所以默认的数据库放在/data/data/包名/databases是不可行的。

为此将数据库移到了SD卡里面。网上搜到有两种方法:一种是写一个Context类,另一种是直接在传name的时候传路径

public class XXXXDataSqlite extends SQLiteOpenHelper {
	public final static int version = 1;
	public final static String DB_NAME = "ResultData";
	public final static String DB_PATH_NAME = Environment.getExternalStorageDirectory().getPath()+"/com.reallife.main/databases/"+DB_NAME+".db";
	public ResultDataSqlite(Context context) {
		super(context, DB_PATH_NAME, null, version);
	}
}


楼主用的第二种方法。但是注意要在mainactivity里面加上创建文件夹的代码,防止sqliteopenhelper不会自己创建


然后问题就来了,因为数据库移动到了SD卡中,然后又配置了sharedUserId,结果跑的时候APP直接崩溃了。

查了下log发现是无法读取数据库的文件导致的,这是为什么呢?

各种网上找资料说因为system和root没有操作sd卡的权限。

在ddms里面可以看到每个文件后面都有类似d---rwxr-x这样的权限。这个权限是文件系统的权限

修改(4.0.3)/system/core/vold/Volume.cpp*****(4.4.4)/system/vold/Volume.cpp文件

Fat::doMount(devicePath, "/mnt/secure/staging", false, false, false, 1000, 1015, 0702, true))   
修改为

Fat::doMount(devicePath, "/mnt/secure/staging", false, false, false, 1000, 1015, 0002, true))  

参数含义:
1000代表的是uid,即sytem
1015代表的是gid,
0002:是对权限的掩码
0002:表示 system: rwx-rwxr-x,此时system有读写执行权限
如果system不需要写权限可以将0002改为
0202: 表示 r-xrwxr-x。
默认的0702代表 ---rwxr-x

具体请参考:http://blog.csdn.net/weidawei0609/article/details/7225371

但是文中说“然后将vold重新编译一下,用adb push 命令push到 /system/bin/目录下。重新启动一下机器就OK了。

我这样试了之后APP不能正常启动了。

所以没办法只能把编译好的system和ramdisk扔进去

然后重启,OK了。。。。。。解决。。。


在push过程中遇到read-only file system问题时,先执行adb remount,然后在push

具体参考。。。额。。。自己百度吧。。。


附.

关于ddms查看文件后面的drwxrwxrwx的意义:

第一位:d 表示文件夹  - 表示文件

后面的9位可以分为三组,r 表示可读  w 表示可写  x 表示可执行(就相当于exe那种可执行文件一样)

前面那三个 rwx代表的是所有者(user)

中间那三个 rwx代表的是组群(group)

后面那三个 rwx代表的是其他用户(other)


其次,在Linux中说是权限是由数字来表示的,读取的权限等于4,用r表示;写入的权限等于2,用w表示;执行的权限等于1,用x表示;

但是问题来了,我按照这样的逻辑去写就和上面的domount里面的逻辑不一样了,是刚好反过来了,也就是说全都为0的时候表示有权限

有没有路过的大神可以解释一下??


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值