Android Studio 및 gradle을 사용하여 Android 라이브러리를 작성하는 방법은 무엇입니까?


144

Eclipse에서 프로젝트를 마이그레이션하려고하는데 시도한 것이 아무것도 없습니다. 이클립스에는 3 개의 프로젝트 (2 개의 안드로이드 앱 프로젝트 및 1 개의 안드로이드 라이브러리 프로젝트)가 있습니다. 2 개의 앱 프로젝트는 라이브러리 프로젝트에 따라 다릅니다. gradle 내보내기를 수행하면 작동하지 않는 3 개의 프로젝트가 생성됩니다. 프로젝트를 재구성 할 수는 있지만 어떻게 해야하는지에 대한 문서를 찾지 못했습니다.

이클립스 익스포트에서 3 개의 프로젝트를 함께 작동시키는 방법이 있습니까? 내가 구조 조정을하는 것이 더 낫습니까? 그렇다면 어떻게 해야하는지에 대한 문서가 있습니까?

최신 정보

전체 프로젝트를 GitHub https://github.com/respectTheCode/android-studio-library-example에 업로드했습니다.

업데이트 1

Padma Kumar의 제안을 바탕으로 이것이 내가 시도한 것입니다.

  1. 라는 새 프로젝트를 만듭니다 MyApp
  2. 을 클릭 File > New Module하고 선택 Android Library하고 이름을 지정하십시오.MyLib
  3. 딸깍 하는 소리 Build > Make Project

이 오류로 빌드가 실패합니다

Module "MyLib" was fully rebuilt due to project configuration/dependencies changes
Compilation completed with 1 error and 0 warnings in 19 sec
1 error
0 warnings
/.../MyApp/MyLib/build/bundles/debug/AndroidManifest.xml
Gradle: <manifest> does not have package attribute.

그런 다음 package매니페스트에 속성을 추가하여 만들었습니다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.mylib" >

빌드 후이 오류가 발생합니다

Module "MyApp" was fully rebuilt due to project configuration/dependencies changes
Compilation completed with 2 errors and 0 warnings in 13 sec
2 errors
0 warnings
/.../MyApp/MyLib/src/main/java/com/example/mylib/MainActivity.java
Gradle: package R does not exist
Gradle: package R does not exist

종속성을 추가해도 오류에 영향을 미치지 않는 것 같습니다. 위에서 계속

  1. 딸깍 하는 소리 File > Project Structure > Modules > MyApp-MyApp
  2. Dependencies탭으로 전환
  3. 클릭 + > Module Dependency하여 선택MyLib
  4. 클릭 Apply하고OK
  5. 딸깍 하는 소리 Build > Make Project

업데이트 2

이단의 제안에 따르면 이것은 우리가 얻는 곳입니다.

2 하위 프로젝트 build.gradle에는 올바른 부분이 모두있는 것 같으며 플러그인 라인은 다음과 같습니다 MyApp/build.gradle.

buildscript {
    repositories {
        maven { url 'http://repo1.maven.org/maven2' }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.4'
    }
}
apply plugin: 'android'

dependencies {
    compile files('libs/android-support-v4.jar')
}

android {
    compileSdkVersion 17
    buildToolsVersion "17.0.0"

    defaultConfig {
        minSdkVersion 7
        targetSdkVersion 16
    }
}

루트 프로젝트 build.gradle가 비어 있으므로 다음과 같이 두 개의 프로젝트를 추가했습니다.

dependencies {
    compile project(":MyLib")
    compile project(":MyApp")
}

빌드 할 때이 오류가 발생합니다.

Gradle:
FAILURE: Build failed with an exception.
* Where:
Build file '/Users/kevin/GitHub/AppPress/MyApp/build.gradle' line: 2
* What went wrong:
A problem occurred evaluating root project 'MyApp'.
> Could not find method compile() for arguments [project ':MyLib'] on root project 'MyApp'.
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

업데이트 3

