_Android原生开发 APT制作重复打点检测工具(1)

其他团队做广告模块的同学不知道10007和10008字段被占用了.继续申明了

/**

  • 广告打开次数
    */
    public static final int COUNT_KEY_AD = 10008;

这个时候字段10008就被污染了,广告打开次数和页面2打开次数就无法准确统计到.

实际工作中,2个场景容易出现上诉事故.

  1. 多个程序员并行开发打点需求,代码合并的时候自动合并了打点文件.
  2. 不同模块之间打点,不知道对方模块已经使用了什么字段.

期望有个工具可以检测重复定义的字段

解决思路

转化为语法错误

iOS同学可以利用enum的语法特性+协议来解决.实例示例代码如下:

enum Model: Int: ModelProtocol {
case home = 11
case sounds = 12

public func toCode() -> Int64 {
self.rawValue
}
}

enum SleepPlan: Int64, EventCodeProtocol {
var model: Model {
return .home
}
case click = 0001
case show = 0002

public func toCode() -> Int64 {
self.rawValue
}

public func type() -> EventTypeCode {
.count
}
public func immediately() -> Bool {
true
}
}

protocol ModelProtocol {
func toCode() -> Int64
}

extension EventCodeProtocol {
var model: ModelProtocol
}

func log(code: EventCodeProtocol) {
code.model.toCode() * 1000 + code.toCode()
}

交流了下实现原理,就是让定义重复打点的时候触发一次编译器语法错误,让编译失败,从而让开发人员知道有字段重复定义了.

那么Android上怎么开发,Java可以利用switch…case…语法不能有重复字段申明的特性,把上诉问题转化为下面的代码

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 那么问题是: 怎么来实现这个校验函数?,如果自己手写的话耗时,耗力,还容易写错.

APT实现

比起手动去维护这个函数,APT的优势是可以自动生成从而不易出错.

参考ButterKnife、EventBus的实现后,总结APT的实现步骤大致如下:

1.申明注解

@Retention(RetentionPolicy.CLASS)
@Target(ElementType.TYPE)
public @interface Statistics {
Type type();

public enum Type {
String, Int
}
}

然后在原项目引用

@Statistics(type = Statistics.Type.Int)
public class StaticDemo2 {

这一步的目的是让APT知道需要处理哪些类.

2.构造处理函数

@AutoService(Processor.class)
public class StatisticsProcessor extends AbstractProcessor {
private Filer mFilerUtils; // 文件管理工具类
private Types mTypesUtils; // 类型处理工具类
private Elements mElementsUtils; // Element处理工具类
static Set typeSet = new HashSet<>();
private Map<Statistics.Type, List> dataMap = new HashMap<>();

@Override
public synchronized void init(ProcessingEnvironment processingEnv) {
super.init(processingEnv);

mFilerUtils = processingEnv.getFiler();
mTypesUtils = processingEnv.getTypeUtils();
mElementsUtils = processingEnv.getElementUtils();

}

@Override
public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnv) {
System.out.println(“start process”);
if (set != null && set.size() != 0) {
Set<? extends Element> elements = roundEnv.getElementsAnnotatedWith(Statistics.class);
categories(elements);
if (dataMap.size() > 0) {
Element simpleElement = elements.iterator().next();
String code = generateCode(simpleElement, dataMap.get(Statistics.Type.String), dataMap
.get(Statistics.Type.Int));
String helperClassName = “StatisticsChecker”; // 构建要生成的帮助类的类名
try {
JavaFileObject jfo = mFilerUtils.createSourceFile(helperClassName);
Writer writer = jfo.openWriter();
writer.write(code);
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
return true;
}
}
return false;
}

private void categories(Set<? extends Element> elements) {
if (typeSet.size() == 0) {
Statistics.Type[] types = Statistics.Type.values();
for (int i = 0; i < types.length; i++) {
typeSet.add(types[i].name().toLowerCase());
}
}
for (Element element : elements) {
Statistics statistics = element.getAnnotation(Statistics.class);
Symbol.ClassSymbol cE = (Symbol.ClassSymbol) element;
String preName = cE.className();
List eleSubList = element.getEnclosedElements();

Statistics.Type type = statistics.type();
List list = dataMap.get(type);
if (list == null) {
list = new ArrayList();
dataMap.put(type, list);
}

for (Object e : eleSubList) {
if (e instanceof Symbol.VarSymbol) {
Symbol.VarSymbol el = (Symbol.VarSymbol) e;

分享读者

作者2013年java转到Android开发,在小厂待过,也去过华为,OPPO等大厂待过,18年四月份进了阿里一直到现在。

被人面试过,也面试过很多人。深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长,而且极易碰到天花板技术停滞不前!

我们整理了一份阿里P7级别的Android架构师全套学习资料,特别适合有3-5年以上经验的小伙伴深入学习提升。

主要包括腾讯,以及字节跳动,阿里,华为,小米,等一线互联网公司主流架构技术。

腾讯T3架构师学习专题资料

如果你觉得自己学习效率低,缺乏正确的指导,可以一起学习交流!

我们致力打造一个平等,高质量的Android交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。

35岁中年危机大多是因为被短期的利益牵着走,过早压榨掉了价值,如果能一开始就树立一个正确的长远的职业规划。35岁后的你只会比周围的人更值钱。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
来说,眼光,格局,长远发展的方向才是最重要的。

35岁中年危机大多是因为被短期的利益牵着走,过早压榨掉了价值,如果能一开始就树立一个正确的长远的职业规划。35岁后的你只会比周围的人更值钱。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  • 22
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值