安卓 导入旧项目作为新项目依赖 的经验汇总

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文件),在这里做一下总结

  1. 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,后面就不再赘述了

  1. 在各个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
        ...
    }
}
  1. build.gradle文件里通过判断IS_APPLICATION的值,确定是否设置applicationId,作为library的module不能设置applicationId

例如

if (IS_APPLICATION.toBoolean()) {
            applicationId "com.example.drawingapplication"
        }
  1. build.gradle文件里通过判断IS_APPLICATION的值,确定apply的是application还是library

例如

if (IS_APPLICATION.toBoolean()) {
    apply plugin: 'com.android.application'
} else {
    apply plugin: 'com.android.library'
}

  1. build.gradle文件里的android.applicationVariants.all {}对应application型module, library型的module需要改成android.libraryVariants.all {},如果module里本来没有这部分内容就不必理会,这部分一般是控制输出的apk的名称,library型的module一般也用不到

  2. build.gradle文件里通过判断IS_APPLICATION的值,确定是否implementation project(’:XXX’),也就是添加依赖,IS_APPLICATION为true时,有些library型的module变成了application型的module,自然就不能再作为依赖,如果仍旧implementation这些module,自然会报错,这一步也是必要的

例如

if (!IS_APPLICATION.toBoolean()) {
        implementation project(':XXX')
    }
  1. 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的项目,开始可能有些繁琐,但终究会遇到凸显其意义的情景吧

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值