コンポーネント化開発とルーティングフレームワークの理解
コンポーネント化と実装アセンブリ化 コンポーネント化の意味 コンポーネント化された統合導入-Gradle構成 ルーティング コンポーネント化サブモジュールインタラクション方式 他の人はどのように問題を処理します ルーティングのパラメータ伝達機能 ルーティングコンポーネントローカルピクチャ、データ、その他の方法の通信実装 Alibaba.Arouter分析
コンポーネント化
コンポーネント化の意味プロジェクトがコンポーネント化されていない場合: 1.プロジェクトは階層感がなく、ますます大きくなって、管理できない 2.コードの繰り返しが多すぎて高結合 3.単独で開発することはできず、衝突を合併する必要がある.
したがってコンポーネント化の意味: 1.階層独立 2.再利用、高度デカップリング 3.フリーアセンブリフリー取り外し コンポーネント化とモジュール化の違い コンポーネント化多重化のために分割され、モジュール化はトラフィック分離のために分割される.
コンポーネント化された統合導入-Gradle構成 a.パッケージ名とリソース名の競合 b.バージョン番号統一管理 c.コンポーネントとアプリケーションとの間の切り替え d.インベントリファイル区分 ルート
コンポーネント化されたサブモジュールインタラクション
思考集中方式実現:方式1:EventBusを使用し、欠点:多すぎるbean方式2:放送を使用する欠点:少ない使用方式3:暗黙的な意図:欠点:配置が面倒すぎる
方式四:クラスロード方式の欠点を使用して、クラス名を書き間違えた.
方式5:グローバルMap方式問題:java反射メカニズムにおけるclass.forNameとclassloaderの違い 1.class.forName()はクラスを除く.classファイルはjvmにロードされるほか、クラスを解釈し、クラスのstaticブロックを実行します.もちろん、静的ブロック を実行するか否かを指定することもできる. 2.classLoaderはただ一つのことをします.classファイルはjvmにロードされ、staticの内容は実行されず、newInstanceでのみstaticブロックが実行されます.
他人が問題をどう処理するか
原理:Arouterはルーティングテーブルのようにパケットとパスを登録し、ルーティングテーブルに検索してインタラクティブにする
2つのクラスを生成し、1つのクラスのHashMap、keyはgroup、valueはグループの下のクラスである.このクラスHashMap、keyはpathで、具体的な経路を保存します
予備点:javaレベルのツール、コンパイラ作業、グローバル注釈のスキャン
名前
さぎょう
APT
Annotation Processing Tool
ルールに基づいて、コード、クラスファイルを生成します.
JavaPoet
対象思惟OOP:まず书き方をクラスの中に入れて、それからバッグの中に舍てるという逆順の方法
ARouterはApt技術により,保存パス(ルーティングパス)と被注釈(@Router)のコンポーネントクラスのマッピング関係のクラスを生成し,これらのマッピング関係を保存したクラスを利用して,Arouterはユーザの要求postcard(はがき)に従ってジャンプする宛先アドレス(class)を探し,Intentを用いてジャンプする.
運転時注記反射処理XUtil
コンパイラ注記反射処理EventBus-従来方式1行1行Dagger 2 Room aliba/Arouter-javapoet ButterKnife-javapoet優雅DataBinding
ルーティングのパラメータ伝達機能
ルーティングコンポーネントのローカルピクチャ、データ、その他の方法の通信実装 を定義する. に渡す.他の任意のモジュールまたはコンポーネントは、 であることができる.
Alibaba.Arouter分析外部URLから内部ページへのマッピング、およびパラメータ伝達と解析 .モジュールページ間ジャンプ、モジュール間デカップリング ジャンププロセスをブロックし、登録、埋め込み点などの論理 を処理する.はモジュールAPIにまたがって呼び出し、制御反転によってコンポーネントデカップリング を行う.
Arouterの最適化:ASMバイトコード挿入杭:設計はすべてのclassesを遍歴する.dex、すべてのソースコード、二重にキャッシュに遍歴して、とても時間がかかります;
NativeとH 5の問題:H 5ではStartActivity()を使用してNativeページにジャンプできないため、NativeからH 5ページにジャンプしてもブラウザを構成することでしか実現できません.
1.わかりやすく全面的
2.オープンソースベストプラクティス
3.中国語ARouter使用API
4.最も詳細なARouterソース分析
5.Gradleカスタムプラグイン、熱修復asmバイトコード挿入杭
コンポーネント化
コンポーネント化の意味
コンポーネント化された統合導入-Gradle構成
コンポーネント化されたサブモジュールインタラクション
思考集中方式実現:方式1:EventBusを使用し、欠点:多すぎるbean方式2:放送を使用する欠点:少ない使用方式3:暗黙的な意図:欠点:配置が面倒すぎる
<intent-filter>
<action android:name="com.example.android.tst.SecondActivity"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
Intent intent=new Intent("com.example.android.tst.SecondActivity");
方式四:クラスロード方式の欠点を使用して、クラス名を書き間違えた.
Class activityClass= Class.forName(""); class
new Intent(this,activityClass);
方式5:グローバルMap方式
を使って自分で各クラスに行ってすべてApplicationで手動でmapに登録しなければならなくて、メンテナンスしにくくて、何百行もします;他人が問題をどう処理するか
原理:Arouterはルーティングテーブルのようにパケットとパスを登録し、ルーティングテーブルに検索してインタラクティブにする
2つのクラスを生成し、1つのクラスのHashMap、keyはgroup、valueはグループの下のクラスである.このクラスHashMap、keyはpathで、具体的な経路を保存します
予備点:javaレベルのツール、コンパイラ作業、グローバル注釈のスキャン
名前
さぎょう
APT
Annotation Processing Tool
ルールに基づいて、コード、クラスファイルを生成します.
JavaPoet
対象思惟OOP:まず书き方をクラスの中に入れて、それからバッグの中に舍てるという逆順の方法
ARouterはApt技術により,保存パス(ルーティングパス)と被注釈(@Router)のコンポーネントクラスのマッピング関係のクラスを生成し,これらのマッピング関係を保存したクラスを利用して,Arouterはユーザの要求postcard(はがき)に従ってジャンプする宛先アドレス(class)を探し,Intentを用いてジャンプする.
Group: key=="app" value="ARouter$$Path$$app" --------- /app/MainActivity
Path: key=="/app/MainActivity" value="MainActivity.class RouterBean"
:Group
public class ARouter$$Group$$personal implements ARouterGroup {
@Override
public Map<String, Class<? extends ARouterPath>> getGroupMap() {
Map<String, Class<? extends ARouterPath>> groupMap = new HashMap<>();
groupMap.put("personal", ARouter$$Path$$personal.class);
return groupMap;
}
}
:Path
public class ARouter$$Path$$personal implements ARouterPath {
@Override
public Map<String, RouterBean> getPathMap() {
Map<String, RouterBean> pathMap = new HashMap<>();
pathMap.put("/personal/Personal_Main2Activity", RouterBean.create();
pathMap.put("/personal/Personal_MainActivity", RouterBean.create());
return pathMap;
}
}
運転時注記反射処理XUtil
コンパイラ注記反射処理EventBus-従来方式1行1行Dagger 2 Room aliba/Arouter-javapoet ButterKnife-javapoet優雅DataBinding
// AutoService ,
// auto-service @AutoService AutoService ,
// META-INF/services/javax.annotation.processing.Processor
@AutoService(Processor.class)
// / ,
@SupportedAnnotationTypes({
ProcessorConfig.AROUTER_PACKAGE})
// JDK
@SupportedSourceVersion(SourceVersion.RELEASE_7)
//
@SupportedOptions({
ProcessorConfig.OPTIONS, ProcessorConfig.APT_PACKAGE})
public class ARouterProcessor extends AbstractProcessor {
// Element ( , , , Element)
private Elements elementTool;
// type( ) , TypeMirror
private Types typeTool;
// Message
private Messager messager;
// , , Filer
private Filer filer;
private String options;
// , Activity onCreate
@Override
public synchronized void init(ProcessingEnvironment processingEnvironment) {
super.init(processingEnvironment);
elementTool = processingEnvironment.getElementUtils();
messager = processingEnvironment.getMessager();
filer = processingEnvironment.getFiler();
// App , APT
options = processingEnvironment.getOptions().get(ProcessorConfig.OPTIONS);
String aptPackage = processingEnvironment.getOptions().get(ProcessorConfig.APT_PACKAGE);
messager.printMessage(Diagnostic.Kind.NOTE, ">>>>>>>>>>>>>>>>>>>>>> options:" + options);
messager.printMessage(Diagnostic.Kind.NOTE, ">>>>>>>>>>>>>>>>>>>>>> aptPackage:" + aptPackage);
if (options != null && aptPackage != null) {
messager.printMessage(Diagnostic.Kind.NOTE, "APT ....");
} else {
messager.printMessage(Diagnostic.Kind.NOTE, "APT , options aptPackage null...");
}
}
/**
* main ,
* , , Java
*
* @param set
* @param roundEnvironment , 。
* @return true ( )
*/
@Override
public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
if (set.isEmpty()) {
messager.printMessage(Diagnostic.Kind.NOTE, " @ARouter ");
return false;
}
// @ARouter
Set<? extends Element> elements = roundEnvironment.getElementsAnnotatedWith(ARouter.class);
//
for (Element element : elements) {
// , (com.xiangxue.xxxxxx)
String packageName = elementTool.getPackageOf(element).getQualifiedName().toString();
// , :MainActivity
String className = element.getSimpleName().toString();
messager.printMessage(Diagnostic.Kind.NOTE, ">>>>>>>>>>>>>> @ARetuer :" + className); // APT
// JavaPoet
/**
* package com.example.helloworld;
*
* public final class HelloWorld {
* public static void main(String[] args) {
* System.out.println("Hello, JavaPoet!");
* }
* }
*/
// , 【 】
// 1.
/*MethodSpec mainMethod = MethodSpec.methodBuilder("main")
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
.returns(void.class)
.addParameter(String[].class, "args")
.addStatement("$T.out.println($S)", System.class, "Hello, JavaPoet!")
.build();
// 2.
TypeSpec helloWorld = TypeSpec.classBuilder("HelloWorld")
.addModifiers(Modifier.PUBLIC, Modifier.FINAL)
.addMethod(mainMethod)
.build();
// 3.
JavaFile packagef = JavaFile.builder("com.derry.study", helloWorld).build();
//
try {
packagef.writeTo(filer);
} catch (IOException e) {
e.printStackTrace();
messager.printMessage(Diagnostic.Kind.NOTE, " , ...");
}*/
// JavaPoet , ---> --> ,
/*
package com.example.helloworld;
public final class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, JavaPoet!");
}
}
*/
//
MethodSpec mainMethod = MethodSpec.methodBuilder("main")
.addModifiers(Modifier.PUBLIC, Modifier.FINAL)
.returns(void.class)
.addParameter(System[].class, "args")
// main
.addStatement("$T.out.println($S)", System.class, "AAAAAAAAAAA!")
.build();
//
TypeSpec testClass = TypeSpec.classBuilder("Test")
.addMethod(mainMethod)
.addModifiers(Modifier.PUBLIC, Modifier.FINAL)
.build();
//
// Program type already present: com.xiangxue.test22.Test
JavaFile packagef = JavaFile.builder("com.xiangxue.test22", testClass).build();
try {
packagef.writeTo(filer);
} catch (IOException e) {
e.printStackTrace();
messager.printMessage(Diagnostic.Kind.NOTE, " Test , :" + e.getMessage());
}
}
return true; // : , @ARouter
}
}
ルーティングのパラメータ伝達機能
@paramter
String name; //
public class Personal_MainActivity$$Parameter implements ParameterGet {
@Override
public void getParameter(Object targetParameter) {
Personal_MainActivity t = (Personal_MainActivity) targetParameter;
t.name = t.getIntent().getStringExtra("name");
t.sex = t.getIntent().getStringExtra("sex");
}
}
ルーティングコンポーネントのローカルピクチャ、データ、その他の方法の通信実装
common
において、特定の業務標準規則
は、特定の構成要素
Alibaba.Arouter分析
Arouterの最適化:ASMバイトコード挿入杭:設計はすべてのclassesを遍歴する.dex、すべてのソースコード、二重にキャッシュに遍歴して、とても時間がかかります;
NativeとH 5の問題:H 5ではStartActivity()を使用してNativeページにジャンプできないため、NativeからH 5ページにジャンプしてもブラウザを構成することでしか実現できません.
1.わかりやすく全面的
2.オープンソースベストプラクティス
3.中国語ARouter使用API
4.最も詳細なARouterソース分析
5.Gradleカスタムプラグイン、熱修復asmバイトコード挿入杭