文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

@UnsupportedAppUsage注解

2023-09-03 18:45

关注

在android-R中,google拓展了原本的UnsupportedAppUsage来限制framework中的某些定义无法被外部应用访问。采用这中方案来强化mainlane模式,强制厂商mainlane自身feature。google也拓展了systemApi注释来保护某些属性无法被sdk外部访问。

@UnsupportedAppUsage

这个注释简单来说就是不支持外部应用使用被此注释声明的变量或方法等

tools\platform-compat\java\android\compat\annotation\UnsupportedAppUsage.java

@Retention(CLASS)@Target({CONSTRUCTOR, METHOD, FIELD, TYPE})@Repeatable(UnsupportedAppUsage.Container.class)public @interface UnsupportedAppUsage {

@Retention(CLASS)可以看到这个注释是存在于class文件中,也就是说编译器会在编译当前java文件为class文件时保留此注释。

tools/platform-compat/java/android/processor/compat/unsupportedappusage/UnsupportedAppUsageProcessor.java

在UnsupportedAppUsageProcessor.java类中,编译器会在class文件处理阶段对UnsupportedAppUsage注释进行分析处理

    @Override    protected void process(TypeElement annotation,            Table> annotatedElements) {        SignatureConverter signatureConverter = new SignatureConverter(messager);        for (PackageElement packageElement : annotatedElements.rowKeySet()) {            Map> row = annotatedElements.row(packageElement);            for (String enclosingElementName : row.keySet()) {                List content = new ArrayList<>();                for (Element annotatedElement : row.get(enclosingElementName)) {                    String signature = signatureConverter.getSignature(types, annotation, annotatedElement);                    if (signature != null) {                        String annotationIndex = getAnnotationIndex(signature, annotation,    annotatedElement);                        if (annotationIndex != null) {content.add(annotationIndex);                        }                    }                }                if (content.isEmpty()) {                    continue;                }                try {                    FileObject resource = processingEnv.getFiler().createResource(CLASS_OUTPUT,packageElement.toString(),enclosingElementName + GENERATED_INDEX_FILE_EXTENSION);                    try (PrintStream outputStream = new PrintStream(resource.openOutputStream())) {                        outputStream.println(CSV_HEADER);                        content.forEach(outputStream::println);                    }                } catch (IOException exception) {                    messager.printMessage(ERROR, "Could not write CSV file: " + exception);                }            }        }    }

在保存csv后,编译器就知道了当前类中那些属性被UnsupportedAppUsage保护了。

在编译其他模块时,在检查当前模块使用的内容时,会检查app是否引用了被注释保护的属性。

一旦检查没有通过,就会报编译错误,导致编译失败。

来源地址:https://blog.csdn.net/xiaowang_lj/article/details/128368937

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