android工程模块学习笔记

这里的模块指的是Module,As新建立工程,自动生成一个app的Module

项目体量比较大的情况下,对代码划分不同的Module,再通过gradle组合编译.

在代码比较多的情况下

优势:

模块可以单独编译,比整体编译更快;

查找问题,可以快速定位;

方便文件分类管理

模块添加和删除

添加模块

点击file按钮

选择模块类型

module类型又很多,用的最多的应该是第一个Phone应用和Library类型

第一个是应用类型,可以像app一样编译运行

第二个是库类型,本身可以编译,通过依赖关系也可以被其他模块引用

模块的类型实际上是在module内部的build.gradle中第一行的插件类型决定的

对应关系
应用类型:

apply plugin: 'com.android.application'

资源库类型:

apply plugin: 'com.android.library'

删除模块

不能直接删除module文件夹,会编译出错

自动删除

在工具栏按钮中找到Project Structure

找到要删除的module,点击减号按钮.

然后在项目目录下,删除文件夹即可

手动删除

在项目根目录下,找到setting.gradle文件,可以看到结构如下

这里手动删除指定的module,然后编译通过后,就可以直接手动删除指定module文件夹

模块间依赖关系

目前常用的有两种依赖方式,implement和api

implement 类似于关键字private,如例子

moduleA implement moduleB

moduleB implement moduleC

moduleA可以引用moduleB中的资源,无法引用moduleC中的资源

api类似于关键字public,如例子

moduleA api moduleB

moduleB api moduleC

moduleA可以引用moduleB moduleC中的资源
如果其他模块依赖了moduleA,可以引用到ABC三个模块的资源

统一模块管理

每个module中都有自己的build.gradle,都有自己的编译版本和编译工具

为了统一方便管理,可以在根目录下建立一个统一的gradle配置文件,然后导入到每个module中的build.gradle中

例如

根目录下config.gradle文件

ext {
    /*发布到生产的版本号*/
    versionReleaseName = "1.0.03"
    /*仅在内部测试时使用的版本号*/
    versionDebugName   = "1.0.03_debug"
    android =[
            compileSdkVersion   : 27,
            minSdkVersion        : 19,
            targetSdkVersion    : 21,
            versionCode         : 21,
            versionName         : versionReleaseName
    ]
    /*java版本,使用Java1.8*/
    compileJavaVersion = JavaVersion.VERSION_1_8
    /*签名文件,需要放到根目录下*/
    customSign=[
            keyAlias : 'androiddebugkey',
            keyPassword : 'android',
            file : '../debug.keystore',
            storePassword :'android',
    ]
    appId =[
            "app" :"com.custom.demo",
    ]
    /**
     * 高德库
     * 可以把所有的库版本放到这里来,方便统一管理
     */
    amap = [
            "location" :'com.amap.api:location:latest.integration'
    ]
}

然后在所有的module中使用配置文件

app/build.gradle

apply plugin: 'com.android.application'

def cfg = rootProject.ext.android
def appid = rootProject.ext.appId
def customSign= rootProject.ext.customSign
android {
    //定义签名newland
    signingConfigs {
        mySign {
            keyAlias customSign.keyAlias
            keyPassword customSign.keyPassword
            storeFile file(customSign.file)
            storePassword customSign.storePassword
        }
    }
    
    compileSdkVersion cfg.compileSdkVersion
    defaultConfig {
        applicationId appid['app']
        minSdkVersion cfg.minSdkVersion
        targetSdkVersion cfg.targetSdkVersion
        versionCode cfg.versionCode
        versionName cfg.versionName
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        multiDexEnabled true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            //使用签名newland
            signingConfig signingConfigs.mySign
        }
        debug {
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.mySign
        }
    }
    //aidl文件夹
    sourceSets {
        main {
            aidl.srcDirs = ['src/main/aidl', 'src/main/aidl/com/newland/payment/aidl']
        }
    }
    //渠道打包
    android.applicationVariants.all { variant ->
        //所有渠道,打包格式 Demo-V[版本名]([版本号)]-[打包时间]
        variant.outputs.all {
            String name = "Demo-V${defaultConfig.versionName}(${defaultConfig.versionCode})-${releaseTime()}"
            outputFileName = name + ".apk"
        }
    }
    // 使用Java1.8
    compileOptions {
        sourceCompatibility rootProject.ext.compileJavaVersion
        targetCompatibility rootProject.ext.compileJavaVersion
    }
    //指定module_XX的libs库路径
    repositories{
        flatDir{
            dirs 'libs','../module_XX/libs'
        }
    }
}


dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    testImplementation 'junit:junit:4.12'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation rootProject.ext.amap['location']
}

def static releaseTime() {
    return new Date().format("yyyyMMddHHmm", TimeZone.getTimeZone("GMT+08:00"))
}
//获取工程名
def static projectTag() {
    String projectPath = System.getProperty("user.dir")
    String projectName = projectPath.substring(projectPath.lastIndexOf('\\') + 1)
    return projectName.substring(0, projectName.lastIndexOf('-'))
}

遇到的问题

生成了两个图标

检查工程所有的AndroidManifest文件,是否有其他活动添加了主页属性

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

显然程序会根据配置的主页属性,出现多个对应的图标

删除掉不需要的入口即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值