Android Studio使用gradle:包r不存在

6

最终编辑:

这是一个比较长的问题,有几个编辑步骤,并且在每一步我都没有做正确的事情。对于那些想要将项目转换为Android Studio中的gradle但遇到困难的人,我建议查看此存储库,该存储库在问题# 16718026中提到,并尝试导入它并编译和运行它。一旦你有了可以工作的东西,就更容易看出自己项目可能存在的问题。

总结一下,以下是我使用Android Studio .2.5将非Gradle Android Studio项目转换为可工作的Gradle项目所做的操作,该版本自动安装了Gradle 1.6和Gradle插件.5。

(1) 创建一个带有图标和活动的新空白Android Studio项目。注意:起初我没有意识到这一点,因为我同时学习Android和Gradle,但是Android Studio(在这个版本中)实际上为您设置了一个多项目设置,这对我来说很令人困惑。多项目意味着在层次结构中,在您的项目上面有另一个文件夹,用于存储所有项目的设置。AS没有在子项目文件夹(在我的情况下是FrontlineSMS)中创建build.gradle文件,尽管视频指南表明它会这样做。因此,我不得不创建该子项目build.gradle文件,并创建一个非常简单的settings.gradle(请参见下面的更新2)。

(2) 将src /,res /,.git /,lib /,.gitignore和AndroidManifest.xml复制到新项目的根目录。

(3) 使用git mv将这些项移动到Gradle插件用户指南中规定的适当位置,必要时替换或删除空白项目中的一些现有文件或文件夹。

(4) 在我的子项目文件夹中创建了一个build.gradle并提供了一些基本设置(请参见下面或上面链接的问题)

(5) 如更新4所述导入项目

原始问题:

我是一名初学者Android开发人员,试图将一个当前不使用Gradle(编译和运行正常)的Android Studio项目转换为在OS X上使用Gradle的项目。 我被困在资源错误上,我认为这可能与我的项目结构,IDE中的设置,build.gradle文件中的设置或这些组合有关。

我进行转换的方式是首先在Android Studio中创建一个新项目,然后将文件复制到适当的位置,然后在IDE和build.gradle文件中添加一些设置。 我的结果项目结构是,

├── frontlinesms-for-android
     ├── build.gradle
     ├── gradle
     ├── gradlew
     ├── gradle.bat
     ├── settings.gradle (added in update 2)
     ├── local.properties
     ├── lib
        └── lib1.jar
        └── lib2.jar
        └── ...
     ├── frontlinesms-for-android.iml
     ├── FrontlineSMS
        └── build.gradle
        └── src
           ├── main
           │   └── res
           │   └── AndroidManifest.xml
           │   └── java
           │       └── net
           │           └── frontlinesms
           │               └── android
           │                   ├── FrontlineSMS.java
           │                   ├── ...

最值得注意的可能是我把res/文件夹放在与java/和AndroidManifest.xml同级的位置。我试图遵循Gradle插件用户指南中提到的惯例,以便不必在build.gradle文件中进行太多自定义。
我还将FrontlineSMS/src/main/java/net文件夹标记为源,因为如果我不这样做,就不会尝试编译任何东西。我在FrontlineSMS/build.gradle中创建了一个新的build.gradle文件,因为当我创建新项目时它不存在,即使Gradle网站上的教学视频说会存在。
在IDE中,我还设置了/lib中外部库的依赖关系。
当我尝试通过IDE编译时,会出现许多“Package r does not exist”错误,表明未生成或识别自动生成的R类。这在项目中被定义为:
import net.frontlinesms.android.R;

在几个文件中定义的资源应该如何处理,以便使得Android Studio / Gradle能够识别src/main/res目录下的内容?

阅读其他人的问题时,我注意到一些解决方案涉及将“gen/”文件夹标记为源根或“清理”项目。我尝试在根目录中创建gen/文件夹并将其标记为源,但没有起作用。重新构建项目仍然会出现相同的错误。

我的根build.gradle文件包含以下内容:

dependencies {
   compile project(':FrontlineSMS')
}

而FrontlineSMS/build.gradle文件中则有以下内容,

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.4'
    }
}
apply plugin: 'android'

dependencies {
   compile file('../lib/acra-3.1.1.jar')
   compile file('../lib/activation.jar')
   compile file('../lib/additionnal.jar')
   compile file('../lib/annotations.jar')
   compile file('../lib/libGoogleAnalytics.jar')
   compile file('../lib/mail.jar')
}

android {
    compileSdkVersion 17
    buildToolsVersion "17.0.0"

    defaultConfig {
        minSdkVersion 7
        targetSdkVersion 16
    }
}

当我尝试使用命令行构建并运行./gradlew clean时,出现以下错误:
(removed error)