이 문제를 해결해 준 Ethan에게 감사합니다.

  1. 추가 compile project(':SubProjects:MyLib')받는 사람MyLib/build.gradle
  2. 제거 compile files('libs/android-support-v4.jar')으로부터MyLib/build.gradle
  3. 프로젝트를 닫고 gradle에서 루트 프로젝트 가져 오기

업데이트 4

0.1.2부터는 compile "com.android.support:support-v4:13.0.0"대신에 포함 할 수 있습니다 compile files('libs/android-support-v4.jar'). mavin에서 나왔으므로 이제 여러 프로젝트에 문제없이 포함시킬 수 있습니다.

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:0.4.2'
    }
}

apply plugin: 'android'

dependencies {
    compile "com.android.support:support-v4:13.0.0"

    compile project(':SubProjects:MyLib')
}

업데이트 5

0.1.3부터 ​​툴바에 "프로젝트 동기화"버튼이 있습니다. .gradle파일 을 변경 한 후 프로젝트를 다시 가져 오는 대신 클릭 할 수 있습니다 .


github 프로젝트에 대한 풀 요청을했습니다. 두 가지 간단한 변경 사항이있었습니다. /build.gradle에서 컨텐츠를 제거하십시오. {나는 당신이 어떤 종류의 프로젝트인지 정의하지 않았기 때문에 이것을 했으므로, 그것과 관련이 무엇인지 모른다고 불평하고} : : SubProject : MyLib와 : SubProject : MyApp의 의존성을 추가했습니다. 그런 다음 ./gradlew : SubProject : MyApp : iD를 실행했습니다 (iD는 installDebug에 매핑 됨). 또한 중복 libs / android-support-v4.jar를 제거해야했습니다. '실제'의존성이 아니기 때문에 두 곳에서 가질 수 없습니다.
Ethan


1
당신이 추가하면 그것은 언급 할만큼 가치의 compile 'com.google.android:support-v4:r6'대신의 (아래 build.gradle 예처럼) 각 프로젝트와 받는다는 플러그인에 compile files('libs/android-support-v4.jar')두 프로젝트가 같은 일을 포함 한 번 만 포함 할 것이라는 점을 깨달을 것이다 Gradle을.
Ethan

@respectTheCode 샘플 github 프로젝트를 약간 정리하기 위해 풀 요청을 보냈습니다. 공유해 주셔서 감사합니다!
JohnnyLambada

답변:


115

참고 :이 답변은 순수한 Gradle 답변입니다 .IntelliJ에서 정기적으로 사용하지만 Android Studio와의 통합 방법을 모르겠습니다. 나는 나에게 무슨 일이 일어나고 있는지 아는 신자이므로 Gradle과 Android를 사용하는 방법입니다.

TL; DR 풀 예 - https://github.com/ethankhall/driving-time-tracker/

면책 조항 : 이것은 현재 진행중인 프로젝트입니다.

Gradle은 Maven과 매우 유사한 구조를 정의했습니다 (변경 가능, 하단 링크는 방법을 알려줍니다).

Project Root
+-- src
|   +-- main (your project)
|   |   +-- java (where your java code goes)
|   |   +-- res  (where your res go)
|   |   +-- assets (where your assets go)
|   |   \-- AndroidManifest.xml
|   \-- instrumentTest (test project)
|       \-- java (where your java code goes)
+-- build.gradle
\-- settings.gradle

하나의 프로젝트 만있는 경우 settings.gradle 파일이 필요하지 않습니다. 그러나 더 많은 프로젝트를 추가하고 싶기 때문에 필요합니다.

이제 build.gradle 파일을 살펴 보겠습니다. 당신은 (Android 도구를 추가하기 위해)이 필요합니다.

build.gradle

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

이제 Gradle에 일부 Android 부품에 대해 알려야합니다. 꽤 간단합니다. 기본적인 경우 (내 대부분의 경우 작동)는 다음과 같습니다. 이 블록에 주석이 있는데 APK 생성시 버전 이름과 코드를 지정할 수 있습니다.

