manifest( 三 )


2.1 全局配置
manifest中一些全局性配置,对apk安装和运行时行为,具有重要影响,最为典型的就是minSdkVersion和targetSdkVersion,一旦非预期变更被带到线上,后果不堪设想 。
全局配置检测工具,提供基于白名单的全局配置检测能力,包含以下情况:

  • 白名单中配置,在清单中不存在;
  • 白名单中配置,在清单中存在,但配置值不一致 。
同时,提供选项,当全局性配置与白名单不一致时,终止构建过程,示例检测结果如下:
[absent] [uses-feature] android.hardware.camera# 白名单中的这个uses-feature在清单中不存在[conflict] [uses-sdk]# 白名单中的uses-sdk节点,属性值与清单中不一致|-- com.youku.arch:testlib:0.1-SNAPSHOT# 包含uses-sdk节点的模块|-- project:library-aar-1:1.0# 包含uses-sdk节点的模块|-- com.youku.arch:testlib2:0.1-SNAPSHOT# 包含uses-sdk节点的模块|-- [attr] targetSdkVersion# targetSdkVersion属性值不一致||-- [whitelist] 29||-- [current] 28|-- [attr] minSdkVersion# minSdkVersion属性值不一致||-- [whitelist] 14||-- [current] 21优酷全局配置白名单,以及新增防控情况如下:
manifest

文章插图
全局配置治理情况
通过这个检测能力和卡口机制,实现了对关键全局性配置的保护,从而有效避免非预期变化发生 。
2.2 权限
权限声明,在当下隐私合规监管态势下,需要被严格的管控住 。这里的“严格”,体现在既不能多也不能少,必须与app隐私协议保持一致 。在前文基础知识部分,我们知道apk中AndroidManifest.xml是通过合并而来的,同时还存在系统权限的隐式带入,这些都增加了权限“严格”管控难度 。
对此,开发了两项检测能力:模块包含权限列表、权限检测 。
模块包含权限列表,列出了各模块包含的权限使用声明(uses-permission)和权限定义(permission),便于定位权限来源 。示例结果:
com.youku.android:YPx:1.20.10.19|-- [uses-permission] android.permission.ACCESS_NETWORK_STATE|-- [uses-permission] android.permission.BLUETOOTH|-- [uses-permission] android.permission.VIBRATEcom.taobao.android:ls:4.10.6.6|-- [uses-permission] android.permission.READ_PHONE_STATE|-- [uses-permission] android.permission.ACCESS_WIFI_STATE权限检测,提供基于白名单的双向检测能力:
  • 白名单中权限,在清单中不存在;
  • 清单中权限,不在白名单中 。
[excess] [uses-permission] android.permission.CALL_PHONE# 清单中CALL_PHONE权限声明,不在白名单中|-- project:app:1.0# 权限声明,来自app工程[absent] [uses-permission] android.permission.ACCESS_NETWORK_STATE# 白名单中ACCESS_NETWORK_STATE,在清单中不存在|-- com.youku.arch:testlib:1.0# com.youku.arch:testlib模块,包含此权限声明|-- com.youku.arch:testlib2:1.0# com.youku.arch:testlib2模块,包含此权限声明更近一步,提供选项,当检测结果不通过时,终止构建过程 。通过这个检测能力和卡口机制,保障权限声明与app隐私协议的连续一致性 。优酷的治理&防控情况如下:
manifest

文章插图
权限治理情况
2.3 四大组件
四大组件需要在清单文件中声明,才能在apk安装后以及运行时,被系统识别,从而正常发挥作用 。同时,四大组件一些关键行为,也需要在清单中进行配置 。在优酷实践过程中,主要发现两类问题:组件对应类缺失、非必要组件导出 。
组件对应类缺失,是指清单中声明的四大组件,android:name属性值对应java类,在apk中不存在 。组件类缺失的负面影响如下:
  • 会生成一条proguard无用keep规则,导致构建耗时增加(一条keep虽小,聚沙成塔,也很可观);
  • 运行时一旦组件被调用(启动),会产生java异常(crash/功能不可用),或者安全漏洞 。即使是无用组件,也要考虑到还有一些黑产组织,会自动化扫描组件并启动(crash率曲线会有尖刺出现) 。
非必要组件导出(定义参见前文),会导致运行时存在安全漏洞的风险增加,优酷收到过多次相关安全漏洞 。导出组件处理原则如下: