202005021116 2024-11-15 17:15 采纳率: 50%
浏览 129
已结题

安卓组件化工程引入Arouter报错there's no route matched path[/login/LoginActivity,如何解决?

组件化的开发模式,下面依次是根gradle配置,base模块,app模块和login模块的类和gradle配置:
1.项目根build.gradle配置:



// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
    id 'com.android.application' version '8.0.2' apply false
    id 'com.android.library' version '8.0.2' apply false
    id 'org.jetbrains.kotlin.android' version '1.7.20' apply false
}

ext {
    //当它为true时,调试模式,组件可以单独运行。如果是false,正式编译打包的模式。
    isDebug = false

    android = [
            compileSdk   : 33,
            applicationId: "com.example.demo4",
            minSdk       : 24,
            targetSdk    : 33,
            versionCode  : 1,
            versionName  : "1.0"
    ]

    applicationId = [
            "app"    : "com.example.demo4",
            "main"   : "com.example.module.main",
            "base"   : "com.example.libbase",
            "pay"   : "com.example.pay",

            "login"  : "com.example.module.login",
            "message": "com.hnucm.module.message",
            "mine"   : "com.hnucm.module.mine"
    ]

    //SDk中核心的库
    library = [
            corektx         : "androidx.core:core-ktx:1.8.0",
            appcompat       : "androidx.appcompat:appcompat:1.4.1",
            material        : "com.google.android.material:material:1.5.0",
            constraintlayout: "androidx.constraintlayout:constraintlayout:2.1.3"
    ]

    //第三方的库
    arouter_api = "com.alibaba:arouter-api:1.5.2"
    //ARouter 的注解处理器
    arouter_compiler = "com.alibaba:arouter-compiler:1.5.2"
    gson = "com.google.code.gson:gson:2.8.6"

}

2.base模块的gradle:



plugins {
//    id 'com.android.library'
    id 'org.jetbrains.kotlin.android'
}

def cfg = rootProject.ext

apply plugin: 'com.android.library'

android {
    namespace cfg.applicationId.base
    compileSdk cfg.android.compileSdk

    defaultConfig {
        minSdk cfg.android.minSdk
        targetSdk cfg.android.targetSdk

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        consumerProguardFiles "consumer-rules.pro"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

dependencies {

    api cfg.library.appcompat
    api cfg.library.material
    api cfg.library.constraintlayout

    api cfg.arouter_api

    implementation 'androidx.core:core-ktx:1.8.0'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.2.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
}

3.app模块的初始化:

class App :Application() {

    override fun onCreate() {
        super.onCreate()
            ARouter.openLog();     // 打印日志
            ARouter.openDebug();   // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
        ARouter.init(this); // 尽可能早,推荐在Application中初始化
    }
}

4.app模块的gradle配置


plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
}

def cfg = rootProject.ext

android {
    namespace cfg.applicationId.app
    compileSdk cfg.android.compileSdk

    defaultConfig {
        applicationId cfg.applicationId.app
        minSdk cfg.android.minSdk
        targetSdk cfg.android.targetSdk
        versionCode cfg.android.versionCode
        versionName cfg.android.versionName

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        vectorDrawables {
            useSupportLibrary true
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
    packagingOptions {
        resources {
            excludes += '/META-INF/{AL2.0,LGPL2.1}'
        }
    }
}

dependencies {

    implementation project(":moduleBase:libBase")

    implementation 'androidx.core:core-ktx:1.8.0'
    implementation platform('org.jetbrains.kotlin:kotlin-bom:1.8.0')
    implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.2.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
}

5.app模块的起始跳转页:

class StartActivity : Activity() {

    @SuppressLint("MissingInflatedId")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_start)

        findViewById<Button>(R.id.btn_jump).setOnClickListener {

            ARouter.getInstance().build("/login/LoginActivity").navigation();
        }

    }
}

6.登录模块的gradle:


plugins {
//    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
}

def cfg = rootProject.ext
if (cfg.isDebug) {
    apply plugin: 'com.android.application'
} else {
    apply plugin: 'com.android.library'
}

android {
    namespace cfg.applicationId.login
    compileSdk cfg.android.compileSdk

    defaultConfig {
        if (cfg.isDebug) {
            applicationId cfg.applicationId.login
        }
        minSdk cfg.android.minSdk
        targetSdk cfg.android.targetSdk
        versionCode cfg.android.versionCode
        versionName cfg.android.versionName

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        vectorDrawables {
            useSupportLibrary true
        }
        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
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
    packagingOptions {
        resources {
            excludes += '/META-INF/{AL2.0,LGPL2.1}'
        }
    }

    sourceSets {
        main{
            if (cfg.isDebug) {
                manifest.srcFile 'src/main/debug/AndroidManifest.xml'
            }else{
                manifest.srcFile 'src/main/AndroidManifest.xml'
            }
        }
    }
}

dependencies {

    implementation project(":moduleBase:libBase")
    annotationProcessor cfg.arouter_compiler

    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.2.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
}

7.跳转的目标页:

@Route(path = "/login/LoginActivity")
class LoginActivity : Activity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)

    }
}
  • 写回答

28条回答 默认 最新

  • 趣享先生 优质创作者: 编程框架技术领域 2024-11-15 17:20
    关注
    获得0.45元问题酬金

    该回答参考ChatGPT,由吾为汝整理提供如若有用,还请题主采纳!

    在你的安卓组件化工程中,遇到的错误 "there's no route matched path[/login/LoginActivity]" 通常是由于以下几个原因导致的。我们可以逐步检查和解决这个问题。

    1. 确保注解处理器正确配置

    确保在登录模块的 build.gradle 文件中,注解处理器 arouter_compiler 已经正确添加,并且没有拼写错误。你已经在 dependencies 中添加了这一行:

    annotationProcessor cfg.arouter_compiler
    

    2. 检查 @Route 注解

    确保在 LoginActivity 中的 @Route 注解没有拼写错误,并且路径与跳转时使用的路径完全一致。你已经正确使用了:

    @Route(path = "/login/LoginActivity")
    class LoginActivity : Activity() {
    

    3. 确保模块编译

    确保你的登录模块已经成功编译并生成了相应的路由表。可以尝试清理并重建项目:

    • 在 Android Studio 中,选择 Build -> Clean Project,然后选择 Build -> Rebuild Project

    4. 检查 ARouter 初始化

    确保在 App 类中正确初始化了 ARouter。你已经在 onCreate 方法中调用了 ARouter.init(this),这部分看起来是正确的。

    5. 检查 ProGuard 配置

    如果你在发布版本中遇到这个问题,可能是 ProGuard 混淆导致的。确保在 ProGuard 配置文件中添加了 ARouter 的规则,通常可以添加以下规则:

    -keep class com.alibaba.android.arouter.** { *; }
    -keep class **$$ARouter** { *; }
    

    6. 检查模块依赖

    确保 app 模块依赖了 login 模块。在 app 模块的 build.gradle 中,添加以下依赖:

    implementation project(":moduleLogin")
    

    7. 日志调试

    开启 ARouter 的日志功能,查看是否有其他的错误信息。你已经在 App 类中调用了 ARouter.openLog(),可以在 Logcat 中查看 ARouter 的输出。

    8. 其他问题

    如果以上步骤都没有解决问题,可能需要检查是否有其他的配置问题,比如 AndroidManifest.xml 中的配置是否正确,或者是否有其他模块影响了路由的注册。

    总结

    按照以上步骤逐一检查,通常可以找到并解决 "there's no route matched path" 的问题。

    评论

报告相同问题?

问题事件

  • 系统已结题 11月23日
  • 创建了问题 11月15日