简要理解AbstractProcessor是什么可以参考:blog.csdn.net/industriously/article/details/53932425
首先先创建一个项目命名PermissionHelper,添加一个基础Activity即可。其次项目根目录右键新建一个module
选择java Library我们暂且命名为compiler,

上一步完成后,还要再新建一个Java Library我们暂且命名为annotation,顾名思义,注解的module
并且在【annotation】module新建三个注解分别为:



接着我们要把【annotation】作为【compiler】的依赖库,并添加google提供了一个注册处理器的库
compile ‘com.google.auto.service:auto-service:1.0-rc2‘

新建PermissionProcessor,在类名配置@AutoService(Processor.class) ,这属于编译时处理器标配吧

初始化得到元素操作类,日志输出工具

接下来是告诉处理器声明我们需要处理的注解类型

然后是告诉处理器支持的资源版本号,一贯就是latestSupported()

然后是分别处理我们自定义的三个注解,得到注解标致的value值也就是权限requestCode和声明的方法名,装载到mProxyMap集合中
代码中的roundEnv.getElementsAnnotatedWith返回的其实就是每个注解所标注的方法元素集合,是可以强转为ExecutableElement的
element有多个子集,介绍几个常见的
TypeElement------类型元素,注意枚举对应的时类,注解对应的接口
ExecutableElement------一般是指可执行的方法元素
VariableElement------一般指常量,变量 ,异常对象元素
pakeageElement-----一般指包元素,可以获得包信息
TypeParamterElement----这个也是比较常用的,一般指继承类实现的接口,或者泛型对象元素

最后就是把三个注解标记的方法以及requestCode 以key-value装在到map集合后,开始对每个以类名为key的proxyInfo执行文件写入

然后看一下proxyInfo这个类,他就是封装了一下 代码写入文件的工作,我们的代码自动写入工作就完成了

还没完,我们还没写权限怎么申请的呢,O(∩_∩)O哈哈~,项目根目录右键new mudule--->android library,我们命名为libpermission
并引入【annotation】作为依赖库,新建PermissionProxy接口,目的是为了ProxyInfo中的代码写入文件时 的implements实现


最后写一个权限申请的的流程

需要在activity或者fragment的onPermissionRequestReresult中回调过来,可以封装到baseActivity

权限申请回调过来后,我们要手动反射加载手动写入代码的类

![]()
最后,也就是去执行
最后上一张运行时GIF

github传送门:github.com/mrme2014/PermissionHelper
网友评论