由于目标工程的开发环境和本机的运行环境差异,打开/导入的过程可能会遇到诸多问题,常见的问题如下。
Android Studio导入项目会一直卡在Building gradle project info界面
出现这个问题是因为项目所使用的gradle与Android Studio自带的gradle版本不一致,导致需要下载该项目需要的gradle版本,直至下载完成。由于国内网络因素,该下载过程会非常缓慢,可通过如下方式解决。
首先查询待导入工程的开发gradle版本号,该version号可以在工程下的gradle\wrapper下的gradle-wrapper.properties文件内查询。至Gradle官网地址(http://services.gradle.org/distributions/)直接下载对应或者更新的gradle版本,如为单机使用,下载bin.zip版本即可。
删除工程下的gradle文件夹,打开工程时会提示“没有gradle设置文件,是否需要下载”,此时选择cancel,进入手动设置gradle模式。将gradle的路径选择到AS安装目录下,如C:\Program Files\Android\Android Studio\gradle,选择相应的gradle版本。之后工程会进入正常的打开阶段,打开过程会自动执行工程sync过程。sync执行完成后即打开工程成功,否则可能引发如下问题。
Gradle sync failed: This Gradle plugin requires Studio 3.0 minimum
出现该问题是因为目标工程开发时的AS版本较当前运行版本更新,此时需要将该运行环境的依赖版本改到当前运行版本下,即当前的AS版本。
在AS中打开工程文件,其中的build.gradle中包含
"classpath ‘com.android.tools.build:gradle:3.0.0’"
其中的version号表示的是当前gradle运行环境的版本号,即AS的版本号,这里是3.0.0表示该工程建立时,gradle是在AS3.0.0版本下运行的。如果AS的版本号停留在2.3.3,则将之改为2.3.3再sync工程即可。sync执行完成后即打开工程成功,否则可能引发如下问题。
Gradle sync failed: Could not find method implementation() for arguments [directory ‘libs’] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.
这个问题同样是由于目标工程的开发环境和当前运行环境不同造成的。
由于在较新的开发环境中可以直接implementation()的部分,在当前的运行环境下仍有待编译,此时转到implementation()所在的文件,即build.gradle(Module:app),注意这里的build.gradle和上文的同名文件并不相同,上文修改当前运行AS版本的为build.gradle(Project: 工程名)。从名称可以看出,build.gradle(Project: 工程名)是针对整个工程的,而build.gradle(Module:app)是针对当前模块的,当工程下包含多个模块时(有时有很多模块作为引用库存在),就会有多个build.gradle(Module:app),Module后跟的是模块名,单模块的工程默认名称为app,后续添加的模块需要在名称上加以区分。
将build.gradle(Module:app)下所有的implementation()替换为compile,注意是所有的,因为还可能出现诸如androidTestImplementation、testImplementation等implementation()的镜像,其中的Implementation关键字都需要用compile替换。替换完成后再次执行sync。
我在这里sync依旧失败,原因是导入的工程目标运行环境(targetSdkVersion)是26,即Android8.0,而AS2.3.3开发的项目仅支持SdkVersion最大至25的工程(Android7.0)。如要在当前环境下继续执行该工程,除了要将targetSdkVersion改到26以下,还需要将后面的dependencies下的内容同步修改。我从一个之前做的工程里拷贝了这部分dependencies的内容。再次sync后成功,编译通过。但是这种方法仅限于导入工程中没有涉及到新版本的功能,如果已经使用了新开发环境的方法或者涉及到新功能,那么还是将运行环境(AS版本)升级到最新版保险。