如何打造一个 Android 编译时注解框架

前言

近期笔者开源了一个 Android 编译时注解框架库——Permissions4M,一款处理 Android 6.0 运行时权限的库。此库基于鸿洋前辈的 MPermissions 二次开发,目前 Android 中主流的几款编译时处理框架有大名鼎鼎的 Dagger2 和 Butterknife,希望在阅读完笔者的这篇博客和笔者的框架后,能够帮助各位读者更深一步的帮助各位读者了解 Android 编译时注解处理技术,所以希望读者在阅读笔者的这篇博客前,请先对注解有些了解,对 Android 6.0 运行时权限有一定了解,更好地是对笔者的库试一试,便于理解笔者后面所述内容。推荐阅读以下内容:

预览

为了便于各位读者理解 Permissions4M,笔者特地画下了以下这幅图:

  • 编译前:

这里写图片描述

编译前,你的程序中(为了更方便的理解,后面笔者就不使用程序两个字,直接使用“Activity”来实例化程序这两个字)除了自己写的代码之外,涉及到注解库的内容可以被分成两个部分,一个部分是注解,另一个部分应该是你所调用的 API,例如在 Butterknife 中,你可能会用到注解 @BindView,而使用到 API 应该是 ButterKnife.bind( this ) ;可能各位读者在写的时候不怎么会去细分模块,但是如果是设计一个注解库的话,应该是将这两块分开,一个是为了方面模块化开发,另一个方面是后面所要开发的注解器的模块库要基于注解库。

  • 编译中:

这里写图片描述

在编译的这个过程中,我们的注解处理器就发挥作用了,它会对 Activity 扫描,然后进行信息提取与处理,最后拼接出来一个代理类,同样的,我们的注解处理器应该也是一个单独区分于注解模块和 API 模块的一个新的模块,所以来说一共需要三个模块来进行开发,分别是 API 模块,用来暴露给用户进行使用;注解模块,虽然也是暴露给用户使用,但是应该区分于 API 模块,各司其职;注解处理器模块,对用户进行屏蔽,模块作用仅为在编译器为使用了注解的 Activity 生成代理类。

  • 编译后:

这里写图片描述

一直未说到代理类和 API 模块的作用,实际上 API 模块就是对生成的代理类进行操作,以此来到达我们所想要的目的,例如 ButterKnife.bind( this ) ; ,通俗点说实际上就是在相应的代理类中调用了 findViewById() 方法,那么该代理类是如何将findViewById()@BindView 一一对应起来的呢?不好意思笔者不知道,因为笔者没看过 Butterknife 的源码。但是笔者可以告诉你 Permissions4M 是如何将权限回调函数与 @PermissionsGranted@PermissionsDenied@PermissionsRationale 一一对应起来的。

permissions4m-annotation

在 Android Studio 中点击菜单左上角 File -> New -> Module,选择 java module,为什么选择 java module?前期提到,这个库中仅涉及到所使用到的注解,所以 java 类型的库已经可以满足我们的所有需求,并不需要使用 android library,否则涉及到多余的资源文件反而使得我们的库大小会更大,permissions4m-annotation module 截图如下:

这里写图片描述

前四个注解可以归为一类,分别是自定义权限二次申请回调、权限拒绝时回调、权限通过时回调和权限二次申请回调。这里拿出 PermissionsGranted 为各位读者解答下:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface PermissionsGranted {
    int[] value();
}

虽然前期笔者提到希望各位读者具有一点注解基础,但是笔者还是在这里啰嗦一下,我们需要使用 @Retention(RetentionPolicy.CLASS) 注解和 @Target(ElementType.METHOD) 标记我们的注解接口,前者是将接口相关信息只保留到 .class 时期,后者是表明接口修饰的对象是方法。而接口中 int[] value() 是什么意思呢?它的意思就是如果我们这样使用 @PermissionsGranted 注解是

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值