Gradle+组件化开发

news2024/11/18 3:32:31

Gradle+组件化开发

  • Gradle
    • 一.什么是gradle?
    • 二.gradle优势
    • 三.project和module的关系
    • 三.project.gradle和module.gradle的区别
  • 组件化开发
    • 一.背景
    • 二.项目结构
    • 三.组件开发代码配置
    • 四.BuildSrc组件化开发![在这里插入图片描述](https://img-blog.csdnimg.cn/bff8d7e91fd2476488d25b05b1f364f0.png)

Gradle

一.什么是gradle?

Gradle是一个基于JVM的构建工具,其 build 脚本使用 groovy dsl 编写。

Gradle 的核心在于基于 Groovy的丰富而可扩展的域描述语言(DSL)。 Groovy 通过声明性的语言元素将基于声明的构建推向下层,你可以按你想要的方式进行组合。

二.gradle优势

三.project和module的关系

一个project里面可以有多个module,module可以是application,也可以是library。
在这里插入图片描述

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

application中引用library

 implementation project(':library-network')

三.project.gradle和module.gradle的区别

1.setttings.gradle是project级别

pluginManagement {
    repositories {
    //插件仓库地址
        gradlePluginPortal()
        google()
        mavenCentral()

    }
}
dependencyResolutionManagement {
  repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {//依赖的远程仓库地址
        google()
        mavenCentral()
        //国内仓库
        maven {
            url 'https://maven.aliyun.com/repository/google'
        }
        maven {
            url 'https://maven.aliyun.com/repository/gradle-plugin'
        }
        maven {
            url 'https://maven.aliyun.com/repository/jcenter'
        }
        maven {
            url 'https://maven.aliyun.com/repository/public'
        }
        maven {
            url 'https://maven.aliyun.com/repository/central'
        }
        maven {
            url 'https://plugins.gradle.org/m2/com/gradle'
        }
        maven { url 'https://jitpack.io' }
    }
}
//项目名称
rootProject.name = "openEye"
//module
include ':app'
include ':library-base'
include ':library-common'
include ':library-network'
include ':library-video'
include ':library-widget'
include ':module-main'
include ':module-home'
include ':module-community'
include ':module-more'
include ':module-player'
include ':module-user'


2.project.gralde文件插件

plugins {
    id 'com.android.application' version '7.2.1' apply false //application插件
    id 'com.android.library' version '7.2.1' apply false//library插件
    id 'org.jetbrains.kotlin.android' version '1.6.10' apply false//kotlin插件
    id 'com.google.dagger.hilt.android' version '2.44' apply false //依赖注入插件
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

3.module.gralde文件

plugins {
//使用插件
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
    id 'com.google.dagger.hilt.android' //hilt插件
    id 'kotlin-kapt'//kotlin注解
}
//签名密钥
def keystorePropertiesFile = rootProject.file("keystore.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))

android {
//
    compileSdk Versions.compileSdk

    defaultConfig {
        applicationId Versions.applicationId
        minSdk Versions.minSdk
        targetSdk Versions.targetSdk
        versionCode Versions.versionCode
        versionName Versions.versionName
       
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    //签名配置
    signingConfigs {
        release {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile file(keystoreProperties['storeFile'])
            storePassword keystoreProperties['storePassword']
        }
    }
    //打包时候代码混淆以及对应的混淆规则以及签名配置
    //release 发布版本 debug调试版本
    buildTypes {
        release {
            minifyEnabled true //开启混淆
            shrinkResources true //移除未使用资源
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release//设置使用的签名
        }
    }
    //编辑的jdk版本
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    //kotlin jvm版本
    kotlinOptions {
        jvmTarget = '1.8'
    }
    sourceSets {
        main{
            if (isModule.toBoolean()){
                //单独运行
                manifest.srcFile 'src/main/alone/AndroidManifest.xml'
            }
            else {
                //合并到宿主中
                manifest.srcFile 'src/main/AndroidManifest.xml'
                resources{
                    //正式版本时.剔除debug文件夹下的所有调式文件
                    exclude 'src/debug/*'
                }
            }
        }
    }
    //统一资源前缀,规范资源引用
    resourcePrefix "app_"
    //开启dataBinding
    dataBinding{
        enabled true
    }


}
//依赖
dependencies {

    implementation Libs.coreKtx
    implementation Libs.appcompat
    implementation Libs.material
    implementation Libs.constraintlayout
    testImplementation Libs.junit
    androidTestImplementation Libs.junitTest
    androidTestImplementation Libs.espresso_core

    implementation project(':library-network')

依赖的添加:分为依赖本地SDK、依赖本地module、依赖远程库

implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar'], exclude: [])//依赖libs目录下的所有相关类型文件
implementation project(path: ':ZXingForAndroid')//依赖本地module
implementation files('libs/Msc.jar')//依赖本地库
//远程依赖库
implementation('com.alibaba:QLExpress:3.2.0'){exclude group: 'com.android.support', module:'design' }// 加载时排除框架中的design包


defaultConfig块

    compileSdk Versions.compileSdk
    defaultConfig {
        applicationId Versions.applicationId
        minSdk Versions.minSdk
        targetSdk Versions.targetSdk
        versionCode Versions.versionCode
        versionName Versions.versionName
       
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

compileSdk:编译代码所需要的sdk版本,要与sdk manager里main下载的sdk platforms对应,也就是compileSdk使用的版本必须在sdk manager中已经下载了
minSdk:app可运行的手机设本的最小版本
targetSdk:标识该app是为某个版本的额手机设备而设计的,在这个目标版本的手机上做了充分测试。

buildTypes块:用于构建不同的apk

buildTypes {
        release {
            minifyEnabled true //开启混淆
            shrinkResources true //移除未使用资源
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release //设置使用的签名
        }
        debug {
            debuggable true
        }
        custom {
            minifyEnabled false
        }
    }

signingConfig块:签名

    signingConfigs {
        debug {//可以在bulidTypes下的signingConfig中引用
            storeFile file('release.keystore')//签名文件路径
            storePassword 'xxxxxx'
            keyAlias 'androidreleasekey'
            keyPassword '123456'
        }
        release {
            storeFile file('release.keystore')
            storePassword 'xxxxxx'
            keyAlias 'androidreleasekey'
            keyPassword '123456'
        }
    }


productFlavors 多渠道打包配置

    flavorDimensions 'default' // 定义产品维度,所有渠道都要指定维度
    productFlavors {
        dev {// 每个环境包名不同
            applicationId DEVELOP_PACKAGE_NAME as String
            dimension "default"
            // 自定义buildConfig.java中的变量供代码中使用
            buildConfigField "String", "MODE", '"develop"'
        }
        prod {
            applicationId PROD_PACKAGE_NAME as String
            dimension "default"
            buildConfigField "String", "MODE", '"production"'
        }
 
 
        productFlavors.all { flavor ->
            flavor.manifestPlaceholders += [CHANNEL_VALUE: name]
            if (name.equals('dev')) { //开发环境
                flavor.manifestPlaceholders += [APP_NAME: DEV_APP_NAME as String]
                flavor.manifestPlaceholders += [APP_ICON: DEV_APP_ICON as String]
                flavor.manifestPlaceholders += ["apk.applicationId" : DEV_PACKAGE_NAME as String]
            } else if (name.equals('prod')) { //生产环境
                flavor.manifestPlaceholders += [APP_NAME: PROD_APP_NAME as String]
                flavor.manifestPlaceholders += [APP_ICON: PROD_APP_ICON as String]
                flavor.manifestPlaceholders += ["apk.applicationId" : PROD_PACKAGE_NAME as String]
            }
            
            //打包配置
            applicationVariants.all { variant ->
                def name = variant.flavorName
                variant.outputs.all {//设置输出apk的文件名
                    if (name.equals('dev')){
                        outputFileName = "app-debug-${variant.versionName}.apk"
                    }else if (name.equals('prod')) {
                        outputFileName = "app-prod-${variant.versionName}.apk"
                    }
                }
            }
        }
 
    }


SourceSets配置

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
            jniLibs.srcDirs = ['src/main/jniLibs']
            java {
                exclude '/test/**'  // 不想包含文件的路径
            }
        }
    }


可以加逻辑判断,比如通过flag判断使用哪个manifest,组件化开发的时候使用到

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


NDK配置:NDK和JNI后面讲解
1)defaultConfig{}中的 ndk.abiFilters 属性,配置ndk链接库支持的cpu架构

2)externalNativeBuild{}中配置cmake

    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
            cppFlags '-std=c++11'
            arguments '-DANDROID_PLATFORM=android-21',
                    '-DANDROID_TOOLCHAIN=clang',
                    '-DANDROID_STL=c++_shared'
        }
    }

