Android S - 恢复部分应用安装

发布于:2025-06-13 ⋅ 阅读:(18) ⋅ 点赞:(0)

使用展锐提供的代码编译出来的固件,不包含DeskClock等应用。

之前也遇到过这个情况,只是时间太久忘记了,在这里再次记录!

frameworks/native/data/etc/android.app.remove.xml


<?xml version="1.0" encoding="utf-8"?>
  
<permissions>
    <customized-restricted-app config="persist.remove.app"  value="1">
        <!-- <path name="Messages"/>
        <path name="messaging"/>
        <path name="MessagesGo"/> -->

        <path name="FMRadio"/>
        <path name="SprdFMRadio"/>
        <path name="DreamFMRadioPrebuilt"/>

        <path name="DreamSoundRecorderPrebuilt"/>

        <path name="Email2"/>
        <path name="GMailGo"/>
        <path name="GMailGo_1G"/>
        <path name="Gmail2"/>
        <path name="Gmail2_2G"/>

        <path name="DeskClock"/>  需要去掉
        <path name="SprdDeskClock"/>
        <path name="DeskClockGoogle"/>

        <path name="SprdCalendar"/>
        <path name="SprdCalendarProvider"/>
        <path name="SprdCalendarProviderPrebuilt"/>
        <path name="Calendar"/>
        <path name="CalendarGoogle"/>
    </customized-restricted-app>
</permissions>

然后记录一下原因。

首先日志检索  DeskClock 发现只有这么三行,很好定位到源码。

18:11:19.933 SystemConfig              D  readCustomizedRestrictedPathsByConfig DeskClock, apkType = 0
18:11:19.934 SystemConfig              D  readCustomizedRestrictedPathsByConfig SprdDeskClock, apkType = 0
18:11:19.935 SystemConfig              D  readCustomizedRestrictedPathsByConfig DeskClockGoogle, apkType = 0
 

         从xml文件中读取权限
 651     private void readPermissionsFromXml(File permFile, int permissionFlag) {
 652         FileReader permReader = null;
 653         try {
 654             permReader = new FileReader(permFile);
 655         } catch (FileNotFoundException e) {
 656             Slog.w(TAG, "Couldn't find or open permissions file " + permFile);
 657             return;
 658         }
 659         Slog.i(TAG, "Reading permissions from " + permFile);
 660 
 661         final boolean lowRam = ActivityManager.isLowRamDeviceStatic();
 662 
 663         try {
 664             XmlPullParser parser = Xml.newPullParser();
 665             parser.setInput(permReader);
 666 
 667             int type;
 668             while ((type=parser.next()) != parser.START_TAG
 669                        && type != parser.END_DOCUMENT) {
 670                 ;
 671             }
 682             final boolean allowAll = permissionFlag == ALLOW_ALL;
 686             final boolean allowAppConfigs = (permissionFlag & ALLOW_APP_CONFIGS) != 0;
 687             final boolean allowPrivappPermissions = (permissionFlag & ALLOW_PRIVAPP_PERMISSIONS)
 688                     != 0;
 689             final boolean allowOemPermissions = (permissionFlag & ALLOW_OEM_PERMISSIONS) != 0;
 690             final boolean allowApiWhitelisting = (permissionFlag & ALLOW_HIDDENAPI_WHITELISTING)

 698             while (true) {
 699                 XmlUtils.nextElement(parser);
 700                 if (parser.getEventType() == XmlPullParser.END_DOCUMENT) {
 701                     break;
 702                 }
 703 
 704                 String name = parser.getName();
 705                 if (name == null) {
 706                     XmlUtils.skipCurrentTag(parser);
 707                     continue;
 708                 }
 709                 switch (name) {
...
          可以看出customized-restricted-app就是获取xml文件中的name
1277                     case "customized-restricted-app": {
1278                         String config = parser.getAttributeValue(null, "config");
1279                         String value = parser.getAttributeValue(null, "value");
1280                         if (TextUtils.isEmpty(config) || TextUtils.isEmpty(value)) {
1281                             Slog.w(TAG, "Tag config" + config + " or value " + value + " in "
1282                                 + permFile + " at " + parser.getPositionDescription() + " is empty");
1283                             XmlUtils.skipCurrentTag(parser);
1284                         }
1285                         List<String> restrictedPermission = Arrays.asList(config, value);
1286                         mCustomizedRestrictedPaths.put(restrictedPermission,
1287                                 readCustomizedRestrictedPathsByConfig(parser));
1288 
1289                     } break;


        读取限制的xml文件
1676     private HashMap<String, Integer> readCustomizedRestrictedPathsByConfig(XmlPullParser parser)
1677             throws IOException, XmlPullParserException {
1678         HashMap<String, Integer> customizedRestrictedPaths = new HashMap<String, Integer>();
1679         int packageDepth = parser.getDepth();
1680         int type;
1681         int depth = parser.getDepth();
1682         while (XmlUtils.nextElementWithin(parser, depth)) {
1683             String tagName = parser.getName();
1684             if (tagName.equals("path")) {
1685                 String name = parser.getAttributeValue(null, "name");
1686                 Integer apkType = 0;
1687                 try {
1688                     apkType = Integer.valueOf(parser.getAttributeValue(null, "type"));
1689                 } catch (NumberFormatException e) {
1690                 }
                     日志在这里打印
1691                 Slog.d(TAG, "readCustomizedRestrictedPathsByConfig " + name +
1692                         ", apkType = " + apkType);
1693                 customizedRestrictedPaths.put(name, apkType);
1694             } else {
1695                 Slog.w(TAG, "Unknown element under <customized-restricted-app>: "
1696                       + parser.getName());
1697             }
1698         }
1699         return customizedRestrictedPaths;
1700     }

然后检索一下 customized-restricted-app

来看一下定义

device/sprd/xxx/xxx/module/app/md.mk

#add for not install unused app
PRODUCT_PRODUCT_PROPERTIES += persist.remove.app=1
PRODUCT_COPY_FILES += \
    frameworks/native/data/etc/android.app.remove.xml:product/etc/permissions/android.app.remove.xml