在Android系统中,通过包名给应用开放系统权限是一个涉及系统安全和稳定性的操作,通常需要对系统进行修改或使用特定的命令,以下是几种常见的方法:
1、修改ActivityManagerService代码
原理:应用安装在设备上后,启动时会调用ActivityManagerService的startProcessLocked接口来开启新进程,通过在这个接口中将指定应用的uid和gid改为0,可以使应用成为超级应用,运行在系统进程中,从而获得系统权限。
操作步骤
找到ActivityManagerService.java
文件,一般位于frameworksbaseservicescorejavacomandroidserveram
路径下。
在该文件中的startProcessLocked
方法内添加判断逻辑,根据应用的包名修改其uid和gid。
“`java
if ("net.forclass.fcstudent".equals(info.packageName) || "com.ckl.launcher".equals(info.packageName) || "com.creative.fcstudent".equals(info.packageName)) {
info.uid = 0;
}
在重载方法startProcessLocked(ProcessRecord app, String hostingType, String hostingNameStr, String abiOverride, String entryPoint, String[] entryPointArgs)
里将应用的gid也改为0。
```java
private final void startProcessLocked(ProcessRecord app, String hostingType, int uid) {
int mountExternal = Zygote.MOUNT_EXTERNAL_NONE;
if ("net.forclass.fcstudent".equals(app.info.packageName) || "com.ckl.launcher".equals(app.info.packageName) || "com.creative.fcstudent".equals(app.info.packageName)) {
SystemProperties.set("sys.permission.enable", "true");
gids[0] = 0;
gids[1] = 0;
} else {
gids[0] = UserHandle.getSharedAppGid(UserHandle.getAppId(uid));
gids[1] = UserHandle.getUserGid(UserHandle.getUserId(uid));
}
}
2、修改PackageManagerService代码
原理:在系统启动后,PackageManagerService的mDefaultPermissionPolicy
负责给app授予权限,可以在grantDefaultPermissions()
方法中添加自定义的grantPermissionsToCustomApp()
方法,根据app的userId来批量授予权限。
操作步骤
找到PackageManagerService.java
文件,一般位于frameworksbaseservicescorejavacomandroidserverpm
路径下。
在systemReady()
方法中添加读取权限列表文件的逻辑,
“`java
@Override
public void systemReady() {
enforceSystemOrRoot("Only the system can claim the system is ready");
//cczheng add for system app grant permission S
if (mFirstBoot) {
MTKPackageManagerUtil.slientGrantRuntimePermission(mContext);
}
//cczheng add for system app grant permission E
mSystemReady = true;
final ContentResolver resolver = mContext.getContentResolver();
ContentObserver co = new ContentObserver(mHandler) {
@Override
public void onChange(boolean selfChange) {
mEphemeralAppsDisabled = (Global.getInt(resolver, Global.ENABLE_EPHEMERAL_FEATURE, 1) == 0) || (Secure.getInt(resolver, Secure.INSTANT_APPS_ENABLED, 1) == 0);
};
mContext.getContentResolver().registerContentObserver(android.provider.Settings.Global.getUriFor(Global.ENABLE_EPHEMERAL_FEATURE), false, co, UserHandle.USER_SYSTEM);
mContext.getContentResolver().registerContentObserver(android.provider.Settings.Global.getUriFor(Secure.INSTANT_APPS_ENABLED), false, co, UserHandle.USER_SYSTEM);
}
}
新建一个权限列表文件,如pms_sysapp_grant_permission_list.txt
,并在其中添加需要授权的应用包名,一行一个包名。 将该文件拷贝至系统的/etc/permissions/
目录下。 在PackageManagerService
的grantDefaultPermissions()
方法中添加自定义的权限授予逻辑,遍历权限列表文件中的包名,并授予相应的权限。 3、使用adb命令(适用于特定权限)原理:adb命令可以与Android设备进行交互,通过执行特定的命令来修改应用的权限设置。操作步骤 确保Android设备已连接到电脑,并且已启用USB调试模式。 在电脑上打开命令行或终端窗口。 使用adb shell pm list packages
命令查看已安装的应用包名。 找到要授予权限的应用包名后,使用adb shell appops set <package_name> <permission> [allow|deny]
命令授予相应的权限,授予应用WRITE_SETTINGS权限:adb shell appops set <package_name> WRITE_SETTINGS allow
。 相关问题与解答 1、问题:修改系统代码给应用开放系统权限有哪些风险?解答:修改系统代码会给应用开放系统权限会带来多种风险,首先是安全风险,这可能会使设备容易受到恶意软件的攻击,因为系统权限通常用于保护系统的核心功能和用户数据的安全,其次是稳定性风险,不正确的修改可能导致系统崩溃、应用程序无法正常运行甚至设备无法启动,还可能存在兼容性问题,经过修改的系统可能无法正常接收系统更新,或者与其他应用程序产生冲突,除非有充分的必要性和专业知识,否则不建议随意修改系统代码来开放系统权限。 2、问题:使用adb命令授予应用系统权限是否持久有效?解答:使用adb命令授予应用系统权限通常是持久有效的,但这也取决于具体的设备和系统设置,在某些情况下,例如设备重启后,权限设置可能会被重置,为了确保权限的持久性,可能需要在设备启动时自动执行相应的adb命令或者将权限设置写入到设备的配置文件中,不过需要注意的是,过度使用adb命令修改权限可能会违反应用的使用条款和隐私政策,同时也可能对设备的安全性和稳定性产生影响。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1620948.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复