3)sourceSets中配置动态链接库的目录

    sourceSets {
        main {
            jniLibs.srcDirs = ['src/main/jniLibs']
        }
    }

4)android{}中的ndkVersion 属性,配置ndk版本号

发布到局域网私有仓库在要发布的module的bulid.gradle中添加配置

apply plugin: 'maven'
//...其它配置
//将源码打包  为了保证引入的aar  包可以查看源码
task androidSourcesJar(type: Jar) {
    classifier = 'sources'
    from android.sourceSets.main.java.srcDirs
}
//包含文档和源码的aar
artifacts {
    archives androidSourcesJar
}
//上传到Maven仓库的task
uploadArchives {
    repositories {
        mavenDeployer {
            //指定maven仓库url
            repository(url: "http://10.10.25.223:8081/repository/maven-releases/") {
                //nexus登录默认用户名和密码
                authentication(userName: "admin", password: "123456")
            }
            pom.groupId = "com.test.camera"// 唯一标识(通常为模块包名,也可以任意)
            pom.artifactId = "CameraMix" // 项目名称(通常为类库模块名称,也可以任意)
            pom.version = "1.0.0" // 版本号
        }
    }
}

组件化开发

视频学习:https://www.bilibili.com/video/BV1oK4y1R7Hx/?spm_id_from=333.337.search-card.all.click&vd_source=d61c44703fccc74954c692402d0116b8

