Как создать андроидную библиотеку с Android Studio и gradle?

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

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

Обновление

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

Обновление 1

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

  • Создайте новый проект под названием MyApp
  • Нажмите File > New Module, выберите Android Library и назовите его MyLib
  • Нажмите 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

Добавление зависимости не влияет на ошибку. Продолжение сверху

  • Нажмите File > Project Structure > Modules > MyApp-MyApp
  • Перейдите на вкладку Dependencies
  • Нажмите + > Module Dependency и выберите MyLib
  • Нажмите Apply и OK
  • Нажмите 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

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

  • Добавьте compile project(':SubProjects:MyLib') в MyLib/build.gradle
  • Удалите compile files('libs/android-support-v4.jar') из MyLib/build.gradle
  • Закрыть проект и импортировать корневой проект из 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 файлы.

Ответ 1

Примечание. Этот ответ является чистым ответом Gradle, я использую его в IntelliJ на регулярной основе, но я не знаю, как интеграция с Android Studio. Я верю в то, что знаю, что происходит для меня, поэтому я использую Gradle и Android.

TL; DR Полный пример - https://github.com/ethankhall/driving-time-tracker/

Отказ от ответственности. Это проект, над которым я/работаю.

Gradle имеет определенную структуру (которую вы можете изменить, ссылка внизу описывает, как), которая очень похожа на Maven if вы когда-либо использовали его.

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'

Последнее, что вы должны убедиться в том, что subProjects/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')
}

Источники:

Ответ 2

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

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

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

http://tools.android.com/recent

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

Ответ 3

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

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

Сборкa > Сделать проект (пока вы, ребята, в сети, пусть он загружает файлы), а затем

Сборкa > Компилировать модуль "здесь отображается ваше имя приложения" (все еще он-лайн разрешает файлы -                                                          скачать и закончить), а затем

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

Вот и все!!! Счастливые Кодирующие парни!!!!!!!

Ответ 4

Gradle Build Tools 2.2.0+ - Все работает только

Это правильный способ сделать это

Пытаясь избежать экспериментальных и откровенно сытых по горло NDK и всех его хакеров, я рад, что появился 2.2.x из Gradle Build Tools, и теперь он просто работает. Ключ - это аргумент externalNativeBuild и pointing ndkBuild path в Android.mk или изменить ndkBuild на cmake и указать аргумент пути в CMakeLists.txt build script.

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 переходит на clang, поскольку gcc теперь устарел в Android NDK.