android studio的导入过程详见
https://blog.csdn.net/lslsd/article/details/107560890
依赖项目的AndroidManifest.xml里的默认启动activity,也就是
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
部分最好注释掉,不然可能出现两个图标
依赖项目的build.gradle里
1.出现报错:could not get unknown property for ‘applicationVariants’ for BuildType…
有用android.applicationVariants.all 的要换成
android.libraryVariants.all
2.apply plugin: 'com.android.application’要换成
apply plugin: ‘com.android.library’
3.applicationId …要去掉
当遇到 依赖项目和当前项目有可能图标冲突时,在AndroidManifest.xml的application标签里加上这一句可能就能解决冲突问题
tools:replace=“android:icon,android:label,android:theme,android:name”
The application could not be installed: INSTALL_FAILED_CONFLICTING_PROVIDER …
可能是因为
<provider
android:name=“androidx.core.content.FileProvider” android:authorities=“XXX”
…
authorities后面的部分和已经安装到当前设备的另一个app有冲突,极有可能 就是被导入作为依赖的 旧项目
据说comileSdkVersion、buildToolsVersion、minSdkVerion、targetSdkVersion这些版本号两个build.gradle文件最好设置成一样的,我的两个项目都一致就不存在这个问题了
当然在主项目的build.gradle的dependencies里
implementation project(":[依赖项目名称]")
一下不要忘了
出现报错:
“Circular dependency between…”
可能是两个module之间相互依赖了,也可能是粗心让module自己依赖自己了
出现报错:
“错误: 需要常量表达式”
R.id.XXX 识别不了
很遗憾查了很多方法后得到一个同样的答案------如果涉及到R类中的常量,只能把switch语句转化为if语句,一般用switch的地方语句都比较多,转换为if排版时真的难看,如果各位有办法在某个项目作为library后 涉及R文件ID时 仍能保留住switch语句,请在评论里告知吧,万分感谢!!!
大致原因好像是
switch里的case值必须是常数,而在library module的R文件里ID的值不是final类型的,但是主module的R文件里的ID值是final类型的,所以主module里可以用资源ID作为case值而library module却不能。
详见
http://tools.android.com/tips/non-constant-fields
今天学习了模块化开发进行统一管理的方式(主要是使用gradle.properties文件),在这里做一下总结
- gradle.properties文件里定义 minSdkVersion, targetSdkVersion,versionCode
versionName,compileSdkVersion, buildToolsVersion 等参数的对应变量
例如
#最小SDK版本
MIN_SDK_VERSION=15
#目标设备SDK版本
TARGET_SDK_VERSION=26
#SDK编译版本
COMPILE_SDK_VERSION=29
#
BUILD_TOOLS_VERSION=29.0.3
#所有模块版本号
VERSION_CODE=100
#所有模块版本名字
VERSION_NAME=1.0
#是否是Application
IS_APPLICATION=false
这里设置的IS_APPLICATION参数是控制部分本来作为library的module是否变成可单独运行的module,这个参数非常重要,有些module想单独调试时,就可以通过IS_APPLICATION参数设置其可单独运行,这样就可以方便很多,不用再连带启动整个project的无关内容,再一步步跳转到需要调试的module
楼主的设定是IS_APPLICATION为true时将某些 本来作为library的module 变成可以单独运行的module,后面就不再赘述了
- 在各个module里的build.gradle文件里,让这几个参数赋值gradle.properties文件里的这几个对应变量,注意非String型的要进行类型转换
例如
android {
compileSdkVersion COMPILE_SDK_VERSION.toInteger()
buildToolsVersion BUILD_TOOLS_VERSION
defaultConfig {
if (IS_APPLICATION.toBoolean()) {
applicationId "com.example.XXX..."
}
minSdkVersion MIN_SDK_VERSION.toInteger()
targetSdkVersion TARGET_SDK_VERSION.toInteger()
versionCode VERSION_CODE.toInteger()
versionName VERSION_NAME
...
}
}
- build.gradle文件里通过判断IS_APPLICATION的值,确定是否设置applicationId,作为library的module不能设置applicationId
例如
if (IS_APPLICATION.toBoolean()) {
applicationId "com.example.drawingapplication"
}
- build.gradle文件里通过判断IS_APPLICATION的值,确定apply的是application还是library
例如
if (IS_APPLICATION.toBoolean()) {
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}
-
build.gradle文件里的android.applicationVariants.all {}对应application型module, library型的module需要改成android.libraryVariants.all {},如果module里本来没有这部分内容就不必理会,这部分一般是控制输出的apk的名称,library型的module一般也用不到
-
build.gradle文件里通过判断IS_APPLICATION的值,确定是否implementation project(’:XXX’),也就是添加依赖,IS_APPLICATION为true时,有些library型的module变成了application型的module,自然就不能再作为依赖,如果仍旧implementation这些module,自然会报错,这一步也是必要的
例如
if (!IS_APPLICATION.toBoolean()) {
implementation project(':XXX')
}
- build.gradle文件里的 sourceSets部分通过判断IS_APPLICATION的值,确定应用哪个AndroidManifest.xml文件,这里需要说明的是我们需要编写两个AndroidManifest.xml,一个就是默认的不用管,另一个需要在module作为library时使用,可以新建一个manifest文件夹进行存放,manifest文件夹放在main文件夹下即可
因为作为application型的module和作为library型的module的AndroidManifest.xml文件还是有所不同的,比如library型的module的AndroidManifest.xml就不用设置自启动的activity,最好尽可能地简化
sourceSets部分内容如下
例如
sourceSets {
main {
if (IS_APPLICATION.toBoolean()) {
manifest.srcFile "src/main/AndroidManifest.xml"
} else {
manifest.srcFile "src/main/manifest/AndroidManifest.xml"
}
}
}
涉及内容较多,后续如有发现遗漏之处会继续补充
这样一通操作后,基本就可以通过修改gradle.properties里的IS_APPLICATION参数来控制module是作为library还是独立运行了
并且可以通过gradle.properties这一个单独的文件 一键设置所有module的compileSdkVersion等参数,也避免了module集成project时 因为这些参数不统一 而导致的项目无法构建 的问题
楼主现在也开始有意让自己习惯这种 用gradle.properties来集中控制module的项目构建方式,无论是单module还是多module的项目,开始可能有些繁琐,但终究会遇到凸显其意义的情景吧