一.背景

一个app随着业务增加,代码放在同一个模块中会越来越臃肿,同时也导致多人开发的一个难度。组件化可以把业务单独分出来,形成一个单独模块,可单独运行、测试等,相互之间不会影响。
另外一个优势,如果一个公司有多个app,总会出现一些相同业务,如登录/注册。我们可以单独把公共业务封装成一个单独模块,供所以app使用,提高了开发成本

二.项目结构

如下图1:
项目分成了4层,第一层app壳,这个也就是我们主工程, 里面包含application,启动页,以及一些初始化操作。第二层为module层,也就是我们的具体业务模块,具体需要看业务。第三层公共资源库,所有module都依赖此lib库。第四层为工具层,我们可以封装一些常用的网络请求,图片框架等
在这里插入图片描述

三.组件开发代码配置

1.先给大家看下工程主要目录结构
在这里插入图片描述
2.在project目录下创建一个全局的config.gradle配置文件。具体每个字段作用,看代码注释,这里就不作讲解了

ext{
    //组件独立调试开关, 每次更改值后要同步工程
    isDebug = false
    //统一管理Android配置
    android = [
            // 编译 SDK 版本
            compileSdkVersion: 32,
            // 最低兼容 Android 版本
            minSdkVersion: 22,
            // 最高兼容 Android 版本
            targetSdkVersion: 31,
            // 当前版本编号
            versionCode: 1,
            // 当前版本信息
            versionName: "1.0.0"
    ]
    //组件唯一包名
    applicationid = [
            "app":"com.example.demo",
            "lgoin":"com.test.login",
    ]
    //请求测试服/正式服
    url = [
            "debug": "http://v.juhe.cn",
            "release":"http://v.juhe.cn"
    ]
    //统一管理module的第三方依赖
    dependencies = [
            corektx: 'androidx.core:core-ktx:1.7.0',
            appcompat: 'androidx.appcompat:appcompat:1.3.0',
            material: 'com.google.android.material:material:1.4.0',
            constraintlayout: 'androidx.constraintlayout:constraintlayout:2.0.4',
            junit: 'junit:junit:4.13.2',
            junittest: 'androidx.test.ext:junit:1.1.3',
            espressocore: 'androidx.test.espresso:espresso-core:3.4.0',
    ]
    //路由
    libARouter= 'com.alibaba:arouter-api:1.5.2'
    libARouterCompiler = 'com.alibaba:arouter-compiler:1.5.2'
    //Gson解析
    libGson = 'com.google.code.gson:gson:2.8.9'
}

