एंड्रॉइड स्टूडियो और ग्रेडल के साथ एंड्रॉइड लाइब्रेरी कैसे बनाएं?


144

मैं ग्रहण से एक परियोजना को स्थानांतरित करने की कोशिश कर रहा हूं, लेकिन मैंने जो कुछ भी कोशिश नहीं की है वह काम कर रहा है। एक्लिप्स में मेरे 3 प्रोजेक्ट हैं (2 एंड्रॉइड ऐप प्रोजेक्ट और 1 एंड्रॉइड लाइब्रेरी प्रोजेक्ट)। 2 ऐप परियोजनाएं पुस्तकालय परियोजना पर निर्भर करती हैं। जब मैं वर्गीकृत निर्यात करता हूं तो मुझे 3 परियोजनाएं मिलती हैं जो काम नहीं करती हैं। मैं परियोजना के पुनर्गठन के लिए तैयार हूं, लेकिन इस बारे में कोई दस्तावेज नहीं मिला है कि यह कैसे किया जाना चाहिए।

क्या उन 3 परियोजनाओं को बनाने का एक तरीका है जो ग्रहण निर्यात एक साथ काम करते हैं? क्या मैं चीजों को पुनर्गठन से बेहतर हूं और यदि ऐसा है तो इसे कैसे किया जाना चाहिए?

अपडेट करें

मैंने पूरा प्रोजेक्ट GitHub https://github.com/respectTheCode/android-studio-library-example पर अपलोड किया है

अपडेट १

पद्म कुमार के सुझावों के आधार पर मैंने यही कोशिश की है।

  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

अपडेट २

एथन के सुझावों के आधार पर यह वह जगह है जहाँ हम मिलते हैं

build.gradleलगता है कि 2 उप परियोजना में सभी सही भाग हैं और एकमात्र अंतर यह है कि प्लगइन लाइन bellow है 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.

अपडेट ३

इसे हल करने के लिए बिग धन्यवाद एतान।

  1. जोड़े compile project(':SubProjects:MyLib')कोMyLib/build.gradle
  2. निकालें compile files('libs/android-support-v4.jar')सेMyLib/build.gradle
  3. प्रोजेक्ट बंद करें और रूट प्रोजेक्ट को gradle से आयात करें

अद्यतन ४

0.1.2 के अनुसार अब आप compile "com.android.support:support-v4:13.0.0"इसके बजाय शामिल कर सकते हैं compile files('libs/android-support-v4.jar')। चूंकि यह अब माविन से आ रहा है इसलिए आप इसे बिना किसी समस्या के कई परियोजनाओं में शामिल कर सकते हैं।

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

अद्यतन ५

0.1.3 के रूप में अब टूलबार में "सिंक प्रोजेक्ट" बटन है। आप .gradleफ़ाइलों में परिवर्तन करने के बाद अपनी परियोजना को पुन: आयात करने के बजाय उस पर क्लिक कर सकते हैं ।


मैंने आपके जीथब प्रोजेक्ट के लिए एक पुल अनुरोध किया। 2 साधारण परिवर्तन थे। अपने /build.gradle से सामग्री निकालें। {मैंने ऐसा इसलिए किया क्योंकि आप यह परिभाषित नहीं करते थे कि यह किस तरह की परियोजना है, इसलिए यह शिकायत कर रही थी कि इसके साथ क्या है नहीं पता}, फिर मैंने इस पर निर्भरता को इससे जोड़ा: SubProject: MyLib:: SubProject: MyApp। मैं तब भागा ।/gradlew: SubProject: MyApp: iD (iD map to installDebug)। मुझे डुप्लीकेट लिबास / android-support-v4.jar भी निकालना पड़ा। चूंकि यह एक 'वास्तविक' निर्भरता नहीं है, इसलिए आप इसे दो स्थानों पर नहीं रख सकते।
एथन

मैंने पुल अनुरोध पर टिप्पणी की। github.com/respectTheCode/android-studio-library-example/pull/1
सम्मान

