Bagaimana cara membangun perpustakaan android dengan Android Studio dan gradle?

144

Saya mencoba untuk memigrasi proyek dari Eclipse tetapi tidak ada yang saya coba. Di Eclipse saya memiliki 3 proyek (2 proyek aplikasi android dan 1 proyek perpustakaan android). 2 proyek aplikasi tergantung pada proyek perpustakaan. Ketika saya melakukan ekspor gradle saya mendapatkan 3 proyek yang tidak berhasil. Saya terbuka untuk merestrukturisasi proyek tetapi belum menemukan dokumentasi tentang bagaimana ini harus dilakukan.

Apakah ada cara untuk membuat 3 proyek yang ekspor Eclipse bekerja bersama? Apakah saya lebih baik merestrukturisasi hal-hal dan jika demikian adalah dokumentasi untuk bagaimana ini harus dilakukan?

Memperbarui

Saya telah mengunggah seluruh proyek ke GitHub https://github.com/respectTheCode/android-studio-library-example

Perbarui 1

Berdasarkan saran dari Padma Kumar inilah yang saya coba.

  1. Buat Proyek baru yang disebut MyApp
  2. Klik File > New Module, pilih Android Librarydan beri namaMyLib
  3. Klik Build > Make Project

Build gagal dengan kesalahan ini

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.

Saya kemudian menambahkan packageatribut ke manifes membuatnya

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

Setelah membangun saya mendapatkan kesalahan ini

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

Menambahkan ketergantungan tampaknya tidak berdampak pada kesalahan. Melanjutkan dari atas

  1. Klik File > Project Structure > Modules > MyApp-MyApp
  2. Beralih ke DependenciesTab
  3. Klik + > Module Dependencydan pilihMyLib
  4. Klik ApplydanOK
  5. Klik Build > Make Project

Perbarui 2

Berdasarkan saran dari Ethan di sinilah kita dapatkan

Sub proyek 2 build.gradletampaknya memiliki semua bagian yang benar dan satu-satunya perbedaan adalah baris plugin di bawah ini 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
    }
}

Proyek root build.gradlekosong jadi saya menambahkan dua proyek seperti ini

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

Saya sekarang mendapatkan kesalahan ini saat membangun

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.

Perbarui 3

Terima kasih banyak Ethan untuk menyelesaikan ini.

  1. Tambahkan compile project(':SubProjects:MyLib')keMyLib/build.gradle
  2. Hapus compile files('libs/android-support-v4.jar')dariMyLib/build.gradle
  3. Tutup proyek dan Impor proyek root dari gradle

Perbarui 4

Pada 0.1.2 Anda sekarang bisa memasukkan compile "com.android.support:support-v4:13.0.0"bukan compile files('libs/android-support-v4.jar'). Karena ini berasal dari mavin sekarang Anda dapat memasukkan ini dalam beberapa proyek tanpa masalah.

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

Perbarui 5

Pada 0.1.3 sekarang ada tombol "Sinkronkan Proyek" di bilah alat. Anda dapat mengklik itu alih-alih mengimpor kembali proyek Anda setelah membuat perubahan pada .gradlefile.

hormatilah Kode
sumber
Saya mengajukan permintaan penarikan untuk proyek github Anda. Ada 2 perubahan sederhana. Hapus konten dari /build.gradle Anda. {Saya melakukan ini karena Anda tidak mendefinisikan proyek apa itu, jadi mengeluh tentang tidak tahu harus ke mana dengan itu}, lalu saya menambahkan ketergantungan dari: SubProject: MyLib ke: SubProject: MyApp. Saya kemudian berlari ./gradlew: SubProject: MyApp: iD (iD maps to installDebug). Saya juga harus menghapus duplikat libs / android-support-v4.jar. Karena ini bukan ketergantungan 'nyata', Anda tidak dapat memilikinya di dua tempat.
Ethan
Saya mengomentari permintaan tarik. github.com/respectTheCode/android-studio-library-example/pull/1
respectTheCode
1
Perlu disebutkan, jika Anda menambahkan compile 'com.google.android:support-v4:r6'ke masing-masing proyek Anda dan plugin maven (seperti dalam contoh build.gradle di bawah) alih-alih compile files('libs/android-support-v4.jar')gradle akan menyadari bahwa kedua proyek menyertakan hal yang sama dan hanya akan memasukkannya sekali saja.
Ethan
@respectTheCode Saya mengirim permintaan tarik untuk membersihkan proyek github sampel Anda sedikit. Terima kasih telah berbagi!
JohnnyLambada
Kemungkinan duplikat dari studio Android, gradle dan NDK
Cameron Lowell Palmer

Jawaban:

115

Catatan : Jawaban ini adalah jawaban murni Gradle, saya menggunakan ini di IntelliJ secara teratur tetapi saya tidak tahu bagaimana integrasi dengan Android Studio. Saya seorang yang percaya mengetahui apa yang terjadi pada saya, jadi ini adalah bagaimana saya menggunakan Gradle dan Android.

TL; DR Contoh Lengkap - https://github.com/ethankhall/driving-time-tracker/

Penafian : Ini adalah proyek yang sedang saya kerjakan.

Gradle memiliki struktur yang telah ditentukan (yang dapat Anda ubah, tautan di bagian bawah memberi tahu Anda caranya) yang sangat mirip dengan Maven jika Anda pernah menggunakannya.

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

Jika Anda hanya memiliki satu proyek, file settings.gradle tidak diperlukan. Namun Anda ingin menambahkan lebih banyak proyek, jadi kami membutuhkannya.

Sekarang mari kita mengintip file build.gradle itu. Anda akan membutuhkan ini di dalamnya (untuk menambahkan alat android)

