Android 組件化】使用 ARoute 實現組件化 ( 完整組件化項目框架 )

      網友投稿 1070 2025-04-01

      文章目錄

      一、ARoute 引入

      二、3 個模塊的界面跳轉

      1、app 模塊注解、app 跳轉到 module1 模塊

      2、module1 模塊注解、module1 跳轉到 module2 模塊

      3、module2 模塊注解、module2 跳轉到 app 模塊

      4、跳轉效果

      三、組件化配置

      1、全局配置

      2、工程下的 build.gradle 配置

      3、app 模塊下的 build.gradle 配置

      四、Module 模塊的組件化配置

      1、創建組件模式下使用的類和清單文件

      2、動態切換 集成模式 / 組件模式

      3、module1 完整的 build.gradle 配置文件

      4、module2 完整的 build.gradle 配置文件

      5、module1 獨立運行效果

      6、module2 獨立運行效果

      五、博客資源

      組件化系列博客 :

      【Android 組件化】從模塊化到組件化

      【Android 組件化】使用 Gradle 實現組件化 ( Gradle 變量定義與使用 )

      【Android 組件化】使用 Gradle 實現組件化 ( 組件模式與集成模式切換 )

      【Android 組件化】使用 Gradle 實現組件化 ( 組件 / 集成模式下的 Library Module 開發 )

      【Android 組件化】路由組件 ( 路由組件結構 )

      【Android 組件化】路由組件 ( 注解處理器獲取被注解的節點 )

      【Android 組件化】路由組件 ( 注解處理器中使用 JavaPoet 生成代碼 )

      【Android 組件化】路由組件 ( 注解處理器參數選項設置 )

      【Android 組件化】路由組件 ( 構造路由表中的路由信息 )

      【Android 組件化】路由組件 ( 使用 JavaPoet 生成路由表類 )

      【Android 組件化】路由組件 ( 組件間共享的服務 )

      【Android 組件化】路由組件 ( 生成 Root 類記錄模塊中的路由表 )

      【Android 組件化】路由組件 ( 運行時獲取 注解處理器 生成的路由表 )

      【Android 組件化】路由組件 ( 路由框架概述 )

      【Android 組件化】路由組件 ( 頁面跳轉參數依賴注入 )

      一、ARoute 引入

      使用 ARouter 第三方庫實現組件化 : https://github.com/alibaba/ARouter

      ARoute 是阿里的開源庫 ;

      創建項目 , 項目中有 3 3 3 個 Module , 1 1 1 個主模塊 app , 2 2 2 個依賴庫 module1 和 module2 ;

      在 app , module1 , module2 , 3 3 3 個模塊的 build.gradle 中 , 都要進行如下配置 ;

      在 build.gradle 下的 " android / defaultConfig " 層級添加配置 :

      android { defaultConfig { ... javaCompileOptions { annotationProcessorOptions { arguments = [AROUTER_MODULE_NAME: project.getName()] } } } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      在 build.gradle 下的 " dependencies " 層級添加 ARoute 依賴 :

      // 替換成最新版本, 需要注意的是api // 要與compiler匹配使用,均使用最新版可以保證兼容 api 'com.alibaba:arouter-api:1.5.1' annotationProcessor 'com.alibaba:arouter-compiler:1.5.1'

      1

      2

      3

      4

      3 3 3 模塊間的依賴關系 : app 模塊依賴剩余兩個模塊 , 模塊之間不發生依賴關系 ;

      implementation project(path: ':module1') implementation project(path: ':module2')

      1

      2

      二、3 個模塊的界面跳轉

      1、app 模塊注解、app 跳轉到 module1 模塊

      app 模塊 : 使用 @Route(path = "/app/MainActivity") 注解標注 Activity 類 , 界面按鈕點擊方法跳轉到 module1 中的 Activity 界面中 ;

      代碼示例 :

      package kim.hsl.component; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import com.alibaba.android.arouter.facade.annotation.Route; import com.alibaba.android.arouter.launcher.ARouter; // 在支持路由的頁面上添加注解(必選) // 這里的路徑需要注意的是至少需要有兩級,/xx/xx @Route(path = "/app/MainActivity") public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void onClick(View view) { Log.i(TAG, "跳轉到 Module1"); ARouter.getInstance().build("/module1/Module1Activity").navigation(); finish(); } }

      1

      2

      3

      4

      5

      6

      【Android 組件化】使用 ARoute 實現組件化 ( 完整組件化項目框架 )

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      2、module1 模塊注解、module1 跳轉到 module2 模塊

      module1 模塊跳轉到 module2 模塊 , 這兩個模塊之間互相沒有依賴關系 ;

      module1 模塊使用 @Route(path = "/module1/Module1Activity") 注解標注 ,

      代碼示例 :

      package kim.hsl.module1; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import com.alibaba.android.arouter.facade.annotation.Route; import com.alibaba.android.arouter.launcher.ARouter; @Route(path = "/module1/Module1Activity") public class Module1Activity extends AppCompatActivity { private static final String TAG = "Module1Activity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_module1); } public void onClick(View view) { Log.i(TAG, "跳轉到 Module2"); ARouter.getInstance().build("/module2/Module2Activity").navigation(); finish(); } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      3、module2 模塊注解、module2 跳轉到 app 模塊

      代碼示例 :

      package kim.hsl.module2; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import com.alibaba.android.arouter.facade.annotation.Route; import com.alibaba.android.arouter.launcher.ARouter; @Route(path = "/module2/Module2Activity") public class Module2Activity extends AppCompatActivity { private static final String TAG = "Module2Activity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_module2); } public void onClick(View view) { Log.i(TAG, "跳轉到 app"); ARouter.getInstance().build("/app/MainActivity").navigation(); finish(); } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      4、跳轉效果

      三、組件化配置

      1、全局配置

      全局配置 :

      isModuleMode 是最終要的配置 , 通過該配置的 true / false 設置當前是否開啟組件化 ,

      集成模式 true ( 默認模式 , 模塊化 )

      組件模式 false ( 組件化 )

      androidConfig 用于統一管理各個 Module 中的版本號 , 如編譯版本號 , 最小版本號 , 目標版本號 ;

      applicationId 用于保存各個模塊的包名 , 尤其是 module 依賴庫的包名 , 組件化的狀態下 , 該 module 需要獨立運行 , 必須配置一個 applicationId 包名 ;

      dependencies 用于統一管理各個模塊之間的依賴庫 , 避免管理分散 ;

      // ext 是 extension 擴展的含義 // ext 后的 {} 花括號 , 是閉包 , ext{ // 是否是模塊化模式 // 集成模式 true ( 默認模式 , 模塊化 ) // 組件模式 false ( 組件化 ) isModuleMode = true // 定義 android 變量 , 類型是字典 Map 集合 // 其中定義了若干鍵值對集合 androidConfig = [ compileSdkVersion : 30, minSdkVersion : 18, targetSdkVersion : 30, versionCode : 1, versionName : "1.0" ] applicationId = [ "app" : "kim.hsl.component", "module1" : "kim.hsl.module1", "module2" : "kim.hsl.module2", ] // androidx 版本號 androidxVersion = "1.3.0" constraintlayoutVersion = "2.0.4" materialVersion = "1.3.0" // 統一管理依賴庫 dependencies = [ // ${} 表示引用之前定義的變量 "appcompat" : "androidx.appcompat:appcompat:${androidxVersion}", "constraintlayout" : "androidx.constraintlayout:constraintlayout:${constraintlayoutVersion}", "material" : "com.google.android.material:material:${materialVersion}" ] }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      2、工程下的 build.gradle 配置

      在總的 build.gradle 配置中 , 引入上述全局配置 , 其作用就相當于將上述全局配置原封不動拷貝過來 ;

      apply from: "component.gradle"

      1

      完整配置 :

      // Top-level build file where you can add configuration options common to all sub-projects/modules. // 將 component.gradle 配置文件中的內容導入到該位置 // 相當于引入頭文件 apply from: "component.gradle" buildscript { repositories { google() jcenter() } dependencies { classpath "com.android.tools.build:gradle:4.1.0" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { google() jcenter() } } task clean(type: Delete) { delete rootProject.buildDir }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      3、app 模塊下的 build.gradle 配置

      在 app 模塊中重點關注 , 在組件模式下 , 一定不能引入依賴庫 , 否則會報錯 , 因為組件模式下這兩個依賴庫是兩個可運行的獨立應用 ;

      dependencies { if (isModuleMode){ // 集成模式下才能引用這兩個 Library Module implementation project(path: ':module1') implementation project(path: ':module2') } }

      1

      2

      3

      4

      5

      6

      7

      版本號 , applicationId , 依賴庫 統一管理 :

      從 Project 級別的配置中獲取變量 :

      def androidConfig = rootProject.ext.androidConfig def appId = rootProject.ext.applicationId def dep = rootProject.ext.dependencies

      1

      2

      3

      版本號 和 applicationId 統一管理 :

      android { compileSdkVersion androidConfig.compileSdkVersion defaultConfig { applicationId appId["app"] minSdkVersion androidConfig.minSdkVersion targetSdkVersion androidConfig.targetSdkVersion versionCode androidConfig.versionCode versionName androidConfig.versionName }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      依賴庫統一管理 :

      dependencies { //implementation 'androidx.appcompat:appcompat:1.3.0' //implementation 'androidx.constraintlayout:constraintlayout:2.0.4' //implementation 'com.google.android.material:material:1.3.0' implementation dep.appcompat implementation dep.constraintlayout implementation dep.material }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      完整配置 :

      plugins { id 'com.android.application' } def androidConfig = rootProject.ext.androidConfig def appId = rootProject.ext.applicationId def dep = rootProject.ext.dependencies android { compileSdkVersion androidConfig.compileSdkVersion buildToolsVersion "30.0.3" defaultConfig { applicationId appId["app"] minSdkVersion androidConfig.minSdkVersion targetSdkVersion androidConfig.targetSdkVersion versionCode androidConfig.versionCode versionName androidConfig.versionName testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" // ARoute 需要的配置 javaCompileOptions { annotationProcessorOptions { arguments = [AROUTER_MODULE_NAME: project.getName()] } } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } dependencies { //implementation 'androidx.appcompat:appcompat:1.3.0' //implementation 'androidx.constraintlayout:constraintlayout:2.0.4' //implementation 'com.google.android.material:material:1.3.0' implementation dep.appcompat implementation dep.constraintlayout implementation dep.material testImplementation 'junit:junit:4.+' androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' // 替換成最新版本, 需要注意的是api // 要與compiler匹配使用,均使用最新版可以保證兼容 api 'com.alibaba:arouter-api:1.5.1' annotationProcessor 'com.alibaba:arouter-compiler:1.5.1' if (isModuleMode){ // 集成模式下才能引用這兩個 Library Module implementation project(path: ':module1') implementation project(path: ':module2') } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      40

      41

      42

      43

      44

      45

      46

      47

      48

      49

      50

      51

      52

      53

      54

      55

      56

      57

      58

      59

      60

      61

      62

      63

      64

      65

      66

      67

      四、Module 模塊的組件化配置

      Module 模塊的配置比較復雜 ;

      首先 , Module 模塊在組件模式下是可以獨立運行的應用 , 必須有一個入口 Activity ; 但是 Module 下的清單文件是這樣的 :

      1

      2

      3

      4

      5

      6

      7

      8

      9

      這就需要為其單獨配置一個清單文件 , 并且還要兼容在組件模式下能適用原來的這個清單文件 ;

      此外還需要為其配置 Application 類 , 需要為其單獨指定 Java 文件 , 并且在模塊化模式中 , 不使用該文件 ;

      1、創建組件模式下使用的類和清單文件

      在 module1 下創建 組件模式 時使用的 Application 類和清單文件 ;

      Application 類如下 :

      package kim.hsl.module1; import android.app.Application; public class Module1Application extends Application { @Override public void onCreate() { super.onCreate(); } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      清單文件如下 :

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      在 build.gradle 中 " android / defaultConfig / sourceSets " 下配置相關資源文件 , 如果在組件模式下 , 使用 manifest.srcFile 配置組件模式下的清單文件 , 使用 java.srcDirs 配置組件模式下使用的 Java 源文件 ;

      這些配置在 集成模式 下都失效 , 因此使用 isModuleMode 進行判定當前是 組件模式 還是 集成模式 ;

      android { defaultConfig { if (!isModuleMode){ // 組件模式 : 必須配置 applicationId applicationId appId["module1"] } // 資源配置 sourceSets{ main{ if (!isModuleMode){ // 組件化模式下使用 ComponentAndroidManifest.xml 作為清單文件 manifest.srcFile 'src/main/component/AndroidManifest.xml' // 配置額外的 Java 源文件目錄 java.srcDirs 'src/main/component/java', 'src/main/java' }else{ // 集成模式 下使用默認設置 } } } } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      2、動態切換 集成模式 / 組件模式

      在 module 中需要考慮 集成模式 / 組件模式 動態切換問題 , 當 isModuleMode 設置為 true 時 , 當前是集成模式 , module 模塊作為 app 模塊的依賴庫進行編譯 , 因此需要加載 apply plugin: 'com.android.library' 插件 ;

      當 isModuleMode 設置為 false 時 , 是 組件模式 , 每個 module 都是可以獨立運行的應用 , 需要加載 apply plugin: 'com.android.application' 插件 ;

      代碼示例 :

      // 根據 isModuleMode 動態切換 集成模式 / 組件模式 if (isModuleMode){ // 集成模式 apply plugin: 'com.android.library' }else{ // 組件模式 apply plugin: 'com.android.application' }

      1

      2

      3

      4

      5

      6

      7

      8

      此外 , 如果是 組件模式 , module 是可以獨立運行的應用 , 必須為其配置 applicationId ;

      android { defaultConfig { if (!isModuleMode){ // 組件模式 : 必須配置 applicationId applicationId appId["module2"] } } }

      1

      2

      3

      4

      5

      6

      7

      8

      3、module1 完整的 build.gradle 配置文件

      // 根據 isModuleMode 動態切換 集成模式 / 組件模式 if (isModuleMode){ // 集成模式 apply plugin: 'com.android.library' }else{ // 組件模式 apply plugin: 'com.android.application' } def androidConfig = rootProject.ext.androidConfig def appId = rootProject.ext.applicationId def dep = rootProject.ext.dependencies android { compileSdkVersion androidConfig.compileSdkVersion buildToolsVersion "30.0.3" defaultConfig { if (!isModuleMode){ // 組件模式 : 必須配置 applicationId applicationId appId["module1"] } minSdkVersion androidConfig.minSdkVersion targetSdkVersion androidConfig.targetSdkVersion versionCode androidConfig.versionCode versionName androidConfig.versionName testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles "consumer-rules.pro" // 資源配置 sourceSets{ main{ if (!isModuleMode){ // 組件化模式下使用 ComponentAndroidManifest.xml 作為清單文件 manifest.srcFile 'src/main/component/AndroidManifest.xml' // 配置額外的 Java 源文件目錄 java.srcDirs 'src/main/component/java', 'src/main/java' }else{ // 集成模式 下使用默認設置 } } } // ARoute 需要的配置 javaCompileOptions { annotationProcessorOptions { arguments = [AROUTER_MODULE_NAME: project.getName()] } } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } dependencies { //implementation 'androidx.appcompat:appcompat:1.3.0' //implementation 'androidx.constraintlayout:constraintlayout:2.0.4' //implementation 'com.google.android.material:material:1.3.0' implementation dep.appcompat implementation dep.constraintlayout implementation dep.material testImplementation 'junit:junit:4.+' androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' // 替換成最新版本, 需要注意的是api // 要與compiler匹配使用,均使用最新版可以保證兼容 api 'com.alibaba:arouter-api:1.5.1' annotationProcessor 'com.alibaba:arouter-compiler:1.5.1' }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      40

      41

      42

      43

      44

      45

      46

      47

      48

      49

      50

      51

      52

      53

      54

      55

      56

      57

      58

      59

      60

      61

      62

      63

      64

      65

      66

      67

      68

      69

      70

      71

      72

      73

      74

      75

      76

      77

      78

      79

      80

      81

      82

      83

      84

      85

      4、module2 完整的 build.gradle 配置文件

      module1 與 module2 的配置項基本相同 ;

      // 根據 isModuleMode 動態切換 集成模式 / 組件模式 if (isModuleMode){ // 集成模式 apply plugin: 'com.android.library' }else{ // 組件模式 apply plugin: 'com.android.application' } def androidConfig = rootProject.ext.androidConfig def appId = rootProject.ext.applicationId def dep = rootProject.ext.dependencies android { compileSdkVersion androidConfig.compileSdkVersion buildToolsVersion "30.0.3" defaultConfig { if (!isModuleMode){ // 組件模式 : 必須配置 applicationId applicationId appId["module2"] } minSdkVersion androidConfig.minSdkVersion targetSdkVersion androidConfig.targetSdkVersion versionCode androidConfig.versionCode versionName androidConfig.versionName testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles "consumer-rules.pro" // 資源配置 sourceSets{ main{ if (!isModuleMode){ // 組件化模式下使用 ComponentAndroidManifest.xml 作為清單文件 manifest.srcFile 'src/main/component/AndroidManifest.xml' // 配置額外的 Java 源文件目錄 java.srcDirs 'src/main/component/java', 'src/main/java' }else{ // 集成模式 下使用默認設置 } } } // ARoute 需要的配置 javaCompileOptions { annotationProcessorOptions { arguments = [AROUTER_MODULE_NAME: project.getName()] } } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } dependencies { //implementation 'androidx.appcompat:appcompat:1.3.0' //implementation 'androidx.constraintlayout:constraintlayout:2.0.4' //implementation 'com.google.android.material:material:1.3.0' implementation dep.appcompat implementation dep.constraintlayout implementation dep.material testImplementation 'junit:junit:4.+' androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' // 替換成最新版本, 需要注意的是api // 要與compiler匹配使用,均使用最新版可以保證兼容 api 'com.alibaba:arouter-api:1.5.1' annotationProcessor 'com.alibaba:arouter-compiler:1.5.1' }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      40

      41

      42

      43

      44

      45

      46

      47

      48

      49

      50

      51

      52

      53

      54

      55

      56

      57

      58

      59

      60

      61

      62

      63

      64

      65

      66

      67

      68

      69

      70

      71

      72

      73

      74

      75

      76

      77

      78

      79

      80

      81

      82

      83

      84

      85

      5、module1 獨立運行效果

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      清單文件中設置的主題是黑色的 ;

      6、module2 獨立運行效果

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      清單文件中設置的主題是黑色的 ;

      五、博客資源

      博客源碼 :

      GitHub : https://github.com/han1202012/ComponentDemo

      CSDN 下載 : https://download.csdn.net/download/han1202012/19197739

      Android NAT

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:excel怎么計算年復合增速(Excel如何計算復合增長率)
      下一篇:閥門鎖的具體運用實際效果是怎么樣的
      相關文章
      亚洲一区二区三区免费在线观看| 亚洲男人第一无码aⅴ网站| 国产精品亚洲二区在线| 国产精品亚洲四区在线观看| 97亚洲熟妇自偷自拍另类图片| 亚洲av无码专区国产乱码在线观看 | 亚洲精品综合久久| 日本中文一区二区三区亚洲 | 亚洲免费观看视频| 国产亚洲情侣一区二区无| 国产成人精品亚洲精品| ZZIJZZIJ亚洲日本少妇JIZJIZ | 亚洲精品资源在线| 91精品国产亚洲爽啪在线观看| 亚洲人成电影亚洲人成9999网| 亚洲AV无码专区亚洲AV伊甸园| 亚洲AV乱码久久精品蜜桃| 久久青青草原亚洲AV无码麻豆| 久久精品国产亚洲AV麻豆~| 午夜亚洲www湿好大| 亚洲三级电影网站| 亚洲精品福利网泷泽萝拉| 亚洲天堂一区二区三区四区| 亚洲三级在线免费观看| 久久久久久亚洲精品影院| 亚洲欧美成人综合久久久| 日韩欧美亚洲中文乱码| 亚洲av无码乱码在线观看野外| 久久久久国产亚洲AV麻豆| 国产日产亚洲系列最新| 亚洲精品无码乱码成人| 久久久久久亚洲精品中文字幕| 亚洲视频在线观看| 亚洲区视频在线观看| 国产亚洲福利在线视频| 亚洲av无码成人影院一区| 亚洲国产成人久久综合一区77 | 亚洲一区二区三区国产精品| 亚洲αv久久久噜噜噜噜噜| 亚洲国产精品久久久久久| 亚洲日本在线免费观看|