Android Studio ve gradle ile bir android kütüphanesi nasıl oluşturulur?


144

Eclipse'den bir proje taşımaya çalışıyorum ama denediğim hiçbir şey çalışmıyor. Eclipse'de 3 projem var (2 android uygulama projesi ve 1 android kütüphane projesi). 2 uygulama projesi kütüphane projesine bağlıdır. Kepçe ihracatını yaptığımda işe yaramayan 3 proje alıyorum. Projeyi yeniden yapılandırmaya açığım ancak bunun nasıl yapılması gerektiğine dair herhangi bir belge bulamadım.

Eclipse ihracatının birlikte çalıştığı 3 projeyi yapmanın bir yolu var mı? Bir şeyleri yeniden yapılandırmaktan daha iyi miyim ve eğer öyleyse bunun nasıl yapılması gerektiğine dair belgeler mi?

Güncelleme

Tüm projeyi GitHub'a yükledim https://github.com/respectTheCode/android-studio-library-example

Güncelleme 1

Padma Kumar'ın önerilerine dayanarak bu denedim.

  1. Adlı yeni bir Proje oluşturun MyApp
  2. Tıklayın File > New Module, seçin Android Libraryve adlandırınMyLib
  3. Tıklayın Build > Make Project

Derleme bu hatayla başarısız oluyor

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.

Sonra packagemanifest'e bir özellik ekledim

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

Yaptıktan sonra bu hatayı alıyorum

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

Bağımlılık eklemenin hata üzerinde bir etkisi yok gibi görünüyor. Yukarıdan devam

  1. Tıklayın File > Project Structure > Modules > MyApp-MyApp
  2. Geçin DependenciesTab
  3. Tıkla + > Module Dependencyve seçMyLib
  4. Tıklayın ApplyveOK
  5. Tıklayın Build > Make Project

Güncelleme 2

Ethan'ın önerilerine dayanarak burada

2 alt proje build.gradletüm doğru parçalara sahip gibi görünüyor ve tek fark eklenti hattı feryat olmasıdır 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
    }
}

Kök proje build.gradleboştu, bu yüzden böyle iki projeyi ekledim

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

Şimdi inşa ederken bu hatayı alıyorum

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.

Güncelleme 3

Bunu çözdüğü için Ethan'a çok teşekkürler.

  1. ekle compile project(':SubProjects:MyLib')içinMyLib/build.gradle
  2. Kaldır compile files('libs/android-support-v4.jar')danMyLib/build.gradle
  3. Projeyi kapat ve kök projeyi sınıftan içe aktar

Güncelleme 4

0.1.2'den itibaren compile "com.android.support:support-v4:13.0.0"yerine ekleyebilirsiniz compile files('libs/android-support-v4.jar'). Şimdi mavin'den geldiğinden, bunu sorunsuz olarak birden fazla projeye dahil edebilirsiniz.

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

Güncelleme 5

0.1.3'ten itibaren araç çubuğunda artık bir "Projeyi Senkronize Et" düğmesi var. .gradleDosyalarda değişiklik yaptıktan sonra projenizi yeniden içe aktarmak yerine bunu tıklayabilirsiniz .


Github projeniz için bir talepte bulundum. 2 basit değişiklik vardı. İçeriği /build.gradle dosyasından kaldırın. {Bunu ne tür bir proje olduğunu tanımlayamadığınız için yaptım, bu yüzden ne yapılacağını bilmemekten şikayet ediyordu}, sonra bağımlılığı ekledim: SubProject: MyLib to: SubProject: MyApp. Daha sonra ./gradlew: SubProject: Uygulamam: iD (installDebug'u yüklemek için iD haritaları) çalıştırdım. Ayrıca yinelenen libs / android-support-v4.jar kaldırmak zorunda kaldı. Bu 'gerçek' bir bağımlılık olmadığı için, onu iki yerde tutamazsınız.
Ethan


1
Her bir compile 'com.google.android:support-v4:r6'projenize ve maven eklentisine (aşağıdaki build.gradle örneğinde olduğu gibi) her bir projeye eklerseniz , her compile files('libs/android-support-v4.jar')iki projenin de aynı şeyi içerdiğini ve yalnızca bir kez içereceğini fark edeceksiniz.
Ethan

@respectTheCode Örnek github projenizi biraz temizlemek için bir çekme isteği gönderdim. Paylaşım için teşekkürler!
JohnnyLambada

Yanıtlar:


115

Not : Bu cevap saf bir Gradle cevabıdır, bunu IntelliJ'de düzenli olarak kullanıyorum, ancak Android Studio ile entegrasyonun nasıl olduğunu bilmiyorum. Benim için neler olduğunu bilmeye inanıyorum, bu yüzden Gradle ve Android'i böyle kullanıyorum.

TL; DR Tüm Örnek - https://github.com/ethankhall/driving-time-tracker/

Feragatname : Bu, üzerinde çalıştığım / üzerinde çalıştığım bir projedir.

Gradle, daha önce kullandıysanız Maven'e çok benzeyen tanımlı bir yapıya sahiptir (değiştirebileceğiniz, alttaki bağlantı nasıl olduğunu söyler).

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

Yalnızca bir projeniz varsa, settings.gradle dosyasına gerek yoktur. Bununla birlikte, daha fazla proje eklemek istersiniz, bu yüzden buna ihtiyacımız var.

Şimdi bu build.gradle dosyasına bir göz atalım. İçinde buna ihtiyacınız olacak (android araçlarını eklemek için)

build.gradle

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

Şimdi Gradle'a bazı Android bölümlerini anlatmamız gerekiyor. Oldukça basit. Temel bir (benim çoğu durumda çalışır) aşağıdaki gibi görünüyor. Bu blokta bir yorumum var, APK oluştururken sürüm adını ve kodunu belirtmeme izin verecek.

build.gradle

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

Eklemek isteyeceğimiz bir şey, henüz Gradle'ın ışığını görmemiş olan herkese yardım etmek için, projeyi yüklemeden kullanmaları için bir yol.

build.gradle

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

Şimdi yapmamız gereken bir proje var. Şimdi diğerlerini de ekleyeceğiz. Onları bir dizine koydum, belki de deps veya subProjects diyorum. Gerçekten önemli değil, ama nereye koyduğunuzu bilmeniz gerekecek. Gradle'a projelerin nerede olduğunu söylemek için bunları ayarlara eklemeniz gerekecek.

Dizin Yapısı:

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'

Emin yapmak gereken son şeydir alt projeleri / reallyCoolProject1 / build.gradle sahiptir apply plugin: "android-library"yerine apply plugin: "android".

Her Gradle projesi (ve Maven) gibi şimdi de kök projeye bağımlılığını anlatmamız gerekiyor. Bu, istediğiniz normal Java bağımlılıklarını da içerebilir.

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

Bunun birçok adım gibi göründüğünü biliyorum, ancak bir veya iki kez yaptıktan sonra oldukça kolaydır. Bu şekilde, Android SDK'nın yüklü olduğunu varsayarak bir CI sunucusu oluşturmanıza da olanak tanır.

NDK Tarafı Not: NDK'yı kullanacaksanız aşağıdaki gibi bir şeye ihtiyacınız olacak. Örnek build.gradle dosyası şu adreste bulunabilir: 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')
}

