一·Module基础
在使用库文件多项目的时候先掌握三个知识点 android application module(Phone&Tablet),android library module,java library module:
如题,我们知道,android stuido 中一个project中可以包含很多个module,主要是包含了android application module,android library module,java library module这三种module。
我现在的理解是android application module以作为一个可以运行的应用,而android library module和libs中的.jar文件一样,就是用来调用的库,而java library module也类似android library module。
疑问:
1.一个project中可以有多个android application module么?如果可以的话都可以作为一个单独的程序运行么?
可以又多个 app module, 都可以作为单独的程序运行,因为编译的时候是针对单个 module 编译的,而 module 之间也都是相互独立的,所以之间没有相互影响
2.android application module也可以像android library module一样当作库来调用么?
原则上 app module 也能像 library 一样当作库来调用(比如调用其中方法 ,活动),不过 AS 使用 Gradle 编译,而编译 app module 和 library module 时使用的插件是不一样的(生成结果也不同),所以也就不能直接作为库来调用,不过做一些简单的修改,就能马上修改成一个 library module 库,目录结构和代码都不需要改变,但已经不能生成app。
3.android library module可以作为一个程序运行么?
如刚才所说, library module 的编译结果不是 apk ,所以也就没法运行。
4.三者之间有什么区别?
app module 和 library module 以及 java/kotlin module 主要区别在于生成内容的不同,app module 生成 apk 程序文件。library module 生成 aar 文件,java/kotlin module 生成 jar 文件。 aar 和 jar 文件都可以作为 app 的依赖库,主要区别在于 aar 除了能携带编译好的程序以外,还能携带资源,是对jar文件的一个提升。
AS除了普通新建android library(library module)外,我们同时还可以将app module改成library。很简单,只需要改其项目中的build.gradle两个地方:
apply plugin: 'com.android.application'改成'com.android.library';
applicationId "com.example.myapplication" 去掉,库没有applicationId
若直接调用方法,报错如下:
Dependent features configured but no package ID was set
我们新建了库文件,如何引入库文件?第一种简单办法就是直接在dependencies添加,如下:
dependencies {implementation project(path: ':mylibrary')}
第二种就是在AS图形化界面上操作,
最后的效果跟第一种方法一样,在dependencies中引用了包。因为library module生成的是*.arr文件,所以我们在这个位置可以找到生成
二.项目外引用
如果想使用非本项目module该怎么处理。方法有3:
1.File>New>Import Module,Source Directionary路径选择文件名,选择模块。
2.File>New>New Module,或在工程上右键New>New Module,选择Improt Gradle Project,Source Directionary路径选择文件名,选择模块。
3.上面的两种方法操作完后你会发现,Finish完成后其实就是把别的工程里的module项目直接复制到本项目,这本身是没有什么问题,唯一的缺点就是当你在某一个工程中改了此module的代码后,其它引用了此module的工程代码并没有改变,当然肯定有解决方法,直接操作settings.gradle文件。
include ':in'
/*这里的in就是你即将引入的module在本工程的module name*/
project(':in').projectDir = new File('../androidTest1/in')
/*有一个叫<in>名的项目,目录地址是 new File('module path')*/
在settings.gradle中加入这两行代码,项目文件夹下就会多出来一个别的工程项目module,此时你随便在别的项目改,本工程都会对应改动,达到一劳永逸的效果。同时发现,不仅可以按上述方式引进module,还可以引进项目,路径选上一级就可。
三.注意点
1)app其实也是一个module,又叫主module,添加的叫次module。
2)在app的Mainfest顶端加上xmlns:tools="http://schemas.android.com/tools";主module 在application上加上tools:replace="android:name,allowBackup,icon,theme,label"。
3)若app和module有相同的dependencies依赖,需放入到module,避免冲突。且module不能用implementation,implementation声明的依赖只能在本module模块内使用,跨module使用就要使用api声明。
4)build.gradle中设置的compileSdkVersion buildToolsVersion minSdkVersion targetSdkVersion保持统一,否则合并报错。
5)module中application下的android:name,android:icon,android::label删除,否则安装后,在桌面上会有多个图标。