声明:下载反编译软件(这里主要使用jd-gui.exe打开对应的jar即可),不必深入使用,对反编译有兴趣的可以深入研究。
附:反编译软件目录(加固软件需要脱壳):
apktool(解压apk)、
dex2jar(将解压的dex.classes转化为jar)、
jd-gui(打开对应的jar)、
jeb(暂未使用)、
IDA(反编译.so文件)。
1、通过plugin写代码:eg:butterKnife-Zelezny、GsonFormat等。
查看方式:通过反编译软件jd-gui打开jar包(路径eg:C:\Users\Administrator\.AndroidStudio3.3\config\plugins\android-butterknife-zelezny.jar)。
原理:主要是通过javaPlugin技术实现项目编写代码自动化书写(也就是在已完成代码的前提下,再书写某些重复性或者说类似的代码时通过插件一键生成。):
AnAction的子类为主程序入口,同时需要在plugin.xml中声明;
然后通过书写一套类似的Android界面化API生成的界面来确定用户需求,然后根据不同的选择按既定的规则生成目标的代码。
优点:没有侵入性;
缺点:灵活性不够(但是因为其是为特定代码而设计,扯不上什么灵活性,也只是相对模板来说灵活性不够); 需要学习和熟悉新的API。
2、通过模板生成代码(这是AndroidStudio自身生成代码的方式)。
查看方式(均为AndroidStudio自动菜单的模板):C:\Program Files\Android\Android Studio\plugins\android\lib\templates;
优点:参考这种方式,可以快速的生成自己所需要的业务代码模板(在对应目录下,参考EmptyActivity,BlankActivity等包可以快速生成自己的业务代码模板,另外可以参考MVPArmsTemplate的实现方式);看过模板就会自己写,不需要额外学习即可书写,足够灵活方便快捷。
缺点:但是每次AndroidStudio更新都可能被AndroidStudio删除掉。需要手动保存。
3、通过apt(Annotation Processing Tool)技术eg:butterKnife、dragger等
查看方式(需要先在项目里添加依赖编译,butterKnife为例):C:\Users\Administrator\.gradle\caches\modules-2\files-2.1\com.jakewharton\butterknife-compiler\10.1.0\4963d03eb222d3352fe1f17b2625ae4f1b6ac7fb\butterknife-compiler-10.1.0.jar
实现原理:主入口AbstractProcess子类,通过编译时将带有特定声明的Annotation(eg:@BindView)编译到build文件中(目录:app\build\generated\source\apt查看,类似反射实现),生成对应的可运行的XXActivity_ViewBinding文件(核心JavaFile类),在通过ButterKnife.bind(this)实现对应资源的绑定。这一切实现是无知觉的唯一需要手动声明注解、绑定时机等(ButterKnife可以通过plugin一键生成,dragger好像没有)。
优点:实现解耦。
缺点:需要学习新的API(API与反射有诸多相似)。
题外话:Annotation这个东西就是一个标签,类似额外的一个分类标记。当然这个标记是可以被使用的,但是得额外得代码 去为它添加功能。如果没有代码去实现,标记本身是没有任何功能得。