【framework】framework中为systemserver添加权限

在移植Android 6.0时发现framework服务在读写SDCard时需要权限。问题源于system_server进程缺少AID_SDCARD_RW(1015组)权限。解决方案是修改ZygoteInit.java,启动system_server时添加--setgroups参数以包含1015用户组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      之前以为在framework中不需要申请权限就可以直接使用,直到最近移植android6.0时,发现原来4.4上的代码移植到6.0上后无法正常使用,排查原因发现是在读写sdcard时因为没有读写权限导致出错,这才直到原来framework中的服务也是需要配置权限相关的东西的,只是方法和app中配置的方法不一样。如下记录该问题解决的方法:

1、测试代码

我在system server中自定义的服务中加入一段读写外置存储的测试代码,代码实现的功能非常简单,主要用三个方法构成,一个用于检测外置存储设备的挂载状态,一个用于读取显示外置存储中的文件列表,第三个方法用于向外置存储设备中创建一个测试文件,创建前如果存在就先删除。

	private final static String[] sStorageArray = { "/mnt/extsd",
		"/mnt/extsd2", "/mnt/usbhost/Storage01", "/mnt/usbhost/Storage02",
		"/mnt/usbhost/Storage03" };
	
	@RequiresPermission(anyOf = {"android.permission.READ_EXTERNAL_STORAGE", "android.permission.WRITE_EXTERNAL_STORAGE"})
	private static void checkStorageState() {
		String state = Environment.getExtsdStorageState();
		Log.d(TAG, "getExtsdStorageState=" + state);
		state = Environment.getExtsd2StorageState();
		Log.d(TAG, "getExtsd2StorageState=" + state);
		state = Environment.getUsbStorageState();
		Log.d(TAG, "getUsbStorageState=" + state);
		state = Environment.getExtsd2StorageState();
		Log.d(TAG, "getExtsd2StorageState=" + state);
	}

	@RequiresPermission(anyOf = {"android.permission.READ_EXTERNAL_STORAGE", "android.permission.WRITE_EXTERNAL_STORAGE"})
	private static void listFile(final String home) {
		Log.d(TAG, "Home ="+home);
		File f = new File(home);
		if (null != f && f.exists()) {
			Log.d(TAG, "Home " + home + "  is avaiable!");
			File list[] = f.listFiles();
			if (null != list && 0 < list.length) {
				Log.d(TAG, "File list is not empty.");
				for (File tf : list) {
					if (null != tf) {
						Log.d(TAG, "File name=" + tf.getName());
					}
				}
			}
			else {
				Log.e(TAG, "File list is empty.");
			}
		} else {
			Log.e(TAG, "Home " + home + " is not avaiable.");
		}
	}
	
	@RequiresPermission(anyOf = {"android.permission.READ_EXTERNAL_STORAGE", "android.permission.WRITE_EXTERNAL_STORAGE"})
	private static void writeFile(final String home) {
		Log.d(TAG, "Home ="+home);
		File f = new File(home);
		if (null != f && f.exists()) {
			Log.d(TAG, "Home " + home + "  is avaiable!");
			final String fname = new StringBuilder().append(home).append(File.separatorChar).append("test.file").toString();
			File tf = new File(fname);			
			try {
				tf.deleteOnExit();
				tf.createNewFile();
				Log.d(TAG, "Create "+fname+" succ
### Android Framework SystemServer 源码解析与架构分析 #### 1. Zygote 进程启动过程 Zygote 是 Android 系统中的第一个 Java 进程,负责孵化其他应用程序进程。`RuntimeInit.applicationInit()` 方法通过反射机制找到并执行目标类的 `main()` 函数,在此过程中会初始化一些必要的环境变量和配置项[^3]。 ```java protected static Runnable applicationInit(int targetSdkVersion, String[] argv, ClassLoader classLoader) { ... return findStaticMain(args.startClass, args.startArgs, classLoader); } ``` 当参数指定为 "com.android.server.SystemServer" 类时,则表示即将启动的是 SystemServer 进程。 #### 2. SystemServer 的创建流程 SystemServer 被视为整个系统的守护者和服务提供者,它运行在一个独立进程中,并承担着启动核心服务的任务。具体来说: - **加载阶段**:读取系统属性文件;设置线程优先级;注册异常处理器。 - **启动阶段**:依次调用各个组件的服务管理器 (Service Manager),如 ActivityManagerService、PackageManagerService 等来完成初始化工作。 - **等待状态**:一旦所有必需的服务都被成功激活之后,进入无限循环监听来自客户端的消息请求直至设备关闭为止。 #### 3. 关键模块介绍 为了更好地理解 SystemServer 所扮演的角色及其内部运作方式,下面列举几个重要的组成部分: ##### a. Service Manager 作为连接不同服务之间的桥梁,Service Manager 提供了一套标准接口用于发布、查找以及绑定远程对象实例。这使得跨进程通信变得简单而高效。 ##### b. Power Manager & Battery Stats 这两个子系统共同协作以优化电量消耗情况,前者主要关注屏幕亮灭控制逻辑,后者则专注于统计电池使用状况并向用户提供反馈建议。 ##### c. Connectivity Services 涵盖了 Wi-Fi、蓝牙、移动数据等多个方面,确保网络连接稳定可靠的同时也支持多模式切换操作。 ##### d. Content Providers 允许应用程序之间共享数据库记录或其他形式的数据集,从而促进了信息交换的安全性和便捷性。 #### 4. 总结 综上所述,SystemServer 不仅是 Android 平台不可或缺的一部分,而且在整个生态系统内占据着举足轻重的地位。通过对上述知识点的学习可以加深开发者对于底层工作机制的认识程度,进而有助于构建更加健壮的应用程序[^4]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值