PackageManager.hasSystemFeature Android SystemServer裁剪

        最近工作原因已经开始由Android软件转向Android系统进行转变。目前碰到很多问题,自己在CSDN进行记录相关问题,加深印象。提高自己自己学习效率。

        Android系统启动后Zygote进程会fork SystemServer进程。SystemServer.java文件位于 /base/services/java/com/android/server/SystemServer.java。
SystemServer 启动Andorid很多服务如:AMS,PMS等等。主要是通过下面三个方法启动:

​
        // Start services.
        try {
            traceBeginAndSlog("StartServices");
            startBootstrapServices();
            startCoreServices();
            startOtherServices();
            SystemServerInitThreadPool.shutdown();
        } catch (Throwable ex) {
            Slog.e("System", "******************************************");
            Slog.e("System", "************ Failure starting system services", ex);
            throw ex;
        } finally {
            traceEnd();
        }

​

        今天记录问题是在裁剪Android系统过程中有些不需要的服务是可以不启动的。比如说我不需要WifiP2P服务功能,这部分功能其实通过下面代码进行判断是否要启动的:

if(context.getPackageManager().hasSystemFeature
(PackageManager.FEATURE_WIFI_DIRECT)) {
    traceBeginAndSlog("StartWifiP2P");
    mSystemServiceManager.startService(WIFI_P2P_SERVICE_CLASS);
    traceEnd();
}

PackageManager通过hasSystemFeature判断是否需要启动WifiP2P。其实是从SystemConfig读取到的mAvailableFeatures中查询是否存在,或者版本更新。mAvailableFeatures是一个ArrayMap对象。其中value是通过Android手机系统目录下system下的etc文件。我个人使用代码是Android 8.1 _r34代码。其实上述目录是拷贝frameworks/native/data/etc下面的xml文件。不同厂商也有可能放置在不同位置比如system/etc/permissions等。如果删除这个xml,就会导致这个服务不能启动。上诉WIFI热点功能对应xml文件为android.hardware.wifi.direct.xml。文件如下:

<!--  Copyright (C) 2011 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at
  
          http://www.apache.org/licenses/LICENSE-2.0
  
     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
<!--  This is the standard feature indicating that the device includes WiFi Direct.  -->
<permissions>
<feature name="android.hardware.wifi.direct"/>
</permissions>

        这些文件会再编译的mk文件中配置。将其拷贝到out目录下,一般情况主要是build、vendor还有就是device下的的mk文件。而我需要做的事情就是删除mk里面相关拷贝配置。从而达到屏蔽相关不需要服务。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PackageManager.hasSystemFeature(String) 方法的实现源码如下: ```java public boolean hasSystemFeature(@NonNull String name) { try { return getPM().hasSystemFeature(name); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } ``` 其中,getPM() 方法会返回 PackageManager 的代理对象,该对象通过 Binder 机制与 PackageManagerService 进行通信。 PackageManagerService.hasSystemFeature(String) 方法的实现源码如下: ```java public boolean hasSystemFeature(String name) { synchronized (mPackages) { FeatureInfo feat = mSettings.mAvailableFeatures.get(name); if (feat != null) { return true; } for (int i = mSettings.mUnavailableFeatures.size() - 1; i >= 0; i--) { if (name.equals(mSettings.mUnavailableFeatures.get(i))) { return false; } } try { return getPackageManager().hasSystemFeature(name); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } } ``` 该方法首先会从 mSettings.mAvailableFeatures 中查找是否存在指定名称的特性,如果存在则返回 true。如果不存在,则会从 mSettings.mUnavailableFeatures 中查找是否存在指定名称的特性,如果存在则返回 false。如果两个列表中都没有指定名称的特性,则会调用 getPackageManager().hasSystemFeature(String) 方法来查询系统是否支持该特性。 getPackageManager() 方法会返回 PackageManager 的代理对象,该对象通过 Binder 机制与 PackageManagerService 进行通信。 上述代码中的 mSettings 是一个 Settings 类型的对象,表示 PackageManagerService 的一些配置信息,例如支持的特性列表、安装应用程序的策略等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值