CustomLocale.apk所需要的权限"android.permission.CHANGE_CONFIGURATION"自Android 4.2,4.2.2起系统定义为android:protectionLevel="signature|system|development",这就需要在已root的android设置上运行命令:

  1. adb shell pm grant application_package android.permission.CHANGE_CONFIGURATION

下面具体说说pm grant的调用路径。

Pm.java

  1. public void run(String[] args) {
  2. boolean validCommand = false;
  3. if (args.length < 1) {
  4. showUsage();
  5. return;
  6. }
  7. ...
  8. if ("grant".equals(op)) {
  9. runGrantRevokePermission(true);
  10. return;
  11. }
  12. ...
  13.  
  14. private void runGrantRevokePermission(boolean grant) {
  15. String pkg = nextArg();
  16. if (pkg == null) {
  17. System.err.println("Error: no package specified");
  18. showUsage();
  19. return;
  20. }
  21. String perm = nextArg();
  22. if (perm == null) {
  23. System.err.println("Error: no permission specified");
  24. showUsage();
  25. return;
  26. }
  27. try {
  28. if (grant) {
  29. mPm.grantPermission(pkg, perm);
  30. } else {
  31. mPm.revokePermission(pkg, perm);
  32. }
  33. } catch (RemoteException e) {
  34. System.err.println(e.toString());
  35. System.err.println(PM_NOT_RUNNING_ERR);
  36. } catch (IllegalArgumentException e) {
  37. System.err.println("Bad argument: " + e.toString());
  38. showUsage();
  39. } catch (SecurityException e) {
  40. System.err.println("Operation not allowed: " + e.toString());
  41. }
  42. }

PackageManagerService.java

  1. public class PackageManagerService extends IPackageManager.Stub {
  2. ...
  3. public void grantPermission(String packageName, String permissionName) {
  4. mContext.enforceCallingOrSelfPermission(
  5. android.Manifest.permission.GRANT_REVOKE_PERMISSIONS, null);
  6. synchronized (mPackages) {
  7. final PackageParser.Package pkg = mPackages.get(packageName);
  8. if (pkg == null) {
  9. throw new IllegalArgumentException("Unknown package: " + packageName);
  10. }
  11. final BasePermission bp = mSettings.mPermissions.get(permissionName);
  12. if (bp == null) {
  13. throw new IllegalArgumentException("Unknown permission: " + permissionName);
  14. }
  15.  
  16. checkGrantRevokePermissions(pkg, bp);
  17.  
  18. final PackageSetting ps = (PackageSetting) pkg.mExtras;
  19. if (ps == null) {
  20. return;
  21. }
  22. final GrantedPermissions gp = (ps.sharedUser != null) ? ps.sharedUser : ps;
  23. if (gp.grantedPermissions.add(permissionName)) {
  24. if (ps.haveGids) {
  25. gp.gids = appendInts(gp.gids, bp.gids);
  26. }
  27. mSettings.writeLPr();
  28. }
  29. }
  30. }
  31. ...

Settings.java

  1. final class Settings {
  2. ...
  3. private final File mSettingsFilename;
  4. ...
  5. Settings(Context context, File dataDir) {
  6. mContext = context;
  7. mSystemDir = new File(dataDir, "system");
  8. mSystemDir.mkdirs();
  9. FileUtils.setPermissions(mSystemDir.toString(),
  10. FileUtils.S_IRWXU|FileUtils.S_IRWXG
  11. |FileUtils.S_IROTH|FileUtils.S_IXOTH,
  12. -1, -1);
  13. mSettingsFilename = new File(mSystemDir, "packages.xml");
  14. mBackupSettingsFilename = new File(mSystemDir, "packages-backup.xml");
  15. mPackageListFilename = new File(mSystemDir, "packages.list");
  16. FileUtils.setPermissions(mPackageListFilename, 0660, SYSTEM_UID, PACKAGE_INFO_GID);
  17.  
  18. // Deprecated: Needed for migration
  19. mStoppedPackagesFilename = new File(mSystemDir, "packages-stopped.xml");
  20. mBackupStoppedPackagesFilename = new File(mSystemDir, "packages-stopped-backup.xml");
  21. }
  22. ...
  23. void writeLPr() {
  24. //Debug.startMethodTracing("/data/system/packageprof", 8 * 1024 * 1024);
  25.  
  26. // Keep the old settings around until we know the new ones have
  27. // been successfully written.
  28. if (mSettingsFilename.exists()) {
  29. // Presence of backup settings file indicates that we failed
  30. // to persist settings earlier. So preserve the older
  31. // backup for future reference since the current settings
  32. // might have been corrupted.
  33. if (!mBackupSettingsFilename.exists()) {
  34. if (!mSettingsFilename.renameTo(mBackupSettingsFilename)) {
  35. Log.wtf(PackageManagerService.TAG, "Unable to backup package manager settings, "
  36. + " current changes will be lost at reboot");
  37. return;
  38. }
  39. } else {
  40. mSettingsFilename.delete();
  41. Slog.w(PackageManagerService.TAG, "Preserving older settings backup");
  42. }
  43. }
  44.  
  45. mPastSignatures.clear();
  46.  
  47. try {
  48. FileOutputStream fstr = new FileOutputStream(mSettingsFilename);
  49. BufferedOutputStream str = new BufferedOutputStream(fstr);
  50.  
  51. //XmlSerializer serializer = XmlUtils.serializerInstance();
  52. XmlSerializer serializer = new FastXmlSerializer();
  53. serializer.setOutput(str, "utf-8");
  54. serializer.startDocument(null, true);
  55. serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
  56.  
  57. serializer.startTag(null, "packages");
  58.  
  59. serializer.startTag(null, "last-platform-version");
  60. serializer.attribute(null, "internal", Integer.toString(mInternalSdkPlatform));
  61. serializer.attribute(null, "external", Integer.toString(mExternalSdkPlatform));
  62. serializer.endTag(null, "last-platform-version");
  63.  
  64. if (mVerifierDeviceIdentity != null) {
  65. serializer.startTag(null, "verifier");
  66. serializer.attribute(null, "device", mVerifierDeviceIdentity.toString());
  67. serializer.endTag(null, "verifier");
  68. }
  69.  
  70. if (mReadExternalStorageEnforced != null) {
  71. serializer.startTag(null, TAG_READ_EXTERNAL_STORAGE);
  72. serializer.attribute(
  73. null, ATTR_ENFORCEMENT, mReadExternalStorageEnforced ? "" : "");
  74. serializer.endTag(null, TAG_READ_EXTERNAL_STORAGE);
  75. }
  76.  
  77. serializer.startTag(null, "permission-trees");
  78. for (BasePermission bp : mPermissionTrees.values()) {
  79. writePermissionLPr(serializer, bp);
  80. }
  81. serializer.endTag(null, "permission-trees");
  82.  
  83. serializer.startTag(null, "permissions");
  84. for (BasePermission bp : mPermissions.values()) {
  85. writePermissionLPr(serializer, bp);
  86. }
  87. serializer.endTag(null, "permissions");
  88.  
  89. for (final PackageSetting pkg : mPackages.values()) {
  90. writePackageLPr(serializer, pkg);
  91. }
  92.  
  93. for (final PackageSetting pkg : mDisabledSysPackages.values()) {
  94. writeDisabledSysPackageLPr(serializer, pkg);
  95. }
  96.  
  97. for (final SharedUserSetting usr : mSharedUsers.values()) {
  98. serializer.startTag(null, "shared-user");
  99. serializer.attribute(null, ATTR_NAME, usr.name);
  100. serializer.attribute(null, "userId",
  101. Integer.toString(usr.userId));
  102. usr.signatures.writeXml(serializer, "sigs", mPastSignatures);
  103. serializer.startTag(null, "perms");
  104. for (String name : usr.grantedPermissions) {
  105. serializer.startTag(null, TAG_ITEM);
  106. serializer.attribute(null, ATTR_NAME, name);
  107. serializer.endTag(null, TAG_ITEM);
  108. }
  109. serializer.endTag(null, "perms");
  110. serializer.endTag(null, "shared-user");
  111. }
  112.  
  113. if (mPackagesToBeCleaned.size() > 0) {
  114. for (PackageCleanItem item : mPackagesToBeCleaned) {
  115. final String userStr = Integer.toString(item.userId);
  116. serializer.startTag(null, "cleaning-package");
  117. serializer.attribute(null, ATTR_NAME, item.packageName);
  118. serializer.attribute(null, ATTR_CODE, item.andCode ? "true" : "false");
  119. serializer.attribute(null, ATTR_USER, userStr);
  120. serializer.endTag(null, "cleaning-package");
  121. }
  122. }
  123.  
  124. if (mRenamedPackages.size() > 0) {
  125. for (Map.Entry<String, String> e : mRenamedPackages.entrySet()) {
  126. serializer.startTag(null, "renamed-package");
  127. serializer.attribute(null, "new", e.getKey());
  128. serializer.attribute(null, "old", e.getValue());
  129. serializer.endTag(null, "renamed-package");
  130. }
  131. }
  132.  
  133. mKeySetManager.writeKeySetManagerLPr(serializer);
  134.  
  135. serializer.endTag(null, "packages");
  136.  
  137. serializer.endDocument();
  138.  
  139. str.flush();
  140. FileUtils.sync(fstr);
  141. str.close();
  142.  
  143. // New settings successfully written, old ones are no longer
  144. // needed.
  145. mBackupSettingsFilename.delete();
  146. FileUtils.setPermissions(mSettingsFilename.toString(),
  147. FileUtils.S_IRUSR|FileUtils.S_IWUSR
  148. |FileUtils.S_IRGRP|FileUtils.S_IWGRP,
  149. -1, -1);
  150.  
  151. // Write package list file now, use a JournaledFile.
  152. File tempFile = new File(mPackageListFilename.getAbsolutePath() + ".tmp");
  153. JournaledFile journal = new JournaledFile(mPackageListFilename, tempFile);
  154.  
  155. final File writeTarget = journal.chooseForWrite();
  156. fstr = new FileOutputStream(writeTarget);
  157. str = new BufferedOutputStream(fstr);
  158. try {
  159. FileUtils.setPermissions(fstr.getFD(), 0660, SYSTEM_UID, PACKAGE_INFO_GID);
  160.  
  161. StringBuilder sb = new StringBuilder();
  162. for (final PackageSetting pkg : mPackages.values()) {
  163. if (pkg.pkg == null || pkg.pkg.applicationInfo == null) {
  164. Slog.w(TAG, "Skipping " + pkg + " due to missing metadata");
  165. continue;
  166. }
  167.  
  168. final ApplicationInfo ai = pkg.pkg.applicationInfo;
  169. final String dataPath = ai.dataDir;
  170. final boolean isDebug = (ai.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
  171. final int[] gids = pkg.getGids();
  172.  
  173. // Avoid any application that has a space in its path.
  174. if (dataPath.indexOf("") >= 0)
  175. continue;
  176.  
  177. // we store on each line the following information for now:
  178. //
  179. // pkgName - package name
  180. // userId - application-specific user id
  181. // debugFlag - 0 or 1 if the package is debuggable.
  182. // dataPath - path to package's data path
  183. // seinfo - seinfo label for the app (assigned at install time)
  184. // gids - supplementary gids this app launches with
  185. //
  186. // NOTE: We prefer not to expose all ApplicationInfo flags for now.
  187. //
  188. // DO NOT MODIFY THIS FORMAT UNLESS YOU CAN ALSO MODIFY ITS USERS
  189. // FROM NATIVE CODE. AT THE MOMENT, LOOK AT THE FOLLOWING SOURCES:
  190. // system/core/run-as/run-as.c
  191. // system/core/sdcard/sdcard.c
  192. //
  193. sb.setLength(0);
  194. sb.append(ai.packageName);
  195. sb.append("");
  196. sb.append((int)ai.uid);
  197. sb.append(isDebug ? " 1 " : " 0 ");
  198. sb.append(dataPath);
  199. sb.append("");
  200. sb.append(ai.seinfo);
  201. sb.append("");
  202. if (gids != null && gids.length > 0) {
  203. sb.append(gids[0]);
  204. for (int i = 1; i < gids.length; i++) {
  205. sb.append(",");
  206. sb.append(gids[i]);
  207. }
  208. } else {
  209. sb.append("none");
  210. }
  211. sb.append("\n");
  212. str.write(sb.toString().getBytes());
  213. }
  214. str.flush();
  215. FileUtils.sync(fstr);
  216. str.close();
  217. journal.commit();
  218. } catch (Exception e) {
  219. Log.wtf(TAG, "Failed to write packages.list", e);
  220. IoUtils.closeQuietly(str);
  221. journal.rollback();
  222. }
  223.  
  224. writeAllUsersPackageRestrictionsLPr();
  225. return;
  226.  
  227. } catch(XmlPullParserException e) {
  228. Log.wtf(PackageManagerService.TAG, "Unable to write package manager settings, "
  229. + "current changes will be lost at reboot", e);
  230. } catch(java.io.IOException e) {
  231. Log.wtf(PackageManagerService.TAG, "Unable to write package manager settings, "
  232. + "current changes will be lost at reboot", e);
  233. }
  234. // Clean up partially written files
  235. if (mSettingsFilename.exists()) {
  236. if (!mSettingsFilename.delete()) {
  237. Log.wtf(PackageManagerService.TAG, "Failed to clean up mangled file: "
  238. + mSettingsFilename);
  239. }
  240. }
  241. //Debug.stopMethodTracing();
  242. }
  243. ...

pm grant 命令的更多相关文章

  1. 如何使用mysql的grant命令(详解)

    grant命令的基本格式 grant 权限 on 数据库对象 to 用户 实例一:在任意ip地址登陆的common_user用户可以对testdb数据库里的数据进行查询操作.插入操作.更新操作.删除操 ...

  2. MySQL grant命令使用

    MySQL 赋予用户权限命令的简单格式可概括为: grant 权限 on 数据库对象 to 用户 一.grant 普通数据用户,查询.插入.更新.删除 数据库中所有表数据的权利. grant sele ...

  3. php 通过 create user 和grant 命令无法创建数据库用户和授权的解决办法

    php 通过 create user 和grant 命令无法创建数据库用户和授权的解决办法 解决办法, 通过 insert 命令的方式进行创建. 创建数据库用户: $sql= "insert ...

  4. adb shell am broadcast 手动发送广播及adb shell am/pm其他命令

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/zi_zhe/article/details/72229201 在命令行可用adb shell am ...

  5. (转)MySQL的Grant命令

    [MySQL] - MySQL的Grant命令 来源:http://yingxiong.javaeye.com/blog/451208 本文实例,运行于 MySQL 5.0 及以上版本. MySQL ...

  6. win10安装mysql过程&&链接过程&&备份和导入数据&&grant命令

    win10安装mysql过程&&链接过程&&备份和导入数据&&grant命令   一 .安装 一开始在mysql官网(https://www.mysql ...

  7. MySQL的Grant命令[转]

    本文实例,运行于 MySQL 5.0 及以上版本. MySQL 赋予用户权限命令的简单格式可概括为: grant 权限 on 数据库对象 to 用户 一.grant 普通数据用户,查询.插入.更新.删 ...

  8. [MySQL] - MySQL的Grant命令

    本文实例,运行于 MySQL 5.0 及以上版本. MySQL 赋予用户权限命令的简单格式可概括为: grant 权限 on 数据库对象 to 用户 一.grant 普通数据用户,查询.插入.更新.删 ...

  9. MySQL的Grant命令

    来源:http://yingxiong.javaeye.com/blog/451208   本文实例,运行于 MySQL 5.0 及以上版本. MySQL 赋予用户权限命令的简单格式可概括为: gra ...

随机推荐

  1. js--小结⑤

    js中的for循环,while循环,do...while循环和C语言的一模一样 有几个问题要提醒一下的是 1.  null是对象,即object       undefined是undefined d ...

  2. (转)C# 中的委托和事件

    来源:http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-In-CSharp.aspx 引言 委托 和 事件在 .Net ...

  3. C#当中的多线程_线程池

    3.1 简介 线程池主要用在需要大量短暂的开销大的资源的情形.我们预先分配一些资源在线程池当中,当我们需要使用的时候,直接从池中取出,代替了重新创建,不用时候就送回到池当中. .NET当中的线程池是受 ...

  4. JS事件监听 JS:attachEvent和addEventListener 使用方法

    attachEvent与addEventListener区别适应的浏览器版本不同,同时在使用的过程中要注意attachEvent方法          按钮onclickaddEventListene ...

  5. 基于url拦截实现权限控制

    用户表,角色表,用户角色表,权限表,权限角色表 1.用户通过认证(可以是验证用户名,密码等) 2.登陆拦截器,为公开的url放行, 登陆时,将用户信息放入session中,获得用户的权限集合,将集合放 ...

  6. js Dom树结构分析

    对Dom数结构的理解,对用js操作html元素有很大的意义 先来看一下下面这段html代码:(这里就以分析body中的元素来解释,因为我们基本所有的操作基本都围绕body标签来做的) <!DOC ...

  7. JS-SDK微信支付开发攻略

    一.吐槽篇 一个字——坑!两个字——很坑!三个字——非常坑!首先,微信支付接口作为微信开发接口的一部分,竟然有一本书那么厚的官方文档,共36页,更重要的是,这36页还不能把开发的流程说清楚,描述过于分 ...

  8. ExecuteNonQuery&& ExecuteQuery 区别

    前些日子作一些数据项目的时候 在ADO.NET 中处理 ExecuteNonQuery()方法时,总是通过判断其返回值是否大于0来判断操作时候成功 .但是实际上并不是这样的,好在处理的数据操作多时 修 ...

  9. 隐藏input边框(ie6、ie7)

    去掉元素的边框,我们一贯使用border:none; 但在ie6.ie7下的input[type=text]元素,并没有去掉. 两种解决方案: 1. border:none; 并设置背景backgro ...

  10. 解决VS2015无法调试dotnet core项目

    dotnet core 1.0正式版和VS2015 update3安装后一直无法在VS中正常调试. 错误提示:The debugger's worker process (msvsmon.exe) u ...