首页 > 技术文章 > Android开发 组件化_新增/导入/删除Module项目操作 与 设置Module项目的Libs的Jar在主项目里使用

guanxinjing 2019-11-19 14:13 原文

前言

   Module项目,顾名思义就是作为app的独立的单元模块的项目。

  在小型app项目里因为没有这么多页面与java文件,所以模块意义不大,所以在小型项目里意义更多是用于管理libs,毕竟将所有的第三方库都放到主项目的libs下,如果第三方库多了管理这个libs文件夹会特别费劲,因为文件太多了。我们可以将一些重量级的第三方库独立用一个Module管理。

  而在大型项目里意义就很大了,因为Android开发是不建议在主项目里放入大量的文件来管理各个模块的,一方面很乱各种依赖,另一方面也违背了插拔模块与面对对象的思想。所以将一些模块独立开放到module里意义重大,这样在分工开发的时候各自的开发人员只需要关注自己的module项目就行了。 另外各个java文件也可以很平面化管理(只在项目里创建几个类别文件),而不是根据一个模块在主项目里创建一个这个模块名称的文件夹,然后在里面又创建类别文件夹在来区分放入各种这个模块的activity、adapter、util、widget、bean。正确做法应该将这个模块独立成一个module项目。

添加一个新的Module项目

    第一步:在Android studio的菜单栏 找到 > File > New > New Module... 点击进入 Create New Module

    

    选择Android Library 点击 Next

    第二步:输入项目名称

    

    

导入一个旧的Module项目

  第一步:在Android studio的菜单栏 找到 > File > New > Import Module... 点击进入

  

   第二步:导入一个自己需要的项目,并且设置名称,点击Finish。我这里选择了一个叫MyModule的项目

 

 

 成功导入后我们可以在目录下面看到这个项目。

  第三步,导入完成后并不是结束了,现在需要配置这个项目成为library项目

  1.首先我们需要进入我们的app主项目的build.gradle下添加这个项目

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'

    implementation project(':MyModule')//在这里引用项目 注意别忘记:号

}

  2.修改根目录下的settings.gradle文件 添加上你导入的项目名称

include ':app', 'MyModule'
rootProject.name='FragmentDemo'

     3.打开MyModule项目下的build.gradle,我们将在这里配置相关属性,首先我们看看如果没有配置过的build.gradle是什么样的并且标注要修改的点

  没有修改过过的build.gradle

apply plugin: 'com.android.application' //这里要修改成 'com.android.library'

android {
    compileSdkVersion 28                    
    defaultConfig {
        applicationId "com.zh.mymodule"    //这个id要去掉
        minSdkVersion 27                   //注意这里的最低版本,需要与主项目一致
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

  修改后

apply plugin: 'com.android.library'

android {
    compileSdkVersion 28
    defaultConfig {
        minSdkVersion 27
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

  4.重新编译整个项目,就可以看到我们的项目变成library项目了

删除一个Module项目

  1.去掉settings.gradle文件里,需要删除的项目名称。 这步很重要如果不删除这个项目名称,你无法在Android studio里删除这个导入的项目,并且就算手动在文件夹里删除目录Android studio依然自动生成这个项目的目录

  2.去掉app主项目的build.gradle文件里,implementation project()的项目

  3.然后就是重新编译一下项目,这个时候项目的library属性就被去除了,然后直接删除这个项目即可。

设置Module项目的Libs的Jar在主项目里使用

1.在项目里添加libs包,并且加入jar

 

2.设置这个module项目的build.gradle

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    api files('libs/xxxxxxxx.1.0_L.jar') //关键点 api files
}

这样就可以在主项目上使用这个jar包了,而不是jar只局限在这个module项目里

设置Module的github依赖项目可以被其他Module调用

有时候我们会将一些网络请求或者推送封装成一个module,但是有个问题怎么将Module依赖的库给其他Module调用,如下:

dependencies {
    //略...
    implementation 'com.squareup.retrofit2:retrofit:2.6.2'
    implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
    implementation 'com.squareup.okhttp3:logging-interceptor:4.4.0'//okhttp拦截器

}

上面这个依赖的3个库是无法提供给外部调用的只要将它们的implementation 修改成 api即可。

implementation这个指令的特点就是,对于使用了该命令编译的依赖,对该项目有依赖的项目将无法访问到使用该命令编译的依赖中的任何程序,也就是将该依赖隐藏在内部,而不对外部公开。

 

 

    

END

推荐阅读