Jak zbudować bibliotekę Androida za pomocą Android Studio i gradle?

Próbuję przenieść projekt z Eclipse, ale nic nie działa. W Eclipse mam 3 projekty (2 projekty aplikacji na Androida i 1 projekt biblioteki na Androida). 2 projekty aplikacji zależą od projektu biblioteki. Kiedy robię eksport gradle dostaję 3 projekty, które nie działają. Jestem otwarty na restrukturyzację projektu, ale nie znalazłem żadnej dokumentacji, jak to zrobić.

Czy istnieje sposób, aby 3 projekty, które eksportują Eclipse, działały razem? Czy mi lepiej restrukturyzacja rzeczy, a jeśli tak to dokumentacja jak to zrobić?

Update

Załadowałem cały projekt na GitHub https://github.com/respectTheCode/android-studio-library-example

Update 1

Opierając się na sugestiach Padmy Kumara, to jest to, czego próbowałem.

  1. Utwórz nowy projekt o nazwie MyApp
  2. Kliknij File > New Module, wybierz Android Library i nazwij go MyLib
  3. Kliknij Build > Make Project
Nie jest to jednak możliwe.]}
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.

Następnie dodałem package atrybut do manifestu czyniąc go

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

Po zbudowaniu dostaję ten błąd

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

Dodanie zależności nie wydaje się mieć żadnego wpływu na błąd. Kontynuując z góry

  1. Kliknij File > Project Structure > Modules > MyApp-MyApp
  2. Przełącz na Dependencies zakładkę
  3. Kliknij + > Module Dependency i wybierz MyLib
  4. Kliknij Apply i OK
  5. Kliknij Build > Make Project

Aktualizacja 2

Na podstawie sugestii od Ethana tutaj otrzymujemy

Projekt 2 build.gradle wydaje się mieć wszystkie poprawne części i jedyną różnicą jest linia wtyczki poniżej jest 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
    }
}

Projekt root build.gradle był pusty, więc dodałem dwa projekty takie jak ten

dependencies {
    compile project(":MyLib")
    compile project(":MyApp")
}
Teraz dostaję ten błąd podczas budowania]}
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.

Update 3

Wielkie dzięki Ethan za rozwiązanie tego problemu.
  1. Dodaj compile project(':SubProjects:MyLib') do MyLib/build.gradle
  2. Usuń compile files('libs/android-support-v4.jar') z MyLib/build.gradle
  3. Zamknij projekt i zaimportuj główny projekt z gradle

Update 4

Od wersji 0.1.2 możesz teraz dołączyć compile "com.android.support:support-v4:13.0.0" zamiast compile files('libs/android-support-v4.jar'). Ponieważ pochodzi z mavin, możesz to bez problemów włączyć do wielu projektów.

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

Update 5

Od wersji 0.1.3 na pasku narzędzi znajduje się przycisk "Synchronizuj projekt". Możesz kliknąć to, zamiast ponownie zaimportować projekt po dokonaniu zmian w plikach .gradle.

Author: respectTheCode, 2013-05-23

4 answers

Uwaga: ta odpowiedź jest czystą odpowiedzią Gradle, używam tego w IntelliJ na bieżąco, ale nie wiem, jak jest integracja z Android Studio. Wierzę, że wiem, co się dla mnie dzieje, więc tak używam Gradle i Androida.

TL; DR Pełny przykład- https://github.com/ethankhall/driving-time-tracker/

Disclaimer: jest to projekt, nad którym pracuję.

Gradle ma zdefiniowane struktura (którą możesz zmienić, link na dole mówi ci, jak ) jest bardzo podobna do Mavena, jeśli kiedykolwiek go używałeś.

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

Jeśli masz tylko jeden projekt, ustawienia.plik gradle nie jest potrzebny. Jednak chcesz dodać więcej projektów, więc potrzebujemy go.

[10]} Teraz rzućmy okiem na tę konstrukcję.plik gradle. W tym celu należy dodać narzędzia do systemu android.]}

Buduj.gradle

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

Teraz musimy powiedzieć Gradle ' owi o niektórych Części Androida. To dość proste. Podstawowy (który działa w większości moich przypadków) wygląda następująco. Mam komentarz w tym bloku, to pozwoli mi określić nazwę wersji i Kod podczas generowania APK.