build.gradle

apply plugin: "android"
android {
        compileSdkVersion 17
        /*
        defaultConfig {
            versionCode = 1
            versionName = "0.0.0"
        }
        */
    }

Gradle의 빛을 아직 보지 못한 사람을 돕기 위해 추가 할 무언가, 프로젝트를 설치하지 않고 사용할 수있는 방법.

build.gradle

task wrapper(type: org.gradle.api.tasks.wrapper.Wrapper) {
    gradleVersion = '1.4'
}

이제 우리는 하나의 프로젝트를 만들었습니다. 이제 우리는 다른 것들을 추가 할 것입니다. 디렉토리에 넣었을 수도 있고 deps 또는 subProjects라고 부를 수도 있습니다. 실제로는 중요하지 않지만 어디에 두어야하는지 알아야합니다. Gradle에게 프로젝트가있는 곳을 알리려면 settings.gradle에 프로젝트를 추가해야합니다.

디렉토리 구조 :

Project Root
+-- src (see above)
+-- subProjects (where projects are held)
|   +-- reallyCoolProject1 (your first included project)
|       \-- See project structure for a normal app
|   \-- reallyCoolProject2 (your second included project)
|       \-- See project structure for a normal app
+-- build.gradle
\-- settings.gradle

settings.gradle :

include ':subProjects:reallyCoolProject1'
include ':subProjects:reallyCoolProject2'

당신이 있는지의 확인해야 마지막 것은입니다 하위 프로젝트 / reallyCoolProject1 / build.gradle이 있습니다 apply plugin: "android-library"대신 apply plugin: "android".

모든 Gradle 프로젝트 (및 Maven)와 마찬가지로 이제 루트 프로젝트에 종속성에 대해 알려야합니다. 여기에는 원하는 일반적인 Java 종속성이 포함될 수도 있습니다.

build.gradle

dependencies{
    compile 'com.fasterxml.jackson.core:jackson-core:2.1.4'
    compile 'com.fasterxml.jackson.core:jackson-databind:2.1.4'
    compile project(":subProjects:reallyCoolProject1")
    compile project(':subProjects:reallyCoolProject2')
}

나는 이것이 많은 단계처럼 보이지만 한 번 또는 두 번하면 매우 쉽다는 것을 알고 있습니다. 이 방법을 사용하면 Android SDK가 설치되어 있다고 가정하고 CI 서버에서 빌드 할 수 있습니다.

NDK 측 참고 : NDK를 사용하려면 다음과 같은 것이 필요합니다. 예제 build.gradle 파일은 https://gist.github.com/khernyo/4226923 에서 찾을 수 있습니다.

build.gradle

task copyNativeLibs(type: Copy) {
    from fileTree(dir: 'libs', include: '**/*.so' )  into  'build/native-libs'
}
tasks.withType(Compile) { compileTask -> compileTask.dependsOn copyNativeLibs }

clean.dependsOn 'cleanCopyNativeLibs'

tasks.withType(com.android.build.gradle.tasks.PackageApplication) { pkgTask ->
  pkgTask.jniDir new File('build/native-libs')
}

출처 :

  1. http://tools.android.com/tech-docs/new-build-system/user-guide
  2. https://gist.github.com/khernyo/4226923
  3. https://github.com/ethankhall/driving-time-tracker/

1
감사합니다 @ 이것은 일부 공백을 채우지 않습니다. Android Studio에는 루트 프로젝트 build.gradle 만 누락되었습니다. 지금 받고있는 오류로 질문을 업데이트해야합니다.
respectTheCode

1
운전 시간 추적기 저장소를 복제하고 프로젝트를 가져 오려고했지만 컴파일되지 않았습니다.
respectTheCode

나는 무언가를 잊고 새로운 요청을했다
Ethan