3.引入config.gradle配置文件,在project全局中build.grale文件添加 apply from:“config.gradle”

plugins {
    id 'com.android.application' version '7.2.1' apply false
    id 'com.android.library' version '7.2.1' apply false
    id 'org.jetbrains.kotlin.android' version '1.6.10' apply false
}

//引入config全局配置文件
apply from:"config.gradle"

task clean(type: Delete) {
    delete rootProject.buildDir
}

4.配置module,通过全局配置文件中的 isDebug 控制,来实现module和library之间的转换,我们对module中的build.grale文件作一下修改(这里修改的是module_login下面的)

apply from: '../config.gradle'
if (isDebug){
    apply plugin: 'com.android.application'
}else {
    apply plugin: 'com.android.library'
}
apply plugin:'org.jetbrains.kotlin.android'
apply plugin: 'kotlin-kapt'
android {
    compileSdk rootProject.ext.android.compileSdkVersion

    defaultConfig {
        if (isDebug){
            applicationId rootProject.ext.applicationid.lgoin
        }
        minSdk rootProject.ext.android.minSdkVersion
        targetSdk  rootProject.ext.android.targetSdkVersion
        versionCode  rootProject.ext.android.versionCode
        versionName rootProject.ext. android.versionName

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"


        //kotlin 路由配置
        kapt {
            arguments {
                arg("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
    }
    sourceSets{
        main{
            if (isDebug){
                manifest.srcFile 'src/main/debug/AndroidManifest.xml'
            }else {
                manifest.srcFile 'src/main/AndroidManifest.xml'
            }
        }
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

dependencies {
    implementation rootProject.ext.dependencies.corektx
    implementation rootProject.ext.dependencies.appcompat
    implementation rootProject.ext.dependencies.material
    implementation rootProject.ext.dependencies.constraintlayout
    testImplementation rootProject.ext.dependencies.junit
    androidTestImplementation rootProject.ext.dependencies.junittest
    androidTestImplementation rootProject.ext.dependencies.espressocore
    implementation project(path: ':lib_common')

    //kotlin路由配置
    implementation rootProject.ext.libARouter
    kapt rootProject.ext.libARouterCompiler
}

5.添加AndroidManifest.xml文件,这里解释下为什么要添加AndroidManifest.xml。当module作为library库时,AndroidManifest.xml里面的内容是有区别的

  • 作为library,目录位置src/main/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.module.login">

    <application>
        <activity
            android:name="com.module.login.TestActivity" />
    </application>

</manifest>


  • 作为module单独运行,目录位置src/main/debug/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.module.login">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:name="com.module.login.App"
        android:theme="@style/Theme.Demo">
        <activity
            android:name="com.module.login.TestActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

6.完成上面几步,module_login模块就配置完了,其他module依照配置就可以了。另外需要注意,组件开发,一般会引入路由框架ARoute,实现模块之间的的跳转。

app模块以及所有的业务模块Arouter配置
common公共模块中配置路径,所有的业务模块均引用common公共模块

7.组件开发特别需要注意资源重名,为了避免这个问题,可以在module中的build.gradle中添加resourcePrefix “xxx_” 前缀提示,这样每次添加资源,系统会提示加前缀

四.BuildSrc组件化开发在这里插入图片描述

1.项目根目录下创建buildSrc文件夹并创建build.gralde.kts文件

plugins {
    `kotlin-dsl`
}

repositories {
    maven {
        setUrl("https://maven.aliyun.com/nexus/content/groups/public/")
    }
    mavenCentral()
    flatDir {
        dirs("libs")
    }
}

2.在buildSrc下创建src/main/java目录并创建一个kt文件,取名Dependencies.kt

//版本号管理
object Versions{
    const val applicationId = "com.bawei.openeye"
    const val compileSdk = 32
    const val targetSdk = 32
    const val minSdk = 23
    const val versionCode = 1
    const val versionName = "1.0"
    const val coreKtx = "1.7.0"
    const val appcompat = "1.3.0"
    const val material = "1.4.0"
    const val constraintlayout = "2.0.4"
    const val junit = "4.13.2"
    const val junitTest = "1.1.3"
    const val espresso_core = "3.4.0"
    const val room_version = "2.4.0"
    const val lifecycle_version = "2.5.1"
    const val glide = "4.11.0"
//    const val mmkv = "1.2.15"
    const val fragmentKtx = "1.5.5"
    const val retrofit2 = "2.9.0"
    const val utilcodex = "1.30.6"
    const val coroutines = "1.3.9"
    const val flycotablayout = "2.0.2@aar"
    const val banner = "1.4.10"
    const val okhttp = "3.4.1"
    const val okhttp_logging = "3.9.1"
    const val rxjava = "2.2.7"
    const val eventbus = "3.3.1"
    const val arouter  = "1.5.2"
    const val smart = "2.0.5"
    const val hilt = "2.44"
    const val loadsir = "1.3.6"
    const val rxpermissions = "0.10.2"
    const val rxjava2 = "2.2.7"
    const val immersionbar = "3.0.0"
    const val mmkv = "1.2.15"
}
object Libs{
    const val espresso_core = "androidx.test.espresso:espresso-core:${Versions.espresso_core}"
    const val coreKtx =  "androidx.core:core-ktx:${Versions.coreKtx}"
    const val appcompat =  "androidx.appcompat:appcompat:${Versions.appcompat}"
    const val material =  "com.google.android.material:material:${Versions.material}"
    const val constraintlayout =  "androidx.constraintlayout:constraintlayout:${Versions.constraintlayout}"
    const val junit =  "junit:junit:${Versions.junit}"
    const val junitTest =  "androidx.test.ext:junit:${Versions.junitTest}"
}
object Dependencies {
    //jetpack
    const val livedata = "androidx.lifecycle:lifecycle-livedata-ktx:${Versions.lifecycle_version}"
    const val viewmodel = "androidx.lifecycle:lifecycle-viewmodel-ktx:${Versions.lifecycle_version}"
    const val fragmentKtx = "androidx.fragment:fragment-ktx:${Versions.fragmentKtx}"
    const val roomKtx = "androidx.room:room-ktx:${Versions.room_version}"
    const val roomRxjava2 = "androidx.room:room-rxjava2:${Versions.room_version}"
    const val roomRuntime = "androidx.room:room-runtime:${Versions.room_version}"
    const val roomCompile = "androidx.room:room-compiler:${Versions.room_version}"
    const val roomPaging = "androidx.room:room-paging:${Versions.room_version}"
    const val hilt = "com.google.dagger:hilt-android:${Versions.hilt}"
    const val hilt_compiler = "com.google.dagger:hilt-android-compiler:${Versions.hilt}"
    //协程
    const val coroutines = "org.jetbrains.kotlinx:kotlinx-coroutines-android:${Versions.coroutines}"
    //retrofit
    const val retrofit2 = "com.squareup.retrofit2:retrofit:${Versions.retrofit2}"
    //rx
    const val rxjava = "io.reactivex.rxjava2:rxjava:${Versions.rxjava}"
    const val rxpermissions = "com.github.tbruyelle:rxpermissions:${Versions.rxpermissions}"
    //gson解析器
    const val converterGson = "com.squareup.retrofit2:converter-gson:${Versions.retrofit2}"
    //glide
    const val glide =  "com.github.bumptech.glide:glide:${Versions.glide}"
    //mmkv
    const val mmkv =  "com.tencent:mmkv:${Versions.mmkv}"
    //okhttp
    const val okhttp = "com.squareup.okhttp3:okhttp:${Versions.okhttp}"
    const val okhttp_logging = "ccom.squareup.okhttp3:logging-interceptor:${Versions.okhttp_logging}"
    //eventbus
    const val eventbus = "org.greenrobot:eventbus:${Versions.eventbus}"
    //ARouter
    const val arouter = "com.alibaba:arouter-api:${Versions.arouter}"
    const val arouter_compiler = "com.alibaba:arouter-compiler:${Versions.arouter}"
    //刷新
    const val loadsir = "com.kingja.loadsir:loadsir:${Versions.loadsir}"
    const val immersionbar = "com.gyf.immersionbar:immersionbar:${Versions.immersionbar}"
}

3.gradle.properties

isModule = false

4.settings.gradle

pluginManagement {
    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()

    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        maven {
            url 'https://maven.aliyun.com/repository/google'
        }
        maven {
            url 'https://maven.aliyun.com/repository/gradle-plugin'
        }
        maven {
            url 'https://maven.aliyun.com/repository/jcenter'
        }
        maven {
            url 'https://maven.aliyun.com/repository/public'
        }
        maven {
            url 'https://maven.aliyun.com/repository/central'
        }
        maven {
            url 'https://plugins.gradle.org/m2/com/gradle'
        }
        maven { url 'https://jitpack.io' }
    }
}

rootProject.name = "openEye"
include ':app'
include ':library-base'
include ':library-common'
include ':library-network'
include ':library-video'
include ':library-widget'
include ':module-main'
include ':module-home'
include ':module-community'
include ':module-more'
include ':module-player'
include ':module-user'


5.app主壳

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
    id 'com.google.dagger.hilt.android' //hilt插件
    id 'kotlin-kapt'//kotlin注解
}
def keystorePropertiesFile = rootProject.file("keystore.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))

android {
    compileSdk Versions.compileSdk

    defaultConfig {

        applicationId Versions.applicationId
        minSdk Versions.minSdk
        targetSdk Versions.targetSdk
        versionCode Versions.versionCode
        versionName Versions.versionName
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [AROUTER_MODULE_NAME: project.getName()]
            }
        }
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    signingConfigs {
        release {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile file(keystoreProperties['storeFile'])
            storePassword keystoreProperties['storePassword']
        }
    }
    buildTypes {
        release {
            minifyEnabled true //开启混淆
            shrinkResources true //移除未使用资源
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
    sourceSets {
        main{
            if (isModule.toBoolean()){
                //单独运行
                manifest.srcFile 'src/main/alone/AndroidManifest.xml'
            }
            else {
                //合并到宿主中
                manifest.srcFile 'src/main/AndroidManifest.xml'
                resources{
                    //正式版本时.剔除debug文件夹下的所有调式文件
                    exclude 'src/debug/*'
                }
            }
        }
    }
    //统一资源前缀,规范资源引用
    resourcePrefix "app_"
    //开启dataBinding
    dataBinding{
        enabled true
    }


}

dependencies {

    implementation Libs.coreKtx
    implementation Libs.appcompat
    implementation Libs.material
    implementation Libs.constraintlayout
    testImplementation Libs.junit
    androidTestImplementation Libs.junitTest
    androidTestImplementation Libs.espresso_core

    //宿主项目中判断组件是否需要独立运行
    if (isModule.toBoolean()) {
        //组件独立运行时,宿主项目直接依赖基础库,避免编译错误
        implementation project(':library-base')
    } else {
        //主业务模块
        implementation project(':module-main')
        //首页模块
        implementation project(':module-home')
        //社区模块
        implementation project(':module-community')
        //更多模块
        implementation project(':module-more')
        //视频播放模块
        implementation project(':module-player')
        //用户模块
        implementation project(':module-user')
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/543689.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RCNN网络原理详解

文章目录 一、前言二、R-CNN原理步骤2.1.Selective Search生成目标检测框2.2.对候选区域使用深度网络提取特征2.3.SVM分类2.4.使用回归器精细修正候选框位置 三、总结参考博客与学习视频 一、前言 学习目标检测当然要学习目标检测领域的开山之作R-CNN,本文为个人笔记。 二、…

Boost开发指南-1.1timer

timer timer类可以测量时间的流逝&#xff0c;是一个小型的计时器&#xff0c;提供毫秒级别的计时精度和操作函数&#xff0c;供程序员手工控制使用&#xff0c;就像是个方便的秒表。 timer位于名字空间boost,为了使用timer组件&#xff0c;需要包含头文件<boost/timer.hp…

代码随想录算法训练营第二十三天|理论基础 77. 组合

文章目录 理论基础77.组合思路代码总结 理论基础 回溯算法&#xff1a;一种暴力搜索方式 回溯是递归的副产品&#xff0c;只要有递归就会有回溯。 回溯法&#xff0c;一般可以解决如下几种问题&#xff1a; 组合问题&#xff1a;N个数里面按一定规则找出k个数的集合切割问题…

广告投放实战指南,让你的技术产品走向成功!

开篇词 作为深耕智能客服领域多年的云客服厂商&#xff0c;美洽在开拓市场、品牌运营、获线转化等方面积累了一定的经验&#xff0c;并打造出了在线客服、呼叫中心、客服机器人、工单系统、语音机器人等智能客服全域产品矩阵&#xff0c;不仅为企业与客户的沟通提供了便利&…

android (实现左滑删除)自定义控件+事件分发

左滑删除 背后的逻辑1布局的绘制onMeasureonLayout 2 事件的分发都不处理爸爸拦截不吃吃 事件分发的结论 完整代码的实现效果图代码 背后的逻辑 想要实现左滑删除&#xff0c;在现有控件不满足的情况下&#xff0c;肯定是要自定义View。 然后考虑需要实现的效果&#xff0c;里…

nginx(CVE-2022-41741)漏洞修复

大家好&#xff0c;我是早九晚十二&#xff0c;目前是做运维相关的工作。写博客是为了积累&#xff0c;希望大家一起进步&#xff01; 我的主页&#xff1a;早九晚十二 最近&#xff0c;nginx曝出了最新漏洞CVE-2022-41741&#xff0c;这个影响还是比较大的&#xff0c;因为这个…

你真的了解低代码吗?

&#x1f431; 个人主页&#xff1a;不叫猫先生&#xff0c;公众号&#xff1a;前端舵手 &#x1f64b;‍♂️ 作者简介&#xff1a;2022年度博客之星前端领域TOP 2&#xff0c;前端领域优质作者、阿里云专家博主&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步…

在vue中上传图片

大纲&#xff1a; &#x1f335; 1、avue中如何上传图片 Avue官网 : Avue 在Avue官网中找到 Upload附件上传。本案例为了满足项目需求&#xff0c;我只用了上传后的方法 :upload-after"uploadAfter" &#x1f346; Avue上传图片案例代码 <template><div…

【axios】vue中axios的请求配置

注意&#xff1a;本文实例化为TS版 1、axios概念 axios 是一个基于 promise 封装的网络请求库&#xff0c;它是基于 原生XHR 进行二次封装&#xff0c;可以说是 XHR 的一个子集&#xff0c;而 XHR 又是 Ajax 的一个子集 特点 从浏览器中创建 XMLHttpRequests从 node.js 创建…

Maven——Maven工程

1.Maven工程类型 【1】POM工程 【2】JAR工程 【3】WAR工程 2.Maven的目录结构 3.POM模式-Maven工程关系 在Maven中它把每个项目都看成一个对象 3.1依赖 【1】依赖关系 【2】如何注入依赖 【3】依赖的好处&#xff1a; 省去了程序员手动添加jar包的操作&#xff01; 可以帮…

类与对象(中)(一)

1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员 函数。 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器…

【NoteExpress】解决缺少样式的问题

之前写过一篇关于在NoteExpress里面把参考文献输出样式改成Elsevier的教程 &#x1f449;【NoteExpress】统一Elsevier旗下期刊参考文献格式 今天打开 NoteExpress &#xff0c;准备换一个输出样式&#xff0c;发现样式数量变了&#xff0c;从原来几千多变成了7&#xff01; 我…

日撸 Java 三百行day51-53

文章目录 说明Day51-52 KNN 分类器1.KNN2.代码1.aff内容解读2.代码理解 Day53 knn补充1.加权思路2.加权代码3.leave-one-out 测试思路4.leave-one-out代码 说明 闵老师的文章链接&#xff1a; 日撸 Java 三百行&#xff08;总述&#xff09;_minfanphd的博客-CSDN博客 自己也把…

sonarqube主要功能概览

sonarqube质量标准 sonarqube通过可靠性、安全性、安全复审、可维护性、覆盖率、重复度等方面来评价代码质量。 分别使用bugs&#xff0c; 漏洞等指标。 如图&#xff0c;有项目状态为正常&#xff0c;有项目状态为错误。 点进项目可以看具体 可以对问题进行分配&#xff0c;…

7个既可学习又可玩游戏的CSS在线学习网站

学习编码并不容易&#xff0c;尤其是 CSS&#xff0c;所以&#xff0c;在本文中我将跟大家分享一些既能学习CSS知识技能有可以玩游戏的网站&#xff0c;以有趣好玩的方式来帮助你提高学习兴趣以及解决问题的能力。现在&#xff0c;就让我们进入一些在线学习CSS的游戏网站列表&a…

【JOSEF约瑟 JDZS-1202B 可调断电延时中间继电器 精度高、延时宽、】

品牌&#xff1a;JOSEF约瑟名称&#xff1a;可调断电延时中间继电器型号&#xff1a;JDZS-1202B系列额定电压&#xff1a;110、220VDC/AC触点容量&#xff1a;250V/5A功率消耗&#xff1a;2W返回系数&#xff1a;≥5%特点&#xff1a;高精度、延时宽、功耗低。 用途及特点 基本…

使用Rust构建一个kvm用户空间实例

最近在学习虚拟化相关的内容&#xff0c;想着使用Rust构建一个最小的kvm用户空间实例。也就是直接调用kvm的api&#xff0c;然后创建虚拟机。网络上关于kvm的内容大部分是使用libvirt的&#xff0c;然后kvm用户空间实例也是使用C编写的。因此想着使用Rust写一个简单的。 思路 …

Maven依赖管理

文章目录 1 依赖传递与冲突问题2 可选依赖和排除依赖方案一:可选依赖方案二:排除依赖 Masked5 / heima_maven_codes GitCode 我们现在已经能把项目拆分成一个个独立的模块&#xff0c;当在其他项目中想要使用独立出来的这些模块&#xff0c;只需要在其pom.xml使用<depende…

看干货,10个网络安全小知识

如今&#xff0c;大家的生活与互联网已密不可分&#xff0c;每天享受着网络带给我们的服务和便利&#xff0c;工作、娱乐、购物、刷热点……&#xff0c;但网络也是一把双刃利器网络风险无孔不入&#xff0c;信息泄露、网络诈骗、虚假信息满天飞……所以&#xff0c;网络安全不…

JavaWeb-JQuery的学习

1、JQuery快速入门 1.1、JQuery介绍 jQuery 是一个 JavaScript 库。所谓的库&#xff0c;就是一个 JS 文件&#xff0c;里面封装了很多预定义的函数&#xff0c;比如获取元素&#xff0c;执行隐藏、移动等&#xff0c;目的就是在使用时直接调用&#xff0c;不需要再重复定义&…