博主下载了tensorflow-lite官方给的demo进行学习,依旧被配环境问题浪费了不少时间。
build.gradle是android编程的必经之路,所以我学一点就记录一点,希望以后不要重复踩坑。
本文不仅讲两个gradle的区别,还会讲两个build.gradle的联系。
另外,还会提到:为什么添加了国内的源还是不管用呢?(第五部分的内容)
一、问题描述
点开项目,发现有两个build.gradle,一直没在意这两个gradle文件的区别,直到这次发现两个文件中都添加了下载依赖的源。
如果切换到真实目录:
可以看到一个在app文件夹下,一个在项目文件夹下。前者就是build.gradle(Module:app),后者就是build.gradle(Project:TFLiteJavaDemo)。
二、Project的build.gradle
先看下build.gradle(Project:TFLiteJavaDemo),被我修改过,不然从官方下载就用是无法sync成功的。每个部分的功能见注释:
buildscript {
repositories { //gradle脚本需要的资源
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter' }
// google()
mavenCentral()
// jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.4'
}
}
allprojects {
repositories { //项目自身需要的资源
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter' }
// google()
mavenCentral()
// jcenter()
}
}
// 以下四行注释来源:https://www.jianshu.com/p/c9ec9e2a506e
// 运行gradle clean时,执行此处定义的task。
// 该任务继承自Delete,删除根目录中的build目录。
// 相当于执行Delete.delete(rootProject.buildDir)。
// gradle使用groovy语言,调用method时可以不用加()。
task clean(type: Delete) {
delete rootProject.buildDir
}
特别提醒,tensorflow-lite:0.0.0-nightly.pom
文件目前需要在jcenter中下载,别的源我在浏览器中尝试发现尚未加入此文件,所以一定要添加国内的jcenter源:
maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter' }
三、Module的build.gradle
build.gradle(Module:app):
apply plugin: 'com.android.library'
//apply plugin: 'com.android.application'
android {
compileSdkVersion 26
buildToolsVersion "27.0.3"
defaultConfig {
// applicationId "android.example.com.tflitecamerademo"
// Required by Camera2 API.
minSdkVersion 21
targetSdkVersion 26
versionCode 1
versionName "1.0"
}
lintOptions {
abortOnError false
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
aaptOptions {
noCompress "tflite"
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
repositories {
maven { url 'https://google.bintray.com/tensorflow' }
maven { url 'http://repo.mycompany.com/maven2/' }
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter' }
}
allprojects {
repositories {
// Uncomment if you want to use a local repo.
// mavenLocal()
jcenter()
maven { url 'http://repo1.maven.org/maven2' }
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
google()
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:26+'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
implementation 'com.android.support:design:26+'
implementation 'com.android.support:support-annotations:25.3.1'
implementation 'com.android.support:support-v13:26+'
implementation files('libs/libandroid_tensorflow_inference_java.jar')
// implementation 'org.tensorflow:tensorflow-android:+'
implementation 'org.tensorflow:tensorflow:1.10.0'
implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly'
}
比较重要的是dependencies中的内容,里面声明了所有模块的依赖,这些在sync过程中无法下载的问题也是网上多数build.gradle文件所提及的(解决方法见本文第五部分)。
另外,注意到这个build.gradle文件中也有源的设置,这个和Project的gradle文件有什么区别和联系?
四、两个gradle的区别和联系
令我疑惑的是,为什么module的build.gradle文件中也有源的设置。相关资料显示:build.gradle(Project:XXX)是top-level gradle,它会影响到所有modules,而build.gradle(Module:XXX)仅影响XXX模块(一个project可能有很多个模块),而本程序只有应用程序模块(Module:app),所以只有一个模块gradle文件:build.gradle(Module:app),其作用域是app模块(如果打开project视图,可以发现这个.gradle文件在app文件夹下)。
在sync的过程中,我也发现了,app模块自身需要的依赖会从app的build.gradle中设置的源中下载,而不是从project的build.gradle中设置的源中下载,这足以说明:
build.gradle(Module:…)的设置和build.gradle(Project:…)的设置如果发生冲突,那么前者覆盖后者。
五、设置国内源不能解决下载依赖失败
请检查sync过程:
在这里,你可以查看你的AS是从哪个网址下载的依赖,
⚠️请仔细检查这里的网址!
如果你发现它并没有按照你设置的国内源下载东西,那么请参照这篇文章,此文提到了并不是简单添加国内源就能解决问题,还涉及到HTTP poxy的设置,我相信你们中的大部分都曾经设置过这个东西:
这是导致我设置了国内源,并注释掉了google()和jcenter(),sync过程依旧会从这两个地方而不是我设置的源下载东西的原因。