android تعليم - كيفية مشاركة مصدر مكتبة واحد عبر مشاريع متعددة



الاوتوكاد بالعربي (5)

أردت أن أفعل شيئًا مشابهًا لمشروع Android Wear ، حيث يتوفر لديك وحدات mobile wear . في Android Studio 1.5.1 ، يمكنك إجراء File-> New-> Module واختيار مكتبة Android كوحدة نمطية. سيهتم ذلك بالعديد من الإعدادات الموضحة أعلاه ويضع مكتبتك داخل مشروع Android Wear الحالي.

السؤال كما في العنوان. تم طرح سؤال مماثل here ، وكان الحل الوحيد في ذلك الوقت هو نشر المشروع في مستودع Maven المحلي.

هل هذه المشكلة ثابتة (كما يدعي البعض) في Android Studio 0.5. +؟ في ملاحظة الإصدار الخاصة به ، هناك عبارة تقول "دعم المجلدات المصدر خارج الجذر المحتوى الوحدة النمطية". هل يعني ذلك أنه يمكننا في النهاية استيراد المكتبة من خارج مجلد المشروع؟

حاولت ملف-> استيراد المشروع .. لكنه لا يعمل.

EDIT 2: شاهد الإجابة المقبولة على أحدث الحلول (اعتبارًا من 0.8. +)

تصحيح:

يحتوي بنية دليل المشروع الخاص بي على وحدة نمطية واحدة فقط والتي تبدو هكذا

MyApp
    main
        build.gradle
        src
    build.gradle
    settings.gradle

يحتوي مجلد مشروع المكتبة على وحدة نمطية واحدة فقط تسمى lib (يتم إنشاؤها تلقائيًا عند إنشاء مشروع مكتبة جديد)

MyLibrary
    lib
        build.gradle
        src
    build.gradle
    settings.gradle

يتم إضافة السطر التالي إلى MyApp/settings.gradle :

include ':main', '..:MyLibrary'

يتم إضافة ما يلي إلى MyApp/main/build.gradle :

dependencies {
    compile project(':..:MyLibrary')
}

والنتيجة هي الخطأ التالي:

FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring project ':main'.
> Configuration with name 'default' not found.

كملاحظة جانبية ، يمكن لمشروع المكتبة MyLibrary نفسها أن يتجمع دون أخطاء. يبدو أن المشكلة هي settings.gradle لعدم القدرة على التعرف على بنية مشروع المكتبة.


للاستفادة الكاملة من Android Studio ، أوصي بإنشاء مشروع android عادي في البداية. ثم ، ضمن هذا المشروع ، أضف نوع وحدة نمطية " android library " ، (اختياريًا) " java library " (إذا كان لديك رمز تريد استخدامه قد يكون شائعًا في تطبيقات Android والرمز الجانبي للخادم).

باستخدام هذه الآلية ، لا تحتاج إلى معالجة وتعديل ملفات gradle و manifest.


نعم ، إنها تعمل الآن في 0.5.0. لا يوجد واجهة مستخدم ودية له (مشروع الاستيراد ليس هو ما تريده ، لأن ذلك يخلق مشروعًا جديدًا تمامًا ؛ لا يزال نموذج استيراد الوحدة معطلاً ؛ راجع https://code.google.com/p/android/issues/detail?id=62122 ) ، ولكن يمكنك إعداد ملفات البناء الخاصة بك لجعلها تعمل.

لنفترض أن لديك بنية دليل تبدو كالتالي:

MyApp
    appmodule
        build.gradle
            src
                main
                    java
    build.gradle
    settings.gradle
MyPlainJavaLibrary
    build.gradle
    src
        java

لاحظ أن MyPlainJavaLibrary ليس تحت دليل MyApp في نظام الملفات.

قم بإعداد ملف settings.gradle الخاص بك مثل:

include ':appmodule', '..:MyPlainJavaLibrary'

وتضمين تبعية لها في build.raddle مثل هذا (لا تنس النقطتين الرائدين):

dependencies {
    ...
    compile project(':..:MyPlainJavaLibrary')
}

هذا يعمل بالنسبة لي. في عارض مشروعي ، أرى الآن MyApp و MyPlainJavaLibrary كدليلين لوحدة نمطية على مستوى الجذر في العرض ، ويمكنني أن أجعل عبارات import جافا تعمل عبر حدود الوحدة النمطية وما إلى ذلك.

لاحظ أنه في هذا الإعداد الافتراضي ، سيكون لهذه الوحدة النمطية المشتركة مجلد إخراج مكون واحد فقط سيتم مشاركته بين جميع المشاريع التي تستخدمه. هذا قد يكون أو لا يكون ما تريده. إذا كنت ترغب في الحصول على دليل إخراج مختلف لكل مشروع باستخدام الوحدة النمطية المشتركة ، فيمكنك القيام ببعض السحر مع دليل الإخراج في sourceSet ؛ إذا كنت تريد المساعدة في هذا ، أوصيك بتجربته بنفسك ونشر سؤال يتضمن تفاصيل حول عملك إذا واجهتك مشكلة.

لا يمكن أن يكون لديك سوى ملف إعدادات واحد لكل ملف ، لذا لن يأخذ هذا المشروع برمجًا متعددًا مختلفًا تمامًا وسيجلب جميع الوحدات دفعة واحدة ؛ ستحتاج إلى إحضارها بشكل فردي. ومع ذلك ، ينبغي أن تلبي حالة استخدام وحدة نمطية في مشاريع متعددة.


(كما في الإصدار 2.1 أو الأحدث):

فيما يلي الخطوات التي اتخذتها لمشاركة مصدر المكتبة خارج دليل المشروع. بدلاً من مكتبة جافا العادية ، يتم تجميع الرموز الخاصة بي كوحدة Android ، ولكن وحدة المكتبة هذه غير موجودة داخل المشروع الرئيسي. الأمر جيد معي طالما أنه لا يوجد ازدواج في الكود وأحتاج فقط للحفاظ على مجموعة واحدة من رمز المكتبة لجميع المشاريع:

1) ملف-> مشروع جديد. أعط اسمًا لمشروع مكتبتك (هنا أستخدم LibraryProject ). متابعة الخطوات المتبقية لإنشاء مشروع عادي (بما أن الهدف من ذلك هو إنشاء مكتبة ، اخترت "لا تضيف أي نشاط")

