Як побудувати бібліотеку для Android з Android Studio та gradle?


144

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

Чи є спосіб зробити 3 проекти, за якими експорт Eclipse працює разом? Чи краще я реструктуризую речі і якщо так - це документація, як це робити?

Оновлення

Я завантажив весь проект у 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

Велика подяка Етану за вирішення цього питання.

  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. Були 2 прості зміни. Видаліть вміст із /build.gradle. {Я зробив це, тому що ви не визначили, що це за проект, тому я скаржився на те, що не знаєте, що робити з ним}, тоді я додав залежність від: SubProject: MyLib до: SubProject: MyApp. Потім я запустив ./gradlew: SubProject: MyApp: iD (iD карти для installDebug). Мені також довелося видалити дублікати libs / android-support-v4.jar. Оскільки це не "реальна" залежність, ви не можете її мати у двох місцях.
Етан

Я прокоментував запит на тягу. github.com/respectTheCode/android-studio-library-example/pull/1
увагоюTheCode

1
Варто згадати, якщо ви додасте compile 'com.google.android:support-v4:r6'до кожного свого проекту та плагін Maven (як у прикладі build.gradle нижче) замість compile files('libs/android-support-v4.jar')gradle зрозуміє, що обидва проекти містять одне і те ж і включить його лише один раз.
Етан

@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')
}

Я знаю, що це здається безліччю кроків, але вони досить легкі, коли ти робиш це один чи два рази. Цей спосіб також дозволить вам побудувати на сервері CI, якщо ви встановите там SDK для Android.

Бічна примітка 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. Я оновлю питання з помилкою, яку я отримую зараз.
поважаюКодекс

1
Я спробував клонувати ваш репо-просліджувач часу репортажу та імпортувати проект, але не збирався.
поважаю TheCode

Я щось забув, я зробив новий запит
Етан

1
Привіт @Ethan, здається , що ви досвідчений з Gradle, НЕ могли б ви сприяння з моїм питанням , а також: stackoverflow.com/questions/17479076 / ...
TacB0sS

@Ethan Чи можете ви допомогти з проблемою залежності у Gradle для Android?
JJD

6

У мене просто були дуже схожі проблеми з gradile builds / add .jar library. У мене це працює за допомогою комбінації:

  1. Переміщення папки libs до кореня проекту (той самий каталог, що і 'src'), і додавання бібліотеки до цієї папки в пошуку (за допомогою Mac OS X)
  2. У студії Android клацніть правою кнопкою миші папку, щоб додати її як бібліотеку
  3. Редагування залежностей у файлі build.gradle, додавання compile fileTree(dir: 'libs', include: '*.jar')}

Але що ще важливіше і дратує, лише через кілька годин після того, як я працюю, Android Studio щойно випустив 0,3.7, який стверджує, що вирішив багато проблем, таких як додавання бібліотек .jar

http://tools.android.com/recent

Сподіваюся, це допомагає людям!


1
Це питання стосується бібліотек Andriod, а не бібліотек Java .jar.
поважаю TheCode

2
Правда! Однак у мене виникли проблеми, пов’язані з gradle builds та андроїд-студією, і ця публікація була досить схожа, що допомогло привести мене до мого рішення - я просто подумав, що я поширюю хороші новини, якщо хтось інший привів до цього питання, і я був на тому самому становищі я.
Джоел Бальмер

1

Ось моє рішення для користувачів Mac, я думаю, що це працює і для вікон:

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

Створити> Зробити проект (поки ви, хлопці в Інтернеті, дозвольте завантажувати файли), а потім

Збірка> Модуль компіляції "тут відображається назва вашої програми" (все одно в Інтернеті нехай файли
завантажуються та закінчуються), а потім

Запустіть додаток, яке зробить, він запустить ваш емулятор і налаштує його, а потім запустить!

Це все !!! Щасливі хлопці з кодування !!!!!!!


0

Інструменти для збирання Gradle 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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.