Buduj.gradle

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

Coś, co chcemy dodać, aby pomóc każdemu, kto nie widział jeszcze Światła Gradle, sposób na korzystanie z projektu bez instalowania go.

Buduj.gradle

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

Więc teraz mamy jeden projekt do zbudowania. Teraz dodamy Pozostałe. Umieszczam je w katalogu, może nazwałbym to deps, albo podprojektami. To nie ma znaczenia, ale musisz wiedzieć, gdzie go umieścić. Aby powiedzieć Gradle, gdzie są projekty, musisz dodać je do ustawień.gradle.

Struktura Katalogów:

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

Ustawienia.gradle:

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

Ostatnią rzeczą, której powinieneś się upewnić, to podprojekty / reallyCoolProject1 / build.gradle ma apply plugin: "android-library" zamiast apply plugin: "android".

Jak każdy projekt Gradle (i Maven) musimy teraz powiedzieć projektowi root o jego zależności. Może to również obejmować dowolne normalne zależności Java, które chcesz.

Buduj.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')
}

Wiem, że to wydaje się dużo kroków, ale są one dość łatwe, gdy robisz to raz lub dwa. Ten sposób pozwoli Ci również zbudować na serwerze CI, zakładając, że masz Androida SDK zainstalowany tam.

NDK Uwaga: Jeśli zamierzasz używać NDK, będziesz potrzebował czegoś takiego jak poniżej. Przykładowa Budowa.plik gradle można znaleźć tutaj: https://gist.github.com/khernyo/4226923

Buduj.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')
}

Źródła:

  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/
 115
Author: Ethan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-23 18:19:43

Właśnie miałem bardzo podobne problemy z Gradle builds / adding .biblioteka jar. Działa mi przez kombinację:

  1. przeniesienie folderu libs do katalogu głównego projektu (tego samego katalogu co 'src') i dodanie biblioteki do tego folderu w Finderze (przy użyciu Mac OS X)
  2. W Android Studio kliknij prawym przyciskiem myszy folder, aby dodać go jako bibliotekę
  3. Edycja zależności w kompilacji.gradle file, dodanie compile fileTree(dir: 'libs', include: '*.jar')}
Ale co ważniejsze i denerwujące, tylko godziny po uruchomieniu Android Studio właśnie wydało 0.3.7, który twierdzi, że rozwiązał wiele problemów gradle, takich jak dodawanie .biblioteki jar

Http://tools.android.com/recent

Mam nadzieję, że to pomoże ludziom!
 6
Author: Joel Balmer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-04 16:58:55

Oto moje rozwiązanie dla użytkowników mac myślę, że działa również dla Windowsa:

Najpierw przejdź do paska narzędzi Android Studio

Build > Make Project (gdy jesteście online niech ściągnie pliki) a następnie

Build > Compile Module "your app name is showed here" (still online let the files are
Pobierz i Zakończ), a następnie

Uruchom aplikację, która zostanie wykonana uruchomi emulator i skonfiguruje go więc uruchom go!

To jest to!!! Happy coding guys!!!!!!!

 1
Author: Henula,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-24 21:36:27

Gradle Build Tools 2.2.0+ - wszystko po prostu działa

To jest prawidłowy sposób, aby to zrobić

Starając się uniknąć eksperymentalnych i szczerze mówiąc dość NDK i całej jego hackery jestem zadowolony, że 2.2.x Z Narzędzi Gradle Build wyszedł i teraz po prostu działa. Klucz jest externalNativeBuild i wskazuje ndkBuild argument ścieżki na Android.mk lub zmienia ndkBuild na cmake i wskazuje argument ścieżki na CMakeLists.txt skrypt budowania.

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'
        //}
    }
}

Aby uzyskać więcej szczegółów sprawdź Google ' s strona o dodawaniu kodu natywnego .

Po prawidłowej konfiguracji możesz ./gradlew installDebug i iść. Musisz również mieć świadomość, że NDK przenosi się do clang, ponieważ gcc jest teraz przestarzały w Android NDK.

 0
Author: Cameron Lowell Palmer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-23 09:03:20