Android5.1系统通过包名给应用开放系统权限的方法
常用的给应用开放系统权限的方法是直接将该应用做成系统应用(即在AndroidManifest.xml文件里加上:android:sharedUserId="android.uid.system"),但是这种做法限制了应用本身的自由,也就是说经过系统签名后的系统应用只能够在对应的Android平台上安装使用,无法向其他应用一样放到Android市场里兼容所有的Android设备。
现在此介绍一种通过修改Android平台系统层代码,根据指定的应用包名给对应的应用在该平台上开放系统权限,这样既不应用应用的兼容性,又解决了应用想调用一些系统层接口而没有权限的矛盾。
该方法的核心是:在ActivityManagerService的startProcessLocked接口中把uid和gid都改为0.
需要开放系统权限的包名:
1、net.forclass.fcstudent
2、com.ckl.launcher
3、com.creative.fcstudent
修改步骤:
1、应用安装在设备上之后,点击启动必定会调用ActivityManagerService的startProcessLocked接口来开启一个新的进程,而给应用开放系统权限目的其实就是使应用能够成为超级应用,运行在系统进程中,这样我们只需要在startProcessLocked接口里面将应用的uid修改为0即可。
ActivityManagerService.java(frameworks\base\services\core\java\com\android\server\am)
finalProcessRecordstartProcessLocked(StringprocessName,ApplicationInfoinfo,
booleanknownToBeDead,intintentFlags,StringhostingType,ComponentNamehostingName,
booleanallowWhileBooting,booleanisolated,intisolatedUid,booleankeepIfLarge,
StringabiOverride,StringentryPoint,String[]entryPointArgs,RunnablecrashHandler){
//modifiedbyhamingpatchbegin,configuresystempermissionforsomespecialapplication.
if("net.forclass.fcstudent".equals(info.packageName)
||"com.ckl.launcher".equals(info.packageName)
||"com.creative.fcstudent".equals(info.packageName)
||"com.hampoo.hampoointerfacetestdemo".equals(info.packageName)){
info.uid=0;
}
//modifiedbyhamingpatchend.
longstartTime=SystemClock.elapsedRealtime();
ProcessRecordapp;
......//此处省略好多行
checkTime(startTime,"startProcess:steppingintostartProcess");
startProcessLocked(//再次调用startProcessLocked重载方法
app,hostingType,hostingNameStr,abiOverride,entryPoint,entryPointArgs);
checkTime(startTime,"startProcess:donestartingproc!");
return(app.pid!=0)?app:null;
}在重载方法startProcessLocked(ProcessRecordapp,StringhostingType,StringhostingNameStr,StringabiOverride,StringentryPoint,String[]entryPointArgs)里面将应用的gid也改为0:
privatefinalvoidstartProcessLocked(ProcessRecordapp,StringhostingType,
StringhostingNameStr,StringabiOverride,StringentryPoint,String[]entryPointArgs){
longstartTime=SystemClock.elapsedRealtime();
......//此处省略好多行
try{
intuid=app.uid;
int[]gids=null;
intmountExternal=Zygote.MOUNT_EXTERNAL_NONE;
if(!app.isolated){
......//此处省略好多行
//modifiedbyhamingpatchbegin,configuresystempermissionforsomespecialapplication.
if("net.forclass.fcstudent".equals(app.info.packageName)
||"com.ckl.launcher".equals(app.info.packageName)
||"com.creative.fcstudent".equals(app.info.packageName)
||"com.hampoo.hampoointerfacetestdemo".equals(app.info.packageName)){
SystemProperties.set("sys.permission.enable","true");//设置一个系统属性,在Zygote进行判断是否抛出异常
gids[0]=0;
gids[1]=0;
}else{
gids[0]=UserHandle.getSharedAppGid(UserHandle.getAppId(uid));
gids[1]=UserHandle.getUserGid(UserHandle.getUserId(uid));
}
//modifiedbyhamingpatchend.
}
......//此处省略好多行
}catch(RuntimeExceptione){
//XXXdobettererrorrecovery.
app.setPid(0);
mBatteryStatsService.noteProcessFinish(app.processName,app.info.uid);
if(app.isolated){
mBatteryStatsService.removeIsolatedUid(app.uid,app.info.uid);
}
Slog.e(TAG,"Failurestartingprocess"+app.processName,e);
}
}
2、ZygoteConnection.java里的applyUidSecurityPolicy(Argumentsargs,Credentialspeer,StringpeerSecurityContext)接口会对进程id进行判断,如果小于Process.SYSTEM_UID(1000)则认为是非法,而zygote是具有root权限的唯一server,所有在判断之后就可以通过读取前面设定的系统属性“sys.permission.enable”的值来决定是否抛出异常。
ZygoteConnection.java(frameworks\base\core\java\com\android\internal\os)
privatestaticvoidapplyUidSecurityPolicy(Argumentsargs,Credentialspeer,
StringpeerSecurityContext)
throwsZygoteSecurityException{
intpeerUid=peer.getUid();
if(peerUid==0){
//Rootcandowhatitwants
}elseif(peerUid==Process.SYSTEM_UID){
//SystemUIDisrestricted,exceptinfactorytestmode
StringfactoryTest=SystemProperties.get("ro.factorytest");
booleanuidRestricted;
/*Innormaloperation,SYSTEM_UIDcanonlyspecifyarestricted
*setofUIDs.Infactorytestmode,SYSTEM_UIDmayspecifyanyuid.
*/
uidRestricted
=!(factoryTest.equals("1")||factoryTest.equals("2"));
//modifiedbyhamingpatchbegin,configuresystempermissionforsomespecialapplication.
if(uidRestricted
&&args.uidSpecified&&(args.uid
总结
以上所述是小编给大家介绍的Android5.1系统通过包名给应用开放系统权限的方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言!