Android Setup Wizard setComponentEnabledSetting 调用过程



Author:Kevin Xu

Email:13570805860@163.com

QQ&Wechat:1922656999

Date:2016年11月28日



1.Setup Wizard 调用方法
  1. PackageManager pm = mActivity.getPackageManager();
  2. pm.setComponentEnabledSetting(name,PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP);
  3. //Kevin Note:此处主要以COMPONENT_ENABLED_STATE_DISABLED 来分析
2.setComponentEnabledSetting 的由来
  1. @File:
  2. MM/frameworks/base/core/java/android/content/pm/PackageManager.java
  3. publicabstractvoid setComponentEnabledSetting(ComponentName componentName,
  4. int newState,int flags);
  1. @file:
  2. MM/frameworks/base/core/java/android/app/ApplicationPackageManager.java
  3. finalclassApplicationPackageManagerextendsPackageManager{
  4. @Override
  5. publicvoid setComponentEnabledSetting(ComponentName componentName,
  6. int newState,int flags){
  7. try{
  8. mPM.setComponentEnabledSetting(componentName, newState, flags, mContext.getUserId());
  9. }catch(RemoteException e){
  10. // Should never happen!
  11. }
  12. }
4.mPM 的本体
  1. @file:
  2. MM/frameworks/base/core/java/android/app/ApplicationPackageManager.java
  3. ApplicationPackageManager(ContextImpl context,
  4. IPackageManager pm){
  5. mContext = context;
  6. mPM = pm;
  7. }
  8. @file:
  9. MM/frameworks/base/core/java/android/app/ContextImpl.java
  10. @Override
  11. publicPackageManager getPackageManager(){
  12. if(mPackageManager !=null){
  13. return mPackageManager;
  14. }
  15. IPackageManager pm =ActivityThread.getPackageManager();
  16. if(pm !=null){
  17. // Doesn't matter if we make more than one instance.
  18. return(mPackageManager =newApplicationPackageManager(this, pm));
  19. }
  20. returnnull;
  21. }
  22. @file:
  23. MM/frameworks/base/core/java/android/app/ActivityThread.java
  24. publicstaticIPackageManager getPackageManager(){
  25. if(sPackageManager !=null){
  26. //Slog.v("PackageManager", "returning cur default = " + sPackageManager);
  27. return sPackageManager;
  28. }
  29. IBinder b =ServiceManager.getService("package");
  30. //Slog.v("PackageManager", "default service binder = " + b);
  31. sPackageManager =IPackageManager.Stub.asInterface(b);
  32. //Slog.v("PackageManager", "default service = " + sPackageManager);
  33. return sPackageManager;
  34. }
如上代码可以看出mPM 是PackageManagerService
5.PackageManagerService 的setComponentEnabledSetting
  1. @file:
  2. MM/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
  3. @Override
  4. publicvoid setComponentEnabledSetting(ComponentName componentName,
  5. int newState,int flags,int userId){
  6. if(!sUserManager.exists(userId))return;
  7. setEnabledSetting(componentName.getPackageName(),
  8. componentName.getClassName(), newState, flags, userId,null);
  9. }
  10. privatevoid setEnabledSetting(finalString packageName,String className,int newState,
  11. finalint flags,int userId,String callingPackage){
  12. ...
  13. PackageSetting pkgSetting;
  14. pkgSetting = mSettings.mPackages.get(packageName);
  15. case COMPONENT_ENABLED_STATE_DISABLED:
  16. if(!pkgSetting.disableComponentLPw(className, userId)){
  17. return;
  18. }
  19. break;
  20. scheduleWritePackageRestrictionsLocked(userId);
6. pkgSetting.disableComponentLPw
  1. @File:
  2. MM/frameworks/base/services/core/java/com/android/server/pm/PackageSetting.java
  3. finalclassPackageSettingextendsPackageSettingBase{
  4. @File:
  5. MM/frameworks/base/services/core/java/com/android/server/pm/PackageSettingBase.java
  6. boolean disableComponentLPw(String componentClassName,int userId){
  7. PackageUserState state = modifyUserStateComponents(userId,true,false);
  8. boolean changed = state.enabledComponents !=null
  9. ? state.enabledComponents.remove(componentClassName):false;
  10. changed |= state.disabledComponents.add(componentClassName);
  11. return changed;
  12. }
  13. MM/frameworks/base/core/java/android/content/pm/PackageUserState.java
  14. publicArraySet<String> disabledComponents;
7.scheduleWritePackageRestrictionsLocked(userId);
  1. @File:
  2. MM/frameworks/base/services/core/java/com/android/server/pm/PackageSettingBase.java
  3. scheduleWritePackageRestrictionsLocked(userId);
  4. void scheduleWritePackageRestrictionsLocked(int userId){
  5. if(!sUserManager.exists(userId))return;
  6. mDirtyUsers.add(userId);
  7. if(!mHandler.hasMessages(WRITE_PACKAGE_RESTRICTIONS)){
  8. mHandler.sendEmptyMessageDelayed(WRITE_PACKAGE_RESTRICTIONS, WRITE_SETTINGS_DELAY);
  9. }
  10. }
  11. case WRITE_PACKAGE_RESTRICTIONS:{
  12. Process.setThreadPriority(Process.THREAD_PRIORITY_DEFAULT);
  13. synchronized(mPackages){
  14. removeMessages(WRITE_PACKAGE_RESTRICTIONS);
  15. for(int userId : mDirtyUsers){
  16. mSettings.writePackageRestrictionsLPr(userId);
  17. }
  18. mDirtyUsers.clear();
  19. }
  20. Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
  21. }break;

8.Settings.writePackageRestrictionsLPr
  1. @file:
  2. MM/frameworks/base/core/java/com/android/server/pm/Settings.java
  3. void writePackageRestrictionsLPr(int userId){
  4. File userPackagesStateFile = getUserPackagesStateFile(userId);
  5. privateFile getUserPackagesStateFile(int userId){
  6. // TODO: Implement a cleaner solution when adding tests.
  7. // This instead of Environment.getUserSystemDirectory(userId) to support testing.
  8. File userDir =newFile(newFile(mSystemDir,"users"),Integer.toString(userId));
  9. returnnewFile(userDir,"package-restrictions.xml");
  10. //kevin Note:文件路径为/data/system/users/0/package-restrictions.xml
  11. }
经过如上的调用,将对应的数据写入/data/system/users/0/package-restrictions.xml
但是此处会有一个延时,
static final int WRITE_SETTINGS_DELAY = 10*1000; // 10 seconds
如果在未写入时,就关机,会产生下次开机还进行设置向导的问题。
解决办法:
在数据设置成功,直接写数据文件。
在如下的位置进行增加:
case COMPONENT_ENABLED_STATE_DISABLED: if (!pkgSetting.disableComponentLPw(className, userId)) { return; }else{
mSettings.writePackageRestrictionsLPr(userId);
}
break;





Author:Kevin Xu

Email:13570805860@163.com

QQ&Wechat:1922656999

Date20161128



1.Setup Wizard 调用方法
  1. PackageManager pm = mActivity.getPackageManager();
  2. pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
  3. //Kevin Note:此处主要以COMPONENT_ENABLED_STATE_DISABLED 来分析
2.setComponentEnabledSetting 的由来
  1. @File:
  2. MM/frameworks/base/core/java/android/content/pm/PackageManager.java
  3. public abstract void setComponentEnabledSetting(ComponentName componentName,
  4. int newState, int flags);
  1. @file:
  2. MM/frameworks/base/core/java/android/app/ApplicationPackageManager.java
  3. final class ApplicationPackageManager extends PackageManager {
  4. @Override
  5. public void setComponentEnabledSetting(ComponentName componentName,
  6. int newState, int flags) {
  7. try {
  8. mPM.setComponentEnabledSetting(componentName, newState, flags, mContext.getUserId());
  9. } catch (RemoteException e) {
  10. // Should never happen!
  11. }
  12. }
4.mPM 的本体
  1. @file:
  2. MM/frameworks/base/core/java/android/app/ApplicationPackageManager.java
  3. ApplicationPackageManager(ContextImpl context,
  4. IPackageManager pm) {
  5. mContext = context;
  6. mPM = pm;
  7. }
  8. @file:
  9. MM/frameworks/base/core/java/android/app/ContextImpl.java
  10. @Override
  11. public PackageManager getPackageManager() {
  12. if (mPackageManager != null) {
  13. return mPackageManager;
  14. }
  15. IPackageManager pm = ActivityThread.getPackageManager();
  16. if (pm != null) {
  17. // Doesn't matter if we make more than one instance.
  18. return (mPackageManager = new ApplicationPackageManager(this, pm));
  19. }
  20. return null;
  21. }
  22. @file:
  23. MM/frameworks/base/core/java/android/app/ActivityThread.java
  24. public static IPackageManager getPackageManager() {
  25. if (sPackageManager != null) {
  26. //Slog.v("PackageManager", "returning cur default = " + sPackageManager);
  27. return sPackageManager;
  28. }
  29. IBinder b = ServiceManager.getService("package");
  30. //Slog.v("PackageManager", "default service binder = " + b);
  31. sPackageManager = IPackageManager.Stub.asInterface(b);
  32. //Slog.v("PackageManager", "default service = " + sPackageManager);
  33. return sPackageManager;
  34. }
如上代码可以看出mPM 是PackageManagerService
5.PackageManagerService 的setComponentEnabledSetting
  1. @file:
  2. MM/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
  3. @Override
  4. public void setComponentEnabledSetting(ComponentName componentName,
  5. int newState, int flags, int userId) {
  6. if (!sUserManager.exists(userId)) return;
  7. setEnabledSetting(componentName.getPackageName(),
  8. componentName.getClassName(), newState, flags, userId, null);
  9. }
  10. private void setEnabledSetting(final String packageName, String className, int newState,
  11. final int flags, int userId, String callingPackage) {
  12. ...
  13. PackageSetting pkgSetting;
  14. pkgSetting = mSettings.mPackages.get(packageName);
  15. case COMPONENT_ENABLED_STATE_DISABLED:
  16. if (!pkgSetting.disableComponentLPw(className, userId)) {
  17. return;
  18. }
  19. break;
  20. scheduleWritePackageRestrictionsLocked(userId);
6. pkgSetting.disableComponentLPw
  1. @File:
  2. MM/frameworks/base/services/core/java/com/android/server/pm/PackageSetting.java
  3. final class PackageSetting extends PackageSettingBase {
  4. @File:
  5. MM/frameworks/base/services/core/java/com/android/server/pm/PackageSettingBase.java
  6. boolean disableComponentLPw(String componentClassName, int userId) {
  7. PackageUserState state = modifyUserStateComponents(userId, true, false);
  8. boolean changed = state.enabledComponents != null
  9. ? state.enabledComponents.remove(componentClassName) : false;
  10. changed |= state.disabledComponents.add(componentClassName);
  11. return changed;
  12. }
  13. MM/frameworks/base/core/java/android/content/pm/PackageUserState.java
  14. public ArraySet<String> disabledComponents;
7.scheduleWritePackageRestrictionsLocked(userId);
  1. @File:
  2. MM/frameworks/base/services/core/java/com/android/server/pm/PackageSettingBase.java
  3. scheduleWritePackageRestrictionsLocked(userId);
  4. void scheduleWritePackageRestrictionsLocked(int userId) {
  5. if (!sUserManager.exists(userId)) return;
  6. mDirtyUsers.add(userId);
  7. if (!mHandler.hasMessages(WRITE_PACKAGE_RESTRICTIONS)) {
  8. mHandler.sendEmptyMessageDelayed(WRITE_PACKAGE_RESTRICTIONS, WRITE_SETTINGS_DELAY);
  9. }
  10. }
  11. case WRITE_PACKAGE_RESTRICTIONS: {
  12. Process.setThreadPriority(Process.THREAD_PRIORITY_DEFAULT);
  13. synchronized (mPackages) {
  14. removeMessages(WRITE_PACKAGE_RESTRICTIONS);
  15. for (int userId : mDirtyUsers) {
  16. mSettings.writePackageRestrictionsLPr(userId);
  17. }
  18. mDirtyUsers.clear();
  19. }
  20. Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
  21. } break;

8.Settings.writePackageRestrictionsLPr
  1. @file:
  2. MM/frameworks/base/core/java/com/android/server/pm/Settings.java
  3. void writePackageRestrictionsLPr(int userId) {
  4. File userPackagesStateFile = getUserPackagesStateFile(userId);
  5. private File getUserPackagesStateFile(int userId) {
  6. // TODO: Implement a cleaner solution when adding tests.
  7. // This instead of Environment.getUserSystemDirectory(userId) to support testing.
  8. File userDir = new File(new File(mSystemDir, "users"), Integer.toString(userId));
  9. return new File(userDir, "package-restrictions.xml");
  10. //kevin Note:文件路径为/data/system/users/0/package-restrictions.xml
  11. }
经过如上的调用,将对应的数据写入/data/system/users/0/package-restrictions.xml
但是此处会有一个延时,
static final int WRITE_SETTINGS_DELAY = 10*1000; // 10 seconds
如果在未写入时,就关机,会产生下次开机还进行设置向导的问题。
解决办法:
在数据设置成功,直接写数据文件。
在如下的位置进行增加:
case COMPONENT_ENABLED_STATE_DISABLED: if (!pkgSetting.disableComponentLPw(className, userId)) { return; }else{
mSettings.writePackageRestrictionsLPr(userId);
}
break;




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值