首先因为是写在仪器上的,且只会跑这个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的时候表示有权限
有没有路过的大神可以解释一下??