2) افتراضيًا ، ينشئ استوديو Android الوحدة المسماة "app" داخل مجلد المشروع. لمنع تصادم الأسماء مع وحدة التطبيق الفعلية ، أعد تسمية الوحدة إلى شيء آخر (انقر بزر الماوس الأيمن على "app" في اللوحة اليسرى-> Refactor-> Rename).

3) في الملف build.gradle داخل مجلد وحدة المكتبة ، قم بتغيير السطر العلوي

apply plugin: 'com.android.application'

إلى

apply plugin: 'com.android.library'

ثم قم بإزالة السطر "applicationId" ضمن "defaultConfig". أيضا ، لأن هذه مكتبة ، قم بإزالة xlmns:... namespace و <application ..> body من Manifest.xml كذلك. هذا كل ما في جزء المكتبة. الآن ، لإنشاء / تعديل التطبيق الرئيسي الخاص بك:

4) إذا كان مشروعًا جديدًا ، فعليك أولاً إنشاء مشروع جديد -> مشروع جديد -> ApplicationName.

5) افتح settings.gradle (يجب أن يكون هناك ملف واحد فقط في كل مشروع) وقم بتضمين السطر التالي (لاحظ الفاصلة المنقوطة الرائدة في الوحدة النمطية للمكتبة):

include ':app', '..:LibraryProject:yourLibraryModule'

6) ثم انتقل إلى ملف-> هيكل المشروع.

7) ضمن علامة التبويب "التبعيات" ، انقر على الزر "+" الأخضر على اليمين. حدد "وحدة التبعية". اختر وحدة المكتبة الخاصة بك ، ثم انقر فوق موافق.

يجب أن تكون الآن قادرًا على استخدام فئات المكتبة في التطبيق الخاص بك.

طريقة بديلة إذا ، لسبب ما ، لا تزال هناك مشاكل مع الطريقة المذكورة أعلاه ، يمكنك أن تجرب ما يلي (اقترح here ):

1) كرر الخطوات من 1 إلى 4 أعلاه. بشكل افتراضي ، يبدو المشروع الرئيسي والخارجي (المكتبة) شيئًا كالتالي:

  /MainProject
    + build.gradle
    + settings.gradle
    + app/
      + build.gradle
      + src/

  /LibraryProject
    + build.gradle
    + settings.gradle
    + app/
      + build.gradle
      + src/

2) كالمعتاد ، refactor اسم الوحدات (في الروبوت استوديو بزر الماوس الأيمن فوق وحدة-> refactor-> إعادة تسمية) لشيء أقل مربكة ، مثل

  /MainProject
    + build.gradle
    + settings.gradle
    + MainModule/
      + build.gradle
      + src/

  /LibraryProject
    + build.gradle
    + settings.gradle
    + LibraryModule/
      + build.gradle
      + src/

3) تعديل settings.gradle MainProject في MainProject :

include ':LibraryModule', ':app'
project(':LibraryModule').projectDir = new File(settingsDir, '../LibraryProject/LibraryModule')

مزامنة المشروع والانتهاء من ذلك.

ملاحظة على Proguard

في الوقت الحالي ، يجب ألا تستخدم حراسة على مشاريع / وحدات مكتبية خارجية. بدلاً من ذلك ، يمكنك استبدال ما يلي (الإجابة الأصلية here )

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
    }
    debug {
        minifyEnabled false
    }
}

مع ما يلي (في build.gradle المكتبة):

buildTypes {
    release {
        consumerProguardFiles 'proguard-project.txt'
    }
}

حيث proguard-project.txt هو الملف الذي يحتوي على قواعد proguard لمشروع المكتبة الخاصة بك.


في Android Studio ، انتقل إلى مجلد التطبيقات داخل ، وافتح ملف build.gradle. هنا سترى التبعيات {}. داخله يمكنك إضافة مشروع المكتبة والمزامنة. الآن بعد مزامنة المكتبة ستتم إضافتها إلى مشروعك ، ويمكنك استخدام وظائفه وفصوله في مشروعك.





android android-studio