问题背景
当自写APP发现无缘无故多申请了多个权限,其中一个就是:android.permission.WAKE_LOCK. 一想就知道如果并非自己在APP main中引入的,那就是依赖的库清单文件导入进来的.
定位问题
定位手段
1.manifest-merger-buildVariant-report.txt
根据其内容可知, WAKE_LOCK 权限来源于work-runtime-2.7.0的库依赖,其清单文件中的25行5-68个字符.
uses-permission#android.permission.WAKE_LOCK
ADDED from [androidx.work:work-runtime:2.7.0] /home/user/.gradle/caches/transforms-3/603a5a760e085f6144531debd6660c46/transformed/work-runtime-2.7.0/AndroidManifest.xml:25:5-68
2.自编AndroidManifest.xml中选中Merged manifest, 通过查看预览merge视图定位来源.
从上视图查看就更加直观了.选中被merge进来的元素,右侧会预览显示merging log. 直接双击该行被引入的元素, 会自动跳转到对应work-runtime的清单文件中.
其内容如下:
<?xml version="1.0" encoding="utf-8"?>
<!--~ Copyright (C) 2016 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.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"package="androidx.work" ><uses-sdkandroid:minSdkVersion="14"android:targetSdkVersion="31" /><uses-permission android:name="android.permission.WAKE_LOCK" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /><uses-permission android:name="android.permission.FOREGROUND_SERVICE" /><application><providerandroid:name="androidx.startup.InitializationProvider"android:authorities="${applicationId}.androidx-startup"android:exported="false"tools:node="merge" ><meta-dataandroid:name="androidx.work.WorkManagerInitializer"android:value="androidx.startup" /></provider><serviceandroid:name="androidx.work.impl.background.systemalarm.SystemAlarmService"android:directBootAware="false"android:enabled="@bool/enable_system_alarm_service_default"android:exported="false"tools:targetApi="n" /><serviceandroid:name="androidx.work.impl.background.systemjob.SystemJobService"android:directBootAware="false"android:enabled="@bool/enable_system_job_service_default"android:exported="true"android:permission="android.permission.BIND_JOB_SERVICE"tools:targetApi="n" /><serviceandroid:name="androidx.work.impl.foreground.SystemForegroundService"android:directBootAware="false"android:enabled="@bool/enable_system_foreground_service_default"android:exported="false"tools:targetApi="n" /><receiverandroid:name="androidx.work.impl.utils.ForceStopRunnable$BroadcastReceiver"android:directBootAware="false"android:enabled="true"android:exported="false"tools:targetApi="n" /><receiverandroid:name="androidx.work.impl.background.systemalarm.ConstraintProxy$BatteryChargingProxy"android:directBootAware="false"android:enabled="false"android:exported="false"tools:targetApi="n" ><intent-filter><action android:name="android.intent.action.ACTION_POWER_CONNECTED" /><action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" /></intent-filter></receiver><receiverandroid:name="androidx.work.impl.background.systemalarm.ConstraintProxy$BatteryNotLowProxy"android:directBootAware="false"android:enabled="false"android:exported="false"tools:targetApi="n" ><intent-filter><action android:name="android.intent.action.BATTERY_OKAY" /><action android:name="android.intent.action.BATTERY_LOW" /></intent-filter></receiver><receiverandroid:name="androidx.work.impl.background.systemalarm.ConstraintProxy$StorageNotLowProxy"android:directBootAware="false"android:enabled="false"android:exported="false"tools:targetApi="n" ><intent-filter><action android:name="android.intent.action.DEVICE_STORAGE_LOW" /><action android:name="android.intent.action.DEVICE_STORAGE_OK" /></intent-filter></receiver><receiverandroid:name="androidx.work.impl.background.systemalarm.ConstraintProxy$NetworkStateProxy"android:directBootAware="false"android:enabled="false"android:exported="false"tools:targetApi="n" ><intent-filter><action android:name="android.net.conn.CONNECTIVITY_CHANGE" /></intent-filter></receiver><receiverandroid:name="androidx.work.impl.background.systemalarm.RescheduleReceiver"android:directBootAware="false"android:enabled="false"android:exported="false"tools:targetApi="n" ><intent-filter><action android:name="android.intent.action.BOOT_COMPLETED" /><action android:name="android.intent.action.TIME_SET" /><action android:name="android.intent.action.TIMEZONE_CHANGED" /></intent-filter></receiver><receiverandroid:name="androidx.work.impl.background.systemalarm.ConstraintProxyUpdateReceiver"android:directBootAware="false"android:enabled="@bool/enable_system_alarm_service_default"android:exported="false"tools:targetApi="n" ><intent-filter><action android:name="androidx.work.impl.background.systemalarm.UpdateProxies" /></intent-filter></receiver><receiverandroid:name="androidx.work.impl.diagnostics.DiagnosticsReceiver"android:directBootAware="false"android:enabled="true"android:exported="true"android:permission="android.permission.DUMP"tools:targetApi="n" ><intent-filter><action android:name="androidx.work.diagnostics.REQUEST_DIAGNOSTICS" /></intent-filter></receiver></application></manifest>
从清单文件中可知,其中被默认引入了很多androidx相关的能力, 尽管我们自己定义的demo的AndroidManifest.xml很简单.
这时候可能根据自身情况看是否引入了过多不必要的dependencies依赖库.
3.清单文件合并规则
更多清单文件的合并规则,可以参考android开发者网站官方说明.
管理清单文件 | Android Studio | Android Developers
(完)