アンドロイドでそれらのものAPTとAOP
ビジネスの背景
それは、eventbusを受信し、切断を送信して、設計モードでは、オブザーバーパターンにいくらか類似非常に良好なイベントバスフレームであるが、観察モードのアップグレードバージョンeventbusに不慣れであってはならない多くを解決します頭痛メモリリークが尋ねました。これでは技術は、我々は、プロジェクト内のObserverパターンを使用する必要がある場合は、それを改善するために使用eventbusに望むことは、apt使用eventbusです。
統計的な時間がかかり、OnCreateイベントであるにビジネスシナリオ、ビジネスの立ち上げ活動を想像してみて、ONSTARTこれらのメソッドのライフサイクルを取った、原始的な方法は、次のような、ライフサイクルのすべての活動に重複したコードを追加することです:
@Override
protected void onCreate(Bundle savedInstanceState) {
long start=System.currentTimeMillis();
super.onCreate(savedInstanceState); //1
setContentView(R.layout.activity_main);
long spend=System.currentTimeMillis()-start; //2
}
アクティビティそんなにライフサイクルを考え、アンドロイドプロジェクトそんなに活動は、それが非常に複雑ではありません。唯一の新しいクラスを作成することができますが、現在のクラスのコードを追加および削除することはできません。なぜグーグル自身の息子のaptのaptが比較的大きな制限があるので、外観上のこの時間はAOP。単純に一般化はAOPである傾向よりも強力なコード生成フレームワークです。
簡単な紹介
- APT:(注釈処理ツール)即ちプロセッサ注釈は、注釈処理ツールは、コンパイラスキャンと注釈を処理するために使用されます。事前定義されたルールにより、対応するコードを生成するためのブリッジとしてのJavaコード注釈
- AOP:アスペクト指向プログラミングを:AOPを意味し、アスペクト指向プログラミングの略です。だからここに実際にアイデアを表現され、技術のこのアイデアは実現しています:AspectJの、ASM、JAVASIST、三つの主要派閥
##の比較を
能力 | APT | AOP |
---|---|---|
新しいクラスを作成します。 | と | と |
現在のクラスを変更します。 | n個 | と |
実装技術 | オートサービス | AspectJの、ASM、JAVASIST |
コメント | と | と |
SDKのコードの変更 | n個 | と |
アンドロイドパッキングプロセス
グラフでは、コンパイラのステージは、実際からなる変換たくさんあります
其中apt,aop都是作用于compilers阶段apt作用于class -->.dex阶段,aop作用于class-->.dex或者jar-->.dex阶段。可以进一步看到aop更加强大
使用小建议
apt,aop虽然能够减少很多重复代码量,代码结构优化,但是也看出来了,没有源代码,不利于排查问题,所以使用者一定要克制,不是这两个技术很黑科技就喜欢去使用,否则就是给自己的项目埋下风险。同学编写这些apt,aop代码的同学一定要留够足够的调试信息,方便后续的问题追踪
细讲apt
其实网络上已经有很多优秀apt的案例,就不想重复的编写这个demo.贴一个推荐的案例
apt案例
细讲aop
用来动态生成类或者增强既有类的功能,ASM是可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为,底层字节码框架,操纵的级别是底层JVM的汇编指令级别,这要求ASM使用者要对class组织结构和JVM汇编指令有一定的了解。
总体思路讲解
- 注册transform,接收编译阶段代码的输入,这里主要有class和jar包
- 使用java的jarfile接口解析jar包,并且获得jar包里面的class文件
JarFile jarFile = new JarFile(inFile)
Enumeration<JarEntry> entries = jarFile.entries()
- 使用asm借口解析jar包里面的class,更改自己想要的代码操作,建议使用asm5版本,gradle默认会有这个sdk,无需集成,示例:
ClassReader reader = new ClassReader(entryBytes)
ClassWriter classWriter = new ClassWriter(reader, ClassWriter.COMPUTE_MAXS);
ClassVisitor visitor = new MyClassVisitor(classWriter)
- 无论更改与否jar包或者class,都要将文件拷贝到下一个输入位置,参考示例:
File outFile = transformInvocation.outputProvider.getContentLocation(
jarInput.file.absolutePath,
jarInput.contentTypes,
jarInput.scopes,
Format.JAR)
FileUtils.copyFile(jarInput.file, outFile)
网上有一个非常好的讲解,并且有示例源码:
案例
aspectj是通过注解来实现aop的切面方案,也是最容易上手的一个方案
案例
总结
上面的讲究都是引用了其他人的讲解成果,后面会输出个人编写demo的文章,更加细致的讲解aop这块,当然估计可能没有我现在所引用的案例优秀,透彻。
私はまた、最初の手の情報バックの優先順位ここで公開されているすべての私の記事についての個別の公共に焦点を歓迎し、私の言葉はあなたに助けをもたらすことを願って。
個人公開番号:川の暗い部屋