android.uid.system无法读取SD卡信息

    在安卓开发过程中,有些应用需要system权限,可以在AndroidManifest.xml添加android:sharedUserId="android.uid.system",这样就可以让程序运行到系统进程中去,可以进行相应的系统操作。

    但在AndroidManifest.xml中添加android:sharedUserId="android.uid.system"后,就无法对sd卡进行读写操作,比如在SD卡中创建一个新文件夹,是创建不成功的。如果把android:sharedUserId="android.uid.system"注释掉,就可以在SD卡进行IO操作了,但又不能达到相应的实现效果。在Settings中android:sharedUserId="android.uid.system"是不可少的,少了它很多Settings下应用直接开不了,或一开就报错。


解决方法一:

    在system/vold 模块里的 Volume.cpp文件

    在调用doMount的语句里做一下修改:
    doMount(devicePath, path, false, false, false,1000, 1015, 0702, true)
      ↓
    doMount(devicePath, path, false, true, false,1000, 1015, 0002, true)

    修改后进行编译生成可执行bin文件,经过测试,直接push这个bin文件到手机中并不能解决这个问题,需要重新编译安卓或者相应的image文件。


解决方法二:

    把SD卡操作的功能独立出去,做成一个独立的APK,然后在原项目中调用改功能。


注:网上还写有第三种解决办法,即在Android.mk中添加LOCAL_CERTIFICATE := platform。经测试,这种办法是不成功的。

    因为,LOCAL_CERTIFICATE := platform与android:sharedUserId="android.uid.system"是相对应的,必须同时出现。

    只是加入UID还不够,如果这时候安装APK的话发现无法安装,提示签名不符,原因是程序想要运行在系统进程中还要有目标系统的platform key。在"build\target\product\security"下有platform.pk8和platform.x509.pem两个文件,用这两个key签名后apk才真正可以放入系统进程中。在Android.mk中加入LOCAL_CERTIFICATE := platform其实就是用这两个key来签名。

你可能感兴趣的:(error的解决办法)