manifest( 四 )

  • 需要导出,且为自研代码,用于线上实际业务(外部唤端等) 。关闭导出,收敛到统一路由中心;
  • 需要导出,但是为二、三方代码,用于线上实际业务(外部唤端等) 。添加白名单 。
  • 对此,开发了三项检测能力:
    • 组件归属模块列表,列出所有四大组件,以及包含此组件声明的模块:
    # 在manifest合并后不存在的组件,前面会加上[delete]# 被超过两个以上模块包含的组件,前面会加上[duplicate][duplicate] [activity] com.example.myapplication.MainActivity|-- project:app:1.0|-- project:library-aar-1:1.0[deleted] [service] com.example.myapplication.FirstService|-- project:app:1.0[receiver] com.example.myapplication.FirstReceiver|-- project:library-aar-1:1.0[provider] com.example.myapplication.FirstProvider|-- com.youku.arch:testlib:1.0
    • 缺失组件引用检测,识别缺失引用组件名称,以及哪些模块声明了此组件 。同时,提供选项以及白名单,当检测结果不通过时,终止构建过程 。示例检测结果如下:
    [activity] org.cocos2dx.javascript.AActivity|-- com.youku.android:interactive-engine:0.2.9[activity] com.ali.lv.HLActivity|-- com.ali.phone.wt:n-build:10.2.3.592[activity] com.youku.pc.debug.DActivity|-- com.youku.android:YKPChannel:2.14.1.28[service] com.youku.feed.utils.FAService|-- com.youku.android:FBase:1.5.20.8
    • 导出组件检测,识别导出组件,以及哪些模块声明了此组件 。同时,提供选项以及白名单,当检测结果不通过时,终止构建过程 。对于Target31更安全导出组件的行为变更,专门提供「禁止隐式导出」配置项,会无视白名单,并在分析结果中增加可识别标记 。示例检测结果如下:
    # 对于白名单中组件,会在名称前加上[ignored]标识;如果开启「禁止隐式导出」配置项,对于隐式导出组件,会在名称前加上[implicit]标识[activity] com.youku.app.NPageActivity|-- com.youku.android:YoukuHPage:1.9.43.8[ignored][activity] com.ali.MIPreviewActivity|-- com.ali:m-image-selector:10.1.6.190[implicit] [activity] com.youku.fbiz.RPageActivity|-- com.youku.android:fbizSDK:1.0.2.48在优酷治理实践中,考虑到对各业务研发同学的影响,对存量问题集中添加到白名单,后面择机统一发起清理行动 。随着版本迭代,除了对新增问题的有效拦截,存量问题也有一些“自然修复”,整体情况如下:
    manifest

    文章插图
    四大组件治理情况
    此外,优酷目前的targetSdkVersion是30,明年会进行target31的适配工作,存量隐式导出组件161个,占所有导出组件50%左右,届时这些需要全部解决 。在当前工具和卡口体系下,相信这个问题的整改,会变得轻松而可控 。
    2.4 治理全景
    至此,对于manifest清单,进行了较全面有效的防腐化能力建设和治理 。最后,给出一份全景图:
    manifest

    文章插图
    manifest治理全景
    还能做些什么manifest包含的内容,比较有限 。因此,上述治理应该已经覆盖绝大部分问题,但仍然还有一些低概率的边缘case,可以通过同样的思路来提前识别&解决,例如:多个activity的scheme定义重复,导致通过隐式方式启动activity时,出现选择弹窗 。
    与工程腐化的对抗,依然艰难,任重而道远,与诸君共勉 。
    【参考文档】
    • 【google】App Manifest Overview:https://developer.android.com/guide/topics/manifest/manifest-intro
    • 【google】Manage manifest files:https://developer.android.com/studio/build/manage-manifests
    关注【阿里巴巴移动技术】微信公众号,每周 3 篇移动技术实践&干货给你思考!

    秒懂生活扩展阅读