build.gradle

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

Sekarang kita perlu memberi tahu Gradle tentang beberapa bagian Android. Sederhana saja. Yang dasar (yang berfungsi di sebagian besar kasus saya) terlihat seperti berikut ini. Saya punya komentar di blok ini, ini akan memungkinkan saya untuk menentukan nama versi dan kode saat membuat APK.

build.gradle

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

Sesuatu yang ingin kita tambahkan, untuk membantu siapa pun yang belum melihat cahaya Gradle, cara bagi mereka untuk menggunakan proyek tanpa menginstalnya.

build.gradle

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

Jadi sekarang kita punya satu proyek untuk dibangun. Sekarang kita akan menambahkan yang lain. Saya meletakkannya di direktori, mungkin menyebutnya deps, atau subproyek. Tidak masalah, tetapi Anda harus tahu di mana Anda meletakkannya. Untuk memberi tahu Gradle di mana proyek Anda akan perlu menambahkannya ke settings.gradle.

Struktur Direktori:

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

setting.gradle:

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

Hal terakhir yang Anda harus memastikan dari adalah sub-proyek / reallyCoolProject1 / build.gradle memiliki apply plugin: "android-library"bukan apply plugin: "android".

Seperti setiap proyek Gradle (dan Maven) kita sekarang perlu memberi tahu proyek root tentang ketergantungannya. Ini juga dapat mencakup semua dependensi Java normal yang Anda inginkan.

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

Saya tahu ini sepertinya banyak langkah, tetapi mereka cukup mudah setelah Anda melakukannya sekali atau dua kali. Cara ini juga akan memungkinkan Anda untuk membangun di server CI dengan asumsi Anda telah menginstal Android SDK di sana.

Catatan Sisi NDK: Jika Anda akan menggunakan NDK Anda akan membutuhkan sesuatu seperti di bawah ini. Contoh file build.gradle dapat ditemukan di sini: 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')
}

Sumber:

  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/
Ethan
sumber
1
Terima kasih @Ethan ini memang mengisi beberapa kekosongan. Android Studio hanya melewatkan proyek root build.gradle. Saya akan memperbarui pertanyaan dengan kesalahan yang saya dapatkan sekarang.
respectTheCode
1
Saya mencoba mengkloning repo pelacak waktu mengemudi Anda dan mengimpor proyek tetapi tidak dapat dikompilasi.
respectTheCode
Saya lupa sesuatu, saya membuat permintaan baru
Ethan
1
Hai @ Ethan, sepertinya Anda berpengalaman dengan Gradle, maukah Anda membantu dengan masalah saya juga: stackoverflow.com/questions/17479076/…
TacB0sS
@Ethan Bisakah Anda membantu masalah ketergantungan dengan Gradle untuk Android?
JJD
6

Saya baru saja mengalami masalah yang sangat mirip dengan gradle builds / menambahkan .jar library. Saya membuatnya bekerja dengan kombinasi:

  1. Memindahkan folder libs ke root proyek (direktori yang sama dengan 'src'), dan menambahkan perpustakaan ke folder ini di finder (menggunakan Mac OS X)
  2. Di Android Studio, Klik kanan pada folder untuk ditambahkan sebagai pustaka
  3. Mengedit dependensi dalam file build.gradle, menambahkan compile fileTree(dir: 'libs', include: '*.jar')}

TETAPI lebih penting dan menjengkelkan, hanya beberapa jam setelah saya membuatnya berfungsi, Android Studio baru saja merilis 0.3.7, yang mengklaim telah memecahkan banyak masalah gradle seperti menambahkan .jar libraries

http://tools.android.com/recent

Semoga ini bisa membantu orang!

Joel Balmer
sumber
1
Masalah ini berbicara tentang Andriod Libraries bukan Java .jar libraries.
respectTheCode
2
Benar! Namun, masalah saya memang melibatkan gradle builds dan android studio dan posting ini cukup mirip untuk membantu mengarahkan saya ke solusi saya - hanya berpikir saya akan menyebarkan kabar baik jika ada orang lain yang mengarah ke pertanyaan ini, dan berada di posisi yang sama saya.
Joel Balmer
1

Ini solusi saya untuk pengguna mac. Saya pikir ini juga berfungsi untuk windows:

Pertama pergi ke bilah alat Android Studio Anda

Bangun> Buat Proyek (saat Anda online biarkan untuk mengunduh file) lalu

Build> Compile Module "nama aplikasi Anda ditampilkan di sini" (masih online biarkan file-file tersebut
diunduh dan selesai) lalu

Jalankan aplikasi Anda yang sudah selesai akan meluncurkan emulator Anda dan konfigurasikan lalu jalankan!

Hanya itu saja!!! Selamat Coding guys !!!!!!!

Henula
sumber
0

Gradle Build Tools 2.2.0+ - Semuanya berfungsi

Ini cara yang benar untuk melakukannya

Dalam mencoba menghindari eksperimental dan terus-menerus muak dengan NDK dan semua peretasannya, saya senang bahwa 2.2.x dari Gradle Build Tools keluar dan sekarang hanya berfungsi. Kuncinya adalah argumen path externalNativeBuilddan menunjuk ndkBuildpada Android.mkatau mengubah ndkBuildke cmakedan mengarahkan argumen path pada CMakeLists.txtskrip build.

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

Untuk lebih jelasnya periksa halaman Google tentang menambahkan kode asli .

Setelah pengaturan ini dengan benar, Anda dapat ./gradlew installDebugdan pergilah. Anda juga perlu menyadari bahwa NDK bergerak ke dentang karena gcc sekarang tidak digunakan lagi dalam Android NDK.

Cameron Lowell Palmer
sumber