除了我之前的问题,我也希望你能提供一些关于如何构建该项目的结构的技巧。这不是多个项目的设置。感谢您的帮助。
更新1: 我能够通过命令行生成APK。我的主要问题是我从错误的目录中调用了gradle clean。从FrontlineSMS中调用它就可以了。我猜Android Studio在我只有一个项目时为我设置了多项目设置,并且我还没有输入所有的设置,例如,我还没有创建settings.gradle文件。
更新2: 我创建了以下settings.gradle文件,使我可以从根目录(其中settings.gradle驻留)运行gradle clean && gradle build:
include ':FrontlineSMS'

注意:我在这里使用的Gradle版本是Homebrew安装的1.6版本。如果我使用已安装的gradlew包装器,则会显示:
Gradle version 1.6 is required. Current version is 1.7

搜索网络上的这个错误似乎表明Android目前不支持1.7版本,只支持1.6版本(也许总是落后于一两个版本),但这是在我使用Android Studio创建新项目时安装的版本!
更新3(编辑:基本上全部错误,请勿按照此操作)
尝试从Android Studio构建项目会产生与上述关于需要1.6版本的相同错误。我尝试重新导入该项目,但它说找不到任何源文件。我想这意味着(1)我有错误的gradle版本需要修复,或者(2)我需要在build.gradle文件中定义源文件,即使我认为我正在遵循指南中的约定。
我尝试复制gradle-wrapper-1.6.jar以替换gradle/wrapper/gradle-wrapper.jar,但当我通过./gradlew clean运行它时,它仅产生了一个类或方法未找到的错误。
尝试的解决方案:在gradle/wrapper/gradle-wrapper.properties中,有一行distributionUrl=,我将其更改为指向1.6版本。
distributionUrl=http\://services.gradle.org/distributions/gradle-1.6-bin.zip

下次我运行./gradlew clean时,它会将gradle的新版本下载到我的主目录~/.gradle中(直到现在我才意识到这个目录的存在),现在当我输入./gradlew --version时,它显示版本为1.6,并且使用./gradlew clean && ./gradlew build命令通过命令行构建所有内容,生成apks。因此,它似乎可以从命令行工作,但我也希望在IDE中工作。

在IDE中,它现在显示:

Project is using an old version of the Android Gradle plug-in. The minimum supported version is 0.5.0

所以我更新了build.gradle文件,将其更改为:
classpath 'com.android.tools.build:gradle:0.5'

重新打开IDE,它告诉我:

Could not find com.android.tools.build:gradle:0.5.

Android Studio的gradle插件和gradle版本是否有关联?如果有,我需要什么,gradle插件.4 + gradle 1.6还是gradle插件.5和gradle 1.7?如何正确安装这些?
更新4: 我最终通过命令行和IDE都编译了它。诀窍是在创建基本Gradle文件后使用Gradle导入项目。在导入项目过程中,有一步选择“从现有源代码创建项目”或“从外部模型导入项目”。我一直选择前者,但应该选择后者并选择Gradle。然后我选中了“使用gradle-wrapper(推荐)”并勾选了“使用自动导入”,然后点击完成。它警告我必须更改一些内容,例如使用最新的gradle插件,在我的build.gradle文件中进行了更改。
classpath 'com.android.tools.build:gradle:0.5.+'

这在Android Gradle插件的已知问题中被建议。


你能发布你的settings.gradle文件吗? - Ethan
3个回答

2

看起来你的项目根目录缺少settings.gradle文件。

你需要这个settings.gradle文件才能访问源代码库中的子项目。

导入项目时,请确保选择Gradle作为源!


1

实际上有几个要点:

进入文件 -> 设置 -> Gradle 并浏览到:

选择使用本地 Gradle 分发并浏览到:

c:\users\.gradle/wrapper/dists/gradle-1.6-bin/72srdo3a5eb3bic159kar72vok/gradle-1.6

这样做可以生效,但是你需要清除之前的所有内容,方法如下:
文件 -> 无效缓存/重启
然后重新进入,它将重新导入(如果上述步骤不完全正确,可能会提示您再次配置gradle)
现在应该可以工作了...您不必手动构建build.gradle文件。
顶级项目下的settings.gradle实际上也要修改。
最后,如果项目结构没有显示太多内容(我的只显示了平台设置,并没有大多数指南中的其他选项),您可以右键单击顶级项目,例如HelloWorldProject,然后选择模块设置,这可能会帮助您找到所需的内容。
上面的一些截图可能有所帮助 - 看起来他们正在更改布局等并隐藏某些内容,因此官方指南并不总是正确的。
抱歉不能为您发布图片。

0

附带多模块项目和多库项目的示例文件已被压缩。

http://tools.android.com/tech-docs/new-build-system/

滚动到底部。
关于。
Could not find com.android.tools.build:gradle:0.5.

这个jar包不在Maven中央仓库里,它是随Android Studio 0.2.+一起提供的。 通常发生在你从没有内部m2仓库的0.2之前升级Android Studio。安装全新的Android Studio应该可以解决问题。支持库也是同样的情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接