コンポーネント化開発とルーティングフレームワークの理解


コンポーネント化と実装
  • アセンブリ化
  • コンポーネント化の意味
  • コンポーネント化された統合導入-Gradle構成
  • ルーティング
  • コンポーネント化サブモジュールインタラクション方式
  • 他の人はどのように問題を処理します
  • ルーティングのパラメータ伝達機能
  • ルーティングコンポーネントローカルピクチャ、データ、その他の方法の通信実装
  • Alibaba.Arouter分析


  • コンポーネント化
    コンポーネント化の意味
  • プロジェクトがコンポーネント化されていない場合:
  • 1.プロジェクトは階層感がなく、ますます大きくなって、管理できない
  • 2.コードの繰り返しが多すぎて高結合
  • 3.単独で開発することはできず、衝突を合併する必要がある.

  • したがってコンポーネント化の意味:
  • 1.階層独立
  • 2.再利用、高度デカップリング
  • 3.フリーアセンブリフリー取り外し
  • コンポーネント化とモジュール化の違い
  • コンポーネント化多重化のために分割され、モジュール化はトラフィック分離のために分割される.


  • コンポーネント化された統合導入-Gradle構成
  • a.パッケージ名とリソース名の競合
  • b.バージョン番号統一管理
  • c.コンポーネントとアプリケーションとの間の切り替え
  • d.インベントリファイル区分
  • ルート
    コンポーネント化されたサブモジュールインタラクション
    思考集中方式実現:方式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に登録しなければならなくて、メンテナンスしにくくて、何百行もします;
  • 問題: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を用いてジャンプする.
    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分析
  • 外部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バイトコード挿入杭