วิธีสร้างไลบรารี android ด้วย Android Studio และ gradle


144

ฉันกำลังพยายามโยกย้ายโครงการจาก Eclipse แต่ไม่มีอะไรที่ฉันได้ลองใช้งานได้ ใน Eclipse ฉันมี 3 โปรเจ็กต์ (2 แอพ android สำหรับโปรเจคและ 1 android library project) โครงการแอพ 2 โครงการขึ้นอยู่กับโครงการห้องสมุด เมื่อฉันส่งออก gradle ฉันได้รับ 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. เปลี่ยนเป็นDependenciesTab
  3. คลิก+ > Module DependencyและเลือกMyLib
  4. คลิกApplyและOK
  5. คลิก Build > Make Project

อัปเดต 2

ตามข้อเสนอแนะจากอีธานนี่คือสิ่งที่เราได้รับ

โครงการย่อย 2 ดูเหมือนจะมีทุกชิ้นส่วนที่ถูกต้องและความแตกต่างเพียงอย่างเดียวคือการร้องบรรทัดปลั๊กอินเป็นbuild.gradleMyApp/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. ปิดโครงการและนำเข้าโครงการรากจากระดับเสียง

อัปเดต 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 maps เพื่อ installDebug) ฉันยังต้องลบ libs / android-support-v4.jar ที่ซ้ำกัน เนื่องจากไม่ใช่การพึ่งพา 'จริง' คุณจึงไม่มีในสองที่
อีธาน

ฉันแสดงความคิดเห็นในคำขอดึง github.com/respectTheCode/android-studio-library-example/pull/1
respectTheCode

1
เป็นมูลค่าการกล่าวขวัญถ้าคุณเพิ่มcompile 'com.google.android:support-v4:r6'แต่ละโครงการของคุณและปลั๊กอิน maven (เช่นในตัวอย่าง build.gradle ด้านล่าง) แทนการcompile files('libs/android-support-v4.jar')ไล่ระดับสีจะรู้ว่าโครงการทั้งสองมีสิ่งเดียวกันและจะรวมเพียงครั้งเดียว
อีธาน

@respectTheCode ฉันส่งคำขอการดึงเพื่อล้าง github ตัวอย่างโครงการของคุณเล็กน้อย ขอบคุณสำหรับการแบ่งปัน!
JohnnyLambada

เป็นไปได้ซ้ำกับสตูดิโอ Android, gradle และ NDK
Cameron Lowell Palmer

คำตอบ:


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 สมมติว่าคุณมี 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')
}

แหล่งที่มา:

  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 ฉันจะอัปเดตคำถามด้วยข้อผิดพลาดที่ฉันได้รับตอนนี้
respectTheCode

1
ฉันพยายามโคลน repo ตัวติดตามเวลาขับรถของคุณและนำเข้าโครงการ แต่ไม่ได้รวบรวม
respectTheCode

ฉันลืมบางสิ่งฉันขอใหม่
อีธาน

1
สวัสดี @Ethan ดูเหมือนว่าคุณจะมีประสบการณ์กับ Gradle คุณจะช่วยแก้ไขปัญหาของฉันด้วยหรือไม่: stackoverflow.com/questions/17479076/…
TacB0sS

@Ethan คุณช่วยด้วยปัญหาการพึ่งพากับ Gradle สำหรับ Android ได้ไหม?
JJD

6

ฉันเพิ่งมีปัญหาที่คล้ายกันมากกับ gradle builds / add .jar library ฉันได้รับมันทำงานโดยการรวมกันของ:

  1. ย้ายโฟลเดอร์ libs ไปยังรูทของโครงการ (ไดเรกทอรีเดียวกันกับ 'src') และเพิ่มไลบรารีไปยังโฟลเดอร์นี้ในตัวค้นหา (โดยใช้ Mac OS X)
  2. ใน Android Studio ให้คลิกขวาที่โฟลเดอร์เพื่อเพิ่มเป็นไลบรารี
  3. การแก้ไขการขึ้นต่อกันในไฟล์ build.gradle เพิ่ม compile fileTree(dir: 'libs', include: '*.jar')}

แต่สำคัญกว่าและน่ารำคาญเพียงไม่กี่ชั่วโมงหลังจากที่ฉันทำงาน Android Studio เพิ่งเปิดตัว 0.3.7 ซึ่งอ้างว่าได้แก้ไขปัญหาการไล่ระดับสีจำนวนมากเช่นการเพิ่มไลบรารี. jar

http://tools.android.com/recent

หวังว่านี่จะช่วยให้ผู้คน!


1
ปัญหานี้กำลังพูดถึง Andriod Libraries ไม่ใช่ Java .jar libraries
respectTheCode

2
ความจริง! อย่างไรก็ตามปัญหาของฉันเกี่ยวกับ gradle builds และ android studio และโพสต์นี้ก็คล้ายกันมากพอที่จะช่วยพาฉันไปหาทางออก - แค่คิดว่าฉันจะกระจายข่าวดีในกรณีที่ไม่มีใครถูกนำไปสู่คำถามนี้และอยู่ในตำแหน่งเดียวกัน ผม.
Joel Balmer

1

นี่คือทางออกของฉันสำหรับผู้ใช้ mac ฉันคิดว่ามันใช้งานได้กับหน้าต่างด้วย:

ก่อนอื่นให้ไปที่แถบเครื่องมือ Android Studio ของคุณ

สร้าง> สร้างโครงการ (ในขณะที่คุณออนไลน์ให้ดาวน์โหลดไฟล์) จากนั้น

สร้าง> รวบรวมโมดูล "ชื่อแอปของคุณแสดงที่นี่" (ยังคงออนไลน์ให้
ดาวน์โหลดไฟล์และเสร็จสิ้น) แล้ว

เรียกใช้แอปของคุณที่ทำเสร็จแล้วจะเปิดตัวจำลองและกำหนดค่าจากนั้นรัน!

อย่างนั้นแหละ!!! พวก Coding มีความสุข !!!!!!!


0

Gradle Build Tools 2.2.0+ - ทุกอย่างใช้งานได้

นี่เป็นวิธีที่ถูกต้องที่จะทำ

ในการพยายามหลีกเลี่ยงการทดลองและเบื่อหน่ายกับ NDK และแฮ็คทั้งหมดของมันฉันดีใจที่ 2.2x ของเครื่องมือสร้าง Gradle ออกมาและตอนนี้ก็ใช้งานได้แล้ว กุญแจสำคัญคือ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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.