AOSP-应用获取root权限+System用户提示
一、应用获取root权限
-
源码路径:framework/base/core/java/com/android/internal/os/ZygoteConnection.java
-
修改思路
根据app的包名来判断,授予不同的权限等级
权限等级说明,下面0与1000代表Linux下不同用户组的权限
root权限:对应0
system权限:对应1000
注意:修改为root或system权限会导致无法使用SharedPreferences
- 源码
if (!args.gidSpecified) {
args.gid = peer.getGid();
args.gidSpecified = true;
}
- 为不同app设置不同的权限
if (!args.gidSpecified) {
args.gid = peer.getGid();
args.gidSpecified = true;
}
//zjp add
if((args.niceName!=null) && (args.niceName.contains(".test.")) ){
args.uid=1000;
args.gid=1000;
}
if((args.niceName!=null) && (args.niceName.contains(".test.app"))){
args.uid=0;
args.gid=0;
}
二、System用户提示
上面的用户组如果设置到1000
app在运行的时候会提示“W/ContextImpl: Calling a method in the system process without a qualified user: …”
下面介绍如何屏蔽该提示
- 源码路径: /frameworks/base/core/java/android/app/ContextImpl.java
- 源码
private void warnIfCallingFromSystemProcess() {
if (Process.myUid() == Process.SYSTEM_UID {
Slog.w(TAG, "Calling a method in the system process without a qualified user: "
+ Debug.getCallers(5));
}
}
- 修改
private void warnIfCallingFromSystemProcess() {
//zjp update
if (Process.myUid() == Process.SYSTEM_UID && !Debug.getCallers(5).contains("com.test.") {
Slog.w(TAG, "Calling a method in the system process without a qualified user: "
+ Debug.getCallers(5));
}
}