第一次使用Android Studio配置(三):gradle项目构建
https://www.cnblogs.com/smyhvae/p/4456420.html
gradle优化配置,提高速度
第一步:配置.gradle文件夹目录(开启Gradle单独守护线程)
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -Dfile.encoding=UTF-8
// 配置编译时的jvm虚拟机 -Xmx:表示java虚拟机堆区内存可被分配的最大上限,通常为操作系统可用内存的1/4大小
//-XX:MaxPermSize:表示对非堆区分配的内存的最大上限(方法区)
//-Dfile.encoding=UTF-8 在JVM启动,设置系统文件编码格式为utf-8
org.gradle.daemon=true // 开启线程守护,第一次编译时开线程,后续构建可以复用,节约构建时间
org.gradle.parallel=true // 开启并行编译,相当于多条线程再走
org.gradle.configureondemand=true //按需配置,目前还在试验孵化阶段
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -Dfile.encoding=UTF-8
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.configureondemand=true
方式二:在settings设置配置
等同于 org.gradle.parallel=true
依赖库使用固定版本
api 'com.google.code.gson:gson:2.8.5'
不推荐的写法
api 'com.google.code.gson:gson:2.8.+'
离线模式配置:
所谓离线模式offline,就是gradle在解析依赖的时候采用本地的依赖库
若是项目中有新增或者修改依赖,则不能采用offline模式因为此时本地仓库中可能不存在项目需要的依赖
方式1-通过gradle动态开关切换离线模式
方式2-全局离线模式配置:Ctrl+Alt+S打开设置选项卡,找到Gradle选项,选中offline work,点击apply,如下
方式3-编译时开启离线模式:
上面配置等同于,直接在命令后加 --offline,如:gradlew build --offlline
参考:加快gradle的编译速度总结-亲身经历
https://www.jianshu.com/p/200d55b4d40a https://m.imooc.com/article/20533
1.更新配置Gradle版本
Gradle需要更新到5.4.1,在gradle/wrapper/gradle-wrapper.properties中配置:
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
然后就配置Android Plugin的版本
buildscript {
repositories {
jcenter()
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.2'
}
}
}
然后同步gradle。
通常情况下你会发现速度特别慢,因为没有翻墙,默认是从国外服务器下载gradle;
这时候就可以强制关闭程序,直接在网上找资源,gradle下载网址:http://services.gradle.org/distributions/ ,下载链接:https://services.gradle.org/distributions/gradle-5.5.1-all.zip,
把下载好的gradle-5.4.1-all.zip这个包,放在目录
C:\Users\%username%\.gradle\wrapper\dists\gradle-5.4.1-all
C:\Users\%username%\.gradle\wrapper\dists\gradle-5.4.1-all\3221gyojl5jsh0helicew7rwx
(3221gyojl5jsh0helicew7rwx 是随机码文件夹名字每台机器上不一样),注意不需要手动解压,然后重启程序自动同步gradle即可;
Flavor Dimensions变更
Android Plugin3.0依赖机制:在使用library时会自动匹配variant(debug, release),就是说app的debug会自动匹配library的debug,相信大多数人也像我一样,当library多了,不会手动选择每个Library的variant。现在好了,它会自动匹配了。同样如果使用flavor的时候,比如app的redDebug同样会自动匹配library的readDebug。虽然有优势,但是在使用flavor时,必须定义flavor dimension,否则会提示错误:
Error:All flavors must now belong to a named flavor dimension.
The flavor 'flavor_name' is not assigned to a flavor dimension.
加上默认的dimension;大概就是为了保证各个渠道包要保持某些属性的一致;总之按照官网上的说法,只要给每个渠道都设置一个“flavorDimensions”就可以了
这个错误,我也已经在使用Android Studio3.0以后碰到好多次了。现在使用flavor,必须像下面一样配置:
// Specifies a flavor dimension.
flavorDimensions "color"
productFlavors {
red {
// Assigns this product flavor to the 'color' flavor dimension.
// This step is optional if you are using only one dimension.
dimension "color"
...
}
blue {
dimension "color"
...
}
}
注意:如果library有两个dimensions:color,shape,但是app只有color,那么会如下的编译错误:
Error:Could not resolve all dependencies for configuration ':bar:redDebugCompileClasspath'.
Cannot choose between the following configurations on project :foo:
- redCircleDebugApiElements
- redSquareDebugApiElements
...
APP使用flavorSelection选定使用某个flavor dimension,注意如下配置:
android { ... // The flavorSelection property uses the following format: // flavorSelection 'dimension_name', 'flavor_name' // Chooses the 'square' flavor from libraries that specify a 'shape' // dimension. flavorSelection 'shape', 'square'}
使用annotationProcessor
使用annotationPorcessor代替apt
dependencies {
...
annotationProcessor 'com.google.dagger:dagger-compiler:<version-number>'
}
注意:目前apt可用,但是未来稳定版本会移除。
//1.在project的build.gradle中删除
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
//2.在module的build.gradle中删除
apply plugin:'android-apt'
//3.将module的build.gradle文件中的
dependencyapt 'com.jakewharton:butterknife-compiler:8.1.0'
改为annotationProcessor'com.jakewharton:butterknife-compiler:8.1.0'
gradle打包,自定义apk名称代码报错(Cannot set the value of read-only property 'outputFile' )
Error:(56, 0) Cannot set the value of read-only property 'outputFile' for ApkVariantOutputImpl_Decorated{apkData=Main{type=MAIN, fullName=debug, filters=[]}} of type com.android.build.gradle.internal.api.ApkVariantOutputImpl.
<a href="openFile:D:\eclipseCode\ipay-android\xinlebao\build.gradle">Open File</a>
解决 :修改文件名代码请这样写
android.applicationVariants.all { variant ->
variant.outputs.all {
outputFileName = "xinlebao_${defaultConfig.versionName}_${releaseTime()}.apk"
}
}
在主项目model中加入获取时间戳方法:
def buildTime() {
def date = new Date()
def formattedDate = date.format('yyyy_MM_dd--HH:mm')
return formattedDate
}
AAPT2 编译报错 AAPT2 error
-
报错
Error:java.util.concurrent.ExecutionException: com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details
-
解决:在gradle.properties中关闭APPT2 编译
android.enableAapt2=false
-
注:如果是eclipse转到as上的项目,可能没有gradle.properties文件,请在项目根目录中手动创建
参考链接:http://www.jianshu.com/p/9af06314e036
http://makaidong.com/bluestorm/970_9001358.html
http://blog.csdn.net/ncuboy045wsq/article/details/73521856
http://www.jianshu.com/p/9af06314e036
更新时间:2018/01/21
https://maven.google.com 连接不上的解决办法
dl.google.com 局域网可访问
https://maven.google.com 会 301 跳转到https://dl.google.com/dl/android/maven2/
所以直接替换 https://maven.google.com 为https://dl.google.com/dl/android/maven2/
maven { url 'https://dl.google.com/dl/android/maven2/'}
参考博客:http://blog.csdn.net/a06_kassadin/article/details/72796696
更新时间:2018/02/09
Can't process attribute android:fillColor="@color/text_gray": references to other resources are not
升级为android studio3.0,gradle升级为4.1,报错:
A failure occurred while executing com.android.build.gradle.tasks.MergeResources$FileGenerationWorkAction
> Error while processing D:\Android\WeishuProjects\Zszy\app\src\main\res\drawable\ic_right_gray_24dp.xml : Can't process attribute android:fillColor="@color/text_gray": references to other resources are not supported by build-time PNG generation.
解决方法:
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
你需要在项目的build.gradle脚本中,增加对Vector兼容性的支持
更新时间:2021/1/14
compile、implementation、api、compileOnly区别详解
在com.android.tools.build:gradle 3.0 以下版本依赖在gradle 中的声明写法
compile fileTree(dir: 'libs', include: ['*.jar'])
- 但在3.0后的写法为
implementation fileTree(dir: 'libs', include: ['*.jar'])
其实在新版本 Android Gradle plugin 3.0
中 已经将 compile
标记为过时了,而取而代之的是 implementation
和 api
两个关键字。那么它们有什么区别呢?
首先是2.x版本的依赖方式:
再来看看3.0的:
api==compile
api:跟2.x版本的 compile完全相同
implementation 实现接口依赖方式
implementation只能在内部使用此模块,比如我在一个libiary中使用implementation依赖了gson库,然后我的主项目依赖了libiary,那么,我的主项目就无法访问gson库中的方法。这样的好处是编译速度会加快,推荐使用implementation的方式去依赖,如果你需要提供给外部访问,那么就使用api依赖即可
这个指令的特点就是,对于模块A使用了该命令编译的依赖,项目中的其他模块将无法使用模块A里面的依赖,也就是将该依赖隐藏在内部,而不对外部公开。
使用了该命令编译的依赖,它仅仅对当前的 Moudle 提供接口。例如项目结构如下:
https://maven.fabric.io/public
LibraryA 中引用了 LibraryC 的库,如果对 LibraryC 的依赖用的是 implementation 关键字。 如下:
implementation project(path:':libraryC')
那么 LibraryC 中的接口,仅仅只能给 LibraryA 使用,而我们的 App Moudle 是无法访问到 LibraryC 提供的接口的,也就是将该依赖隐藏在内部,而不对外部公开。这就是 implementation 关键字的作用。
那为什么要这么做呢?
答案是: 1. 加快编译速度。2. 隐藏对外不必要的接口。
为什么能加快编译速度呢?
这对于大型项目含有多个 Moudle 模块的, 以上图为例,比如我们改动 LibraryC 接口的相关代码,这时候编译只需要单独编译 LibraryA 模块就行, 如果使用的是 api 或者旧时代的 compile,由于App Moudle 也可以访问到 LibraryC ,所以 App Moudle 部分也需要重新编译。当然这是在全编的情况下。
参考链接:https://juejin.im/post/5a0a71466fb9a045196918ab
自我总结:使用implementation 加快编译速度,只访问依赖的库项目,不会访问库里面嵌套依赖的库项目。报错的依赖库改api
compile(implementation,api)
这种是我们最常用的方式,使用该方式依赖的库将会参与编译和打包。
implementation:该依赖方式所依赖的库不会传递,只会在当前module中生效。
api:该依赖方式会传递所依赖的库,当其他module依赖了该module时,可以使用该module下使用api依赖的库。
当我们依赖一些第三方的库时,可能会遇到com.android.support冲突的问题,就是因为开发者使用的compile或api依赖的com.android.support包与我们本地所依赖的com.android.support包版本不一样,所以就会报All com.android.support libraries must use the exact same version specification (mixing versions can lead to runtime crashes这个错误。
provided(compileOnly)
只在编译时有效,不会参与打包
可以在自己的moudle中使用该方式依赖一些比如com.android.support,gson这些使用者常用的库,避免冲突。
更新时间:2018/8/8
android项目app中引用不到module下的jar包问题
在module中导入了***.jar或者在线的包,在app中如果想引用这个jar里相关的内容时,发现根本引用不到,会提示你add library/*****.jar 一大串,你回车一下或者点一下没反应,根本没有用。
只需把module下gradle里相关jar的implementation改为api即可,因为implementation 修饰的只能在当前module中引用,你在app下是引用不了的,你改完重新编译下即可进行引用了。
参考:https://blog.csdn.net/weixue9/article/details/80774418
主项目和库项目清单文件冲突错误
Error:Execution failed for task ':app:processDebugManifest'.
> Manifest merger failed with multiple errors, see logs
(Manifest合并失败)
解决:注释application属性
<!--Error:Execution failed for task ':app:processDebugManifest'.-->
<!--> Manifest merger failed with multiple errors, see logs-->
<!--清单文件合并错误-->
<!--android:icon="@mipmap/ic_launcher"-->
<!--android:label="@string/app_name"-->
<!--android:supportsRtl="true"-->
<!--tools:replace="android:icon, android:label,android:theme"-->
<!--android:theme="@style/AppTheme"-->
<application
android:allowBackup="true"
>
com.android.support冲突的解决办法
exclude group:表示只要包含com.android.support的都排除
例如:
api("com.afollestad.material-dialogs:core:0.9.5.0") {
exclude group: 'com.android.support'
}
module:删排除group中的指定module
例如:
api("com.afollestad.material-dialogs:core:0.9.5.0") {
exclude group: 'com.android.support', module: 'support-v13'
exclude group: 'com.android.support', module: 'support-vector-drawable'
}
自己创建的library库
在我们自己创建library给别人使用时,如果需要依赖com.android.support的话,建议用provided的方式依赖(android studio3.0中更改为compileOnly),这样只会在编译时有效,不会参与打包。以免给使用者带来不便。
例:
compileOnly 'com.android.support:appcompat-v7:26.1.0'
使用统一的support版本包
configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
def requested = details.requested
if (requested.group == 'com.android.support') {
if (!requested.name.startsWith("multidex")) {
// details.useVersion '26.1.0'
details.useVersion '27.1.1'
}
}
}
}
android studio生成aar包并在其他工程引用aar包
https://blog.csdn.net/getchance/article/details/47257389
。。。