Kaynaklar:

  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
Teşekkürler @ Bu, bazı boşlukları dolduruyor. Android Studio'da yalnızca kök proje build.gradle eksikti. Şimdi aldığım hatayla soruyu güncelleyeceğim.
kodKod

1
Sürüş süresi izleyici repo klonlama ve proje alma denedim ama derlemek olmaz.
kodKod

Bir şey unuttum, yeni bir istekte bulundum
Ethan

1
Merhaba @Ethan, Gradle ile deneyimli gibi görünüyorsun, sorunumda da yardımcı olur musun: stackoverflow.com/questions/17479076/…
TacB0sS

@Ethan Gradle for Android ile ilgili bir bağımlılık sorununa yardımcı olabilir misiniz ?
JJD

6

Ben sadece gradle builds / ekleyerek .jar kütüphanesi ile çok benzer sorunları vardı. Ben bir kombinasyonu ile çalışma var:

  1. Libs klasörünü projenin kök dizinine taşıma ('src' ile aynı dizin) ve kitaplığı bulucuda bu klasöre ekleme (Mac OS X kullanarak)
  2. Android Studio'da kitaplık olarak eklemek için klasörü sağ tıklayın
  3. Build.gradle dosyasındaki bağımlılıkları düzenleme, ekleme compile fileTree(dir: 'libs', include: '*.jar')}

AMA daha önemli ve can sıkıcı bir şekilde, işe başladıktan sadece birkaç saat sonra, Android Studio 0.3.7 yayımladı.

http://tools.android.com/recent

Umarım bu insanlara yardım eder!


1
Bu sorun Java .jar kitaplıkları değil Andriod Kitaplıkları hakkında konuşuyor.
respectTheCode

2
Doğru! Bununla birlikte, sorunum gradle builds ve android studio'yu içeriyordu ve bu yazı beni çözümüme yönlendirmeye yardımcı olacak kadar benzerdi - sadece başkalarının bu soruya yol açması durumunda iyi haberi yaydığımı düşündüm ve aynı pozisyondaydı ben mi.
Joel Balmer

1

İşte mac kullanıcıları için benim çözüm pencere için de çalıştığını düşünüyorum:

İlk önce Android Studio araç çubuğunuza gidin

Oluştur> Proje Yap (siz çevrimiçi olduğunuzda dosyaları indirmenize izin verin) ve sonra

Derleme> Derleme Modülü "uygulama adınız burada gösterilir" (hala çevrimiçi dosyaların
indirilip bitmesine izin verin ) ve sonra

Uygulamanızı çalıştırın, öykünücünüzü başlatır ve yapılandırır, sonra çalıştırır!

İşte bu !!! Mutlu Kodlama çocuklar !!!!!!!


0

Gradle Build Tools 2.2.0+ - Her şey işe yarar

Bunu yapmanın doğru yolu bu

Deneysel ve açıkçası NDK ve tüm hackery ile bıkmak için çalışırken Gradle Build Tools 2.2.x çıktı ve şimdi sadece çalışıyor mutluyum. Anahtarıdır externalNativeBuildve işaret ndkBuildbir de yol argüman Android.mkveya değişim ndkBuildiçin cmakeve bir de yol argüman işaret CMakeLists.txtyapı komut.

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

Daha fazla ayrıntı için Google'ın yerel kod ekleme hakkındaki sayfasına bakın .

Bu doğru kurulduktan sonra gidebilir ./gradlew installDebugve gidebilirsiniz. Ayrıca gcc artık Android NDK'de kullanımdan kaldırıldığı için NDK'nın klanlara geçtiğini de bilmeniz gerekir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.