ARouter路由
2022-05-31 本文已影响0人
Mr_不靠谱_先森
项目简介
官方介绍ARouter is a framework for assisting in the renovation of Android componentization (帮助 Android App 进行组件化改造的路由框架)
通俗的介绍阿里路由以及使用ARouter的好处,我们所使用的原生路由方案一般是通过显式intent和隐式intent两种方式实现的(这里主要是指跳转Activity or Fragment)。在显式intent的情况下,因为会存在直接的类依赖的问题,导致耦合非常严重;而在隐式intent情况下,则会出现规则集中式管理,导致协作变得非常困难。一般而言配置规则都是在Manifest中的,这就导致了扩展性较差。除此之外,使用原生的路由方案会出现跳转过程无法控制的问题,因为一旦使用了StartActivity()就无法插手其中任何环节了,只能交给系统管理,这就导致了在跳转失败的情况下无法降级,而是会直接抛出运营级的异常。这时候如果考虑使用自定义的路由组件就可以解决以上问题,比如通过URL索引就可以解决类依赖的问题;通过分布式管理页面配置可以解决隐式intent中集中式管理Path的问题;自己实现整个路由过程也可以拥有良好的扩展性,还可以通过AOP的方式解决跳转过程无法控制的问题,与此同时也能够提供非常灵活的降级方式。
源码地址https://github.com/alibaba/ARouter
使用方法
1,Adding dependencies and configurations
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'maven'
id 'kotlin-kapt'
}
kapt {
arguments {
arg("AROUTER_MODULE_NAME", project.getName())
}
}
def config = rootProject.ext
android {
compileSdkVersion config.android.compileSdkVersion
buildToolsVersion config.android.buildToolsVersion
defaultConfig {
minSdkVersion config.android.minSdkVersion
targetSdkVersion config.android.targetSdkVersion
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 {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
compileOnly 'androidx.core:core-ktx:1.2.0'
compileOnly 'androidx.appcompat:appcompat:1.1.0'
api 'com.alibaba:arouter-api:1.5.1'
kapt 'com.alibaba:arouter-compiler:1.5.1'
compileOnly "com.google.code.gson:gson:2.8.6"
}
uploadArchives {
repositories.mavenDeployer {
// maven_lib_encode一些参数
def mavenConstant = config.maven_lib_dlRouter
// maven公共参数
def mavenPublic = config.maven_public
pom.project {
version mavenConstant["version"]
artifactId mavenConstant["artifactId"]
groupId mavenPublic["groupId"]
packaging mavenPublic["type"]
description mavenConstant["description"]
}
// 是否为snapshot包
def isSnapshot = pom.version.endsWith('-SNAPSHOT')
def userName = mavenPublic["userName"]
def passWord = mavenPublic["passWord"]
// snapshot
if (isSnapshot) {
snapshotRepository(url: mavenPublic["snapShotUrl"]) {
authentication(userName: userName, password: passWord)
}
}
// release
else {
repository(url: mavenPublic["releaseUrl"]) {
authentication(userName: userName, password: passWord)
}
}
}
}