1
안녕 @Ethan, 당신은 Gradle에 경험이있는 것 같습니다, 내 문제를 도와 줄 것입니다 : stackoverflow.com/questions/17479076/…
TacB0sS

@Ethan Gradle for Android 의 종속성 문제 를 도와 주실 수 있습니까 ?
JJD

6

방금 gradle 빌드 / .jar 라이브러리 추가와 비슷한 문제가 발생했습니다. 나는 그것을 조합하여 작동시켰다.

  1. libs 폴더를 프로젝트의 루트 ( 'src'와 동일한 디렉토리)로 이동하고 파인더에서이 폴더에 라이브러리 추가 (Mac OS X 사용)
  2. Android Studio에서 폴더를 마우스 오른쪽 버튼으로 클릭하여 라이브러리로 추가
  3. build.gradle 파일에서 종속성 편집 compile fileTree(dir: 'libs', include: '*.jar')}

그러나 더 중요하고 성가신 일이지만 Android Studio는 0.3.7을 출시했으며 .jar 라이브러리 추가와 같은 많은 gradle 문제를 해결했다고 주장합니다.

http://tools.android.com/recent

이것이 사람들을 돕기를 바랍니다!


1
이 문제는 Java .jar 라이브러리가 아닌 Andriod 라이브러리에 관한 것입니다.
respectTheCode

2
진실! 그러나 내 문제는 gradle 빌드 및 android studio와 관련이 있었으며이 게시물은 내 솔루션으로 이끌 수있을만큼 유사했습니다. 다른 사람 이이 질문에 이르렀을 때 좋은 소식을 전하고 동일한 위치에 있다고 생각했습니다. 나를.
Joel Balmer

1

다음은 Mac 사용자를위한 솔루션입니다. 창에서도 작동한다고 생각합니다.

먼저 Android Studio 툴바로 이동

빌드> 프로젝트 만들기 (온라인 상태 일 때 파일을 다운로드하도록 함)

빌드> 컴파일 모듈 "앱 이름이 여기에 표시됩니다"(여전히 파일을
다운로드하고 완료하도록하십시오)

완료된 앱을 실행하면 에뮬레이터가 시작되고 구성되어 실행됩니다!

그게 다야 !!! 행복한 코딩 녀석 !!!!!!!


0

Gradle Build Tools 2.2.0+-모든 것이 작동합니다

이것이 올바른 방법입니다.

실험을 피하고 NDK와 모든 해커를 솔직하게 먹어 치우기 위해 2.2.x의 Gradle Build Tools가 나왔으므로 이제는 작동합니다. 핵심은 externalNativeBuild및에서 가리키는 ndkBuild경로 인수 Android.mk또는 빌드 스크립트 에서 경로 인수로 변경 ndkBuild하여 cmake가리 킵니다 CMakeLists.txt.

android {
    compileSdkVersion 19
    buildToolsVersion "25.0.2"

    defaultConfig {
        minSdkVersion 19
        targetSdkVersion 19

        ndk {
            abiFilters 'armeabi', 'armeabi-v7a', 'x86'
        }

        externalNativeBuild {
            cmake {
                cppFlags '-std=c++11'
                arguments '-DANDROID_TOOLCHAIN=clang',
                        '-DANDROID_PLATFORM=android-19',
                        '-DANDROID_STL=gnustl_static',
                        '-DANDROID_ARM_NEON=TRUE',
                        '-DANDROID_CPP_FEATURES=exceptions rtti'
            }
        }
    }

    externalNativeBuild {
        cmake {
             path 'src/main/jni/CMakeLists.txt'
        }
        //ndkBuild {
        //   path 'src/main/jni/Android.mk'
        //}
    }
}

자세한 내용은 네이티브 코드 추가에 대한 Google 페이지를 확인하십시오 .

이것이 올바르게 설정되면 할 수 있습니다 ./gradlew installDebug. gcc가 이제 Android NDK에서 더 이상 사용되지 않으므로 NDK가 clang으로 이동하고 있음을 알아야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.