Android Studio w/gradle:包r不存在

Rob*_*ins 6 java android gradle android-studio

最终编辑:

这是一个很长的问题,有几个编辑,我不一定在每一步都做正确的事情.对于那些偶然发现这个问题且在Android Studio中将项目转换为gradle时遇到问题的人,我建议查看问题#16718026中提到的这个存储库并尝试导入它并编译并运行它.一旦有了工作,就可以更容易地看到自己的项目可能出现的问题.

总而言之,这就是我使用Android Studio .2.5将非Gradle Android Studio项目转换为有效的Gradle项目,我自动安装了Gradle 1.6和Gradle Plugin .5.

(1)创建了一个带有图标和活动的新的空白Android Studio项目.注意:我一开始并没有意识到这一点,因为我同时学习Android和Gradle,但Android Studio(无论如何在这个版本中)实际上为您设置了多项目设置,这对我来说很困惑.多项目意味着层次结构中项目上方有另一个文件夹,为存储所有项目的设置提供了一个位置.AS也没有,尽管视频指南创建的子项目文件夹中的文件的build.gradle(在我的情况,FrontlineSMS),说明会.所以我必须创建该子项目build.gradle文件,并创建一个非常简单的settings.gradle(参见下面的更新2).

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

(3)用于git mv根据Gradle Plugin用户指南中的约定将这些项目移动到适当的位置,在必要时替换或删除空白项目中的一些现有文件或文件夹.

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

(5)按照更新4中的描述导入项目

原始问题:

我是一个新手Android开发人员,试图将当前不使用Gradle(并编译并运行得很好)的Android Studio项目转换为在OS X上使用Gradle的Android项目.我遇到资源错误,我认为可能与我的项目结构,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
           ?                   ??? ...
Run Code Online (Sandbox Code Playgroud)

最值得注意的是,我将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;
Run Code Online (Sandbox Code Playgroud)

在几个文件中.我该怎么做才能让Android Studio/Gradle识别我在src/main/res下定义的资源?

阅读其他人的问题,我注意到这个错误的一些解决方案涉及将"gen /"文件夹标记为源根或"清理"项目.我尝试在根目录中创建gen /文件夹并将其标记为源但是不起作用.而且,重建项目只会给我带来同样的错误.

我的root build.gradle文件包含以下内容,

dependencies {
   compile project(':FrontlineSMS')
}
Run Code Online (Sandbox Code Playgroud)

而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
    }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试使用命令行构建时,./gradlew clean我收到此错误,

(removed error)
Run Code Online (Sandbox Code Playgroud)

除了我之前的问题,我还要感谢您可以提供有关如何构建此项目的任何提示.这不是一个多项目设置.谢谢你的帮助.

更新1

我能够从命令行生成一个APK.我的主要问题是我gradle clean从错误的目录调用.从FrontlineSMS调用它有效.当我只有一个项目时,我猜Android Studio为我设置了一个多项目设置,而我没有输入所有设置,即我没有创建一个settings.gradle文件.

更新2

创建了以下settings.gradle文件,它允许我gradle clean && gradle build从根目录(settings.gradle所在的位置)运行:

include ':FrontlineSMS'
Run Code Online (Sandbox Code Playgroud)

注意:我在这里使用的gradle版本是由homebrew 1.6安装的版本.如果我使用安装的gradlew包装,它说,

Gradle version 1.6 is required. Current version is 1.7
Run Code Online (Sandbox Code Playgroud)

在网上搜索此错误似乎表明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
Run Code Online (Sandbox Code Playgroud)

然后,下次我运行./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
Run Code Online (Sandbox Code Playgroud)

所以我更新build.gradle文件说

classpath 'com.android.tools.build:gradle:0.5'
Run Code Online (Sandbox Code Playgroud)

然后重新打开IDE,告诉我,

Could not find com.android.tools.build:gradle:0.5.
Run Code Online (Sandbox Code Playgroud)

Android Studio gradle插件和gradle版本是否捆绑在一起?如果是这样,我想要什么,gradle插件.4 + gradle 1.6或gradle插件.5和gradle 1.7?我该如何正确安装这些?

更新4

我终于通过命令行 IDE 编译了这个.诀窍是在创建基本Gradle文件后使用Gradle导入项目.谢谢Ethan!在导入项目过程中,您可以选择"从现有源创建项目"或"从外部模型导入项目".当我选择后者并选择Gradle时,我一直在选择前者.之后我选择"使用gradle-wrapper(推荐)"并选中"使用自动导入"并单击"完成".它告诉我一些我必须改变的事情,例如使用最新的gradle插件,我在我的build.gradle文件中对此进行了更改,

classpath 'com.android.tools.build:gradle:0.5.+'
Run Code Online (Sandbox Code Playgroud)

这是在android gradle插件的已知问题中提出的.

Eth*_*han 2

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

您将需要 settings.gradle 文件来访问位于源存储库内的子项目。

当您导入项目时,请务必选择 Gradle 作为源!