1
यह ध्यान देने योग्य है, यदि आप compile 'com.google.android:support-v4:r6'अपनी प्रत्येक परियोजना और मावेन प्लगइन में जोड़ते हैं (जैसे नीचे बिल्ड.ग्रेड उदाहरण में) तो ग्रेडेल के बजाय compile files('libs/android-support-v4.jar')एहसास होगा कि दोनों परियोजनाओं में एक ही चीज़ शामिल है और केवल एक बार इसे शामिल किया जाएगा।
एथन

@respectTheCode मैंने अपने नमूना गितुब परियोजना को थोड़ा साफ करने के लिए एक पुल अनुरोध भेजा है। साझा करने के लिए धन्यवाद!
जॉनीलैम्बडा

जवाबों:


115

नोट : यह उत्तर शुद्ध ग्रैडल उत्तर है, मैं इसे IntelliJ में नियमित रूप से उपयोग करता हूं, लेकिन मुझे नहीं पता कि एंड्रॉइड स्टूडियो के साथ एकीकरण कैसे है। मैं यह जानने में विश्वास करता हूं कि मेरे लिए क्या हो रहा है, इसलिए मैं ग्रैडल और एंड्रॉइड का उपयोग करता हूं।

TL; DR पूरा उदाहरण - https://github.com/ethankhall/driving-time-tracker/

डिस्क्लेमर : यह एक प्रोजेक्ट है जिस पर मैं काम कर रहा हूं।

ग्रैडल की एक परिभाषित संरचना है (कि आप बदल सकते हैं, नीचे स्थित लिंक आपको बताता है कि) मावेन के समान है यदि आपने कभी इसका उपयोग किया है।

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

अब हमें ग्रैडल को कुछ Android भागों के बारे में बताने की आवश्यकता है। यह बहुत आसान है। एक बुनियादी एक (जो मेरे अधिकांश मामलों में काम करता है) निम्नलिखित की तरह दिखता है। मेरे पास इस ब्लॉक में एक टिप्पणी है, यह एपीके का निर्माण करते समय मुझे संस्करण का नाम और कोड निर्दिष्ट करने की अनुमति देगा।

build.gradle

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

कुछ हम जोड़ना चाहते हैं, किसी को भी मदद करने के लिए जो ग्रैडल की रोशनी को अभी तक नहीं देखा है, उनके लिए एक तरीका है बिना इसे स्थापित किए परियोजना का उपयोग करना।

build.gradle

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

इसलिए अब हमारे पास निर्माण के लिए एक परियोजना है। अब हम दूसरों को जोड़ने जा रहे हैं। मैंने उन्हें एक निर्देशिका में रखा, शायद इसे डिप्स या सबप्रोजेक्ट्स कहते हैं। यह वास्तव में मायने नहीं रखता है, लेकिन आपको यह जानना होगा कि आपने इसे कहाँ रखा है। ग्रैडल को यह बताने के लिए कि आप कहां प्रोजेक्ट कर रहे हैं, उन्हें सेटिंग में जोड़ने की जरूरत है।

निर्देशिका संरचना:

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'

आखिरी चीज जिसे आपको सुनिश्चित करना चाहिए कि इसके बजाय सबप्रोजेक्ट्स / वास्तव में CoolProject1 / build.gradle है ।apply plugin: "android-library"apply plugin: "android"

हर ग्रैडल परियोजना (और मावेन) की तरह अब हमें इसकी निर्भरता के बारे में मूल परियोजना को बताने की जरूरत है। इसमें कोई सामान्य जावा निर्भरता भी शामिल हो सकती है जो आप चाहते हैं।

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 स्थापित है।

एनडीके साइड नोट: यदि आप एनडीके का उपयोग करने जा रहे हैं, तो आपको नीचे की तरह कुछ चाहिए। उदाहरण 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
धन्यवाद @ ईथन यह कुछ रिक्त स्थान को भरता है। Android Studio केवल मूल प्रोजेक्ट build.gradle को याद कर रहा था। अब मैं जो त्रुटि प्राप्त कर रहा हूं, मैं उस प्रश्न को अपडेट करता हूं।
सम्मान .कोड

1
मैंने आपके ड्राइविंग टाइम ट्रैकर रेपो को क्लोन करने और प्रोजेक्ट को आयात करने की कोशिश की, लेकिन संकलन नहीं होगा।
सम्मान .कोड

मैं कुछ भूल गया, मैंने एक नया अनुरोध किया
एथन

1
हाय @ ईथन, ऐसा लगता है कि आप ग्रैडल के साथ अनुभव कर रहे हैं, क्या आप मेरे मुद्दे के साथ भी सहायता करने का मन करेंगे: stackoverflow.com/questions/17479076/…
TacB0sS

@ ईथन क्या आप एंड्रॉइड के लिए ग्रैडल के साथ निर्भरता की समस्या में मदद कर सकते हैं ?
जेजेडी

6

मैं बस एक बहुत ही इसी तरह के मुद्दों के साथ gradle buildds / जोड़ने .jar पुस्तकालय था। मुझे इसके संयोजन से काम करना पड़ा:

  1. प्रोजेक्ट के मूल तक lib फ़ोल्डर को ले जाना (उसी निर्देशिका को 'src' के रूप में), और फाइंडर में इस फ़ोल्डर में लाइब्रेरी को जोड़ना (Mac OS X का उपयोग करके)
  2. एंड्रॉइड स्टूडियो में, लाइब्रेरी के रूप में जोड़ने के लिए फ़ोल्डर पर राइट-क्लिक करें
  3. जोड़ने में build.gradle फ़ाइल में निर्भरता का संपादन compile fileTree(dir: 'libs', include: '*.jar')}

लेकिन अधिक महत्वपूर्ण और झुंझलाहट, काम करने के कुछ ही घंटों बाद, एंड्रॉइड स्टूडियो ने सिर्फ 0.3.7 जारी किया है, जो दावा करता है कि बहुत सारे ग्रेडल मुद्दों को हल किया गया है जैसे कि .jar पुस्तकालयों।

http://tools.android.com/recent

उम्मीद है कि यह लोगों की मदद करता है!


1
यह मुद्दा एंड्रायड पुस्तकालयों के बारे में बात कर रहा है न कि जावा .jj पुस्तकालयों के बारे में।
सम्मान। डिकोड

2
सच! हालाँकि, मेरी समस्या में ग्रेडल बिल्ड और एंड्रॉइड स्टूडियो शामिल थे और यह पोस्ट मेरे समाधान के लिए नेतृत्व करने में मेरी मदद करने के लिए पर्याप्त थी - बस मैंने सोचा कि मैं अच्छी खबर फैलाऊंगा किसी और को इस सवाल का नेतृत्व किया गया था, और उसी स्थिति में था मुझे।
जोएल बामर

1

यहाँ मैक उपयोगकर्ताओं के लिए मेरा समाधान है मुझे लगता है कि यह खिड़की के लिए भी काम करता है:

सबसे पहले अपने Android Studio टूलबार पर जाएं

बिल्ड> मेक प्रोजेक्ट (जब आप लोग ऑनलाइन होते हैं तो इसे फ़ाइलों को डाउनलोड करने के लिए दें) और फिर

बिल्ड> कंपाइल मॉड्यूल "आपका ऐप का नाम यहां दिखाया गया है" (अभी भी ऑनलाइन फ़ाइलों को
डाउनलोड और खत्म होने दें) और फिर

अपना ऐप चलाएं जो आपके एमुलेटर को लॉन्च करेगा और इसे कॉन्फ़िगर करेगा तब इसे चलाएं!

बस इतना ही!!! हैप्पी कोडिंग लोग !!!!!!!


0

ग्रैड बिल्ड टूल 2.2.0+ - सब कुछ बस काम करता है

यह करने का सही तरीका है

प्रयोगात्मक और स्पष्ट रूप से एनडीके और इसके सभी हैकरी से तंग आकर बचने की कोशिश में मुझे खुशी है कि ग्रैडल बिल्ड टूल्स का 2.2.x बाहर आ गया और अब यह सिर्फ काम करता है। कुंजी एक या एक स्क्रिप्ट पर पथ तर्क को बदलने या इंगित करने के लिए एक externalNativeBuildऔर ndkBuildपथ संकेत है ।Android.mkndkBuildcmakeCMakeLists.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हैं। आपको यह भी पता होना चाहिए कि एनडीके क्लैग के लिए आगे बढ़ रहा है क्योंकि अब एंड्रॉइड एनडीके में जीसीआर को हटा दिया गया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.