AS build.gradle——tensorflow-lite官方项目两个build.gradle详解以及无法下载依赖的解决方法

时间:2024-03-31 10:11:39

博主下载了tensorflow-lite官方给的demo进行学习,依旧被配环境问题浪费了不少时间。

build.gradle是android编程的必经之路,所以我学一点就记录一点,希望以后不要重复踩坑。

本文不仅讲两个gradle的区别,还会讲两个build.gradle的联系

另外,还会提到:为什么添加了国内的源还是不管用呢?(第五部分的内容)

一、问题描述

点开项目,发现有两个build.gradle,一直没在意这两个gradle文件的区别,直到这次发现两个文件中都添加了下载依赖的源。
AS build.gradle——tensorflow-lite官方项目两个build.gradle详解以及无法下载依赖的解决方法
如果切换到真实目录:
AS build.gradle——tensorflow-lite官方项目两个build.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 build.gradle——tensorflow-lite官方项目两个build.gradle详解以及无法下载依赖的解决方法
在这里,你可以查看你的AS是从哪个网址下载的依赖,

⚠️请仔细检查这里的网址!

如果你发现它并没有按照你设置的国内源下载东西,那么请参照这篇文章,此文提到了并不是简单添加国内源就能解决问题,还涉及到HTTP poxy的设置,我相信你们中的大部分都曾经设置过这个东西:
AS build.gradle——tensorflow-lite官方项目两个build.gradle详解以及无法下载依赖的解决方法
这是导致我设置了国内源,并注释掉了google()和jcenter(),sync过程依旧会从这两个地方而不是我设置的源下载东西的原因。