Как создать библиотеку Android с Android Studio и Gradle?

144

Я пытаюсь перенести проект из Eclipse, но ничего из того, что я пробовал, не работает. В Eclipse у меня есть 3 проекта (2 проекта приложений для Android и 1 проект библиотеки для Android). 2 проекта приложения зависят от проекта библиотеки. Когда я делаю экспорт gradle, я получаю 3 проекта, которые не работают. Я открыт для реструктуризации проекта, но не нашел документации о том, как это сделать.

Есть ли способ заставить работать вместе 3 проекта, которые экспортирует Eclipse? Я лучше перестроить вещи, и если да, то документация о том, как это должно быть сделано?

Обновить

Я загрузил весь проект на GitHub https://github.com/respectTheCode/android-studio-library-example

Обновление 1

Основываясь на предложениях Падмы Кумар, это то, что я попробовал.

  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

Основываясь на предложениях Итана, это то, где мы получаем

build.gradleПохоже, что в подпроекте 2 есть все правильные части, и единственная разница заключается в том, что плагин ниже 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

Большое спасибо Итану за решение этого.

  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файлы.

respectTheCode
источник
Я сделал запрос на удаление для вашего проекта GitHub. Было 2 простых изменения. Удалите содержимое из вашего /build.gradle. {Я сделал это, потому что вы не определили, что это за проект, поэтому он жаловался на то, что не знает, что с ним делать}, затем я добавил зависимость от: SubProject: MyLib к: SubProject: MyApp. Затем я запустил ./gradlew: SubProject: MyApp: iD (iD отображает для установки Debug). Мне также пришлось удалить дубликаты libs / android-support-v4.jar. Поскольку это не «реальная» зависимость, вы не можете иметь ее в двух местах.
Этан
Я прокомментировал запрос на извлечение. github.com/respectTheCode/android-studio-library-example/pull/1
respectTheCode
1
Стоит отметить, что если вы добавите compile 'com.google.android:support-v4:r6'в каждый из своих проектов плагин maven (как в примере build.gradle ниже) вместо compile files('libs/android-support-v4.jar')gradle, то поймете, что оба проекта включают в себя одно и то же, и включит его только один раз.
Итан
@respectTheCode Я отправил запрос на удаление, чтобы немного очистить ваш пример проекта github. Спасибо, что поделился!
JohnnyLambada
Возможный дубликат Android-студии, Gradle и NDK
Кэмерон Лоуэлл Палмер

Ответы:

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 или подпроектами. Это на самом деле не имеет значения, но вам нужно знать, куда вы положили. Чтобы сообщить 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')
}

Я знаю, что это кажется большим количеством шагов, но они довольно просты, если вы сделаете это один или два раза. Этот способ также позволит вам использовать CI-сервер, если на нем установлен Android SDK.

Примечание стороны 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
Спасибо @Ethan, это действительно заполняет некоторые из пробелов. В Android Studio отсутствовал только корневой проект build.gradle. Я обновлю вопрос с ошибкой, которую я получаю сейчас.
респект TheCode
1
Я пытался клонировать репозиторий с отслеживанием времени вождения и импортировать проект, но он не будет компилироваться.
респект TheCode
Я забыл что-то, я сделал новый запрос
Итан
1
Привет @Ethan, похоже, у тебя есть опыт работы с Gradle, не могли бы вы помочь мне и с моей проблемой: stackoverflow.com/questions/17479076/…
TacB0sS
@Ethan Можете ли вы помочь с проблемой зависимости с Gradle для Android, пожалуйста?
JJD
6

У меня были очень похожие проблемы с сборкой / добавлением библиотеки .jar. Я получил это с помощью комбинации:

  1. Перемещение папки libs в корневой каталог проекта (в том же каталоге, что и src) и добавление библиотеки в эту папку в Finder (с использованием Mac OS X).
  2. В Android Studio щелкните правой кнопкой мыши папку, чтобы добавить ее в библиотеку.
  3. Редактирование зависимостей в файле build.gradle, добавление compile fileTree(dir: 'libs', include: '*.jar')}

Но что еще более важно и досадно, всего через несколько часов после того, как я начал работать, Android Studio только что выпустила 0.3.7, в которой утверждается, что она решает множество проблем, таких как добавление библиотек .jar.

http://tools.android.com/recent

Надеюсь, это поможет людям!

Джоэл Балмер
источник
1
Эта проблема касается библиотек Andriod, а не библиотек Java .jar.
respectTheCode
2
Правда! Тем не менее, моя проблема была связана с сборками gradle и андроид-студией, и этот пост был достаточно схожим, чтобы помочь привести меня к решению - просто подумал, что я расскажу хорошие новости, если кто-то еще попадет на этот вопрос и будет в том же положении. меня.
Джоэл Балмер
1

Вот мое решение для пользователей Mac, я думаю, что это работает и для окна:

Сначала перейдите на панель инструментов Android Studio

Build> Make Project (пока вы, ребята, онлайн, дайте ему возможность скачивать файлы), а затем

Build> Compile Module «здесь отображается имя вашего приложения» (все еще в сети, пусть файлы
загружаются и заканчиваются), а затем

Запустите приложение, которое готово, оно запустит ваш эмулятор и настроит его, а затем запустит!

Вот и все !!! С Днем кодирования ребята !!!!!!!

Henula
источник
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и пошли. Вам также нужно знать, что NDK переходит на лязг, поскольку gcc теперь не поддерживается в Android NDK.

Кэмерон Лоуэлл Палмер
источник