Свързване на компилирани android библиотеки заедно в сложен проект

Мигрирам голям, сложен проект на android библиотека към gradle и имам проблеми с включването на библиотечни проекти в големия проект. Това е обсъждано в други въпроси, но никой все още (доколкото ми е известно) не е публикувал за този проблем. Имам няколко приложения, куп библиотеки на трети страни и собствена споделена библиотека. Структурата на папките е както следва:

--Root
   -build.gradle
   -settings.gradle
   |--apps
      |--MyApp
   |--libraries
      |--thirdparty
         |--actionbarsherlock
            -build.gradle
         |--facebook
            -build.gradle
         |--google-play-services-lib
            -build.gradle
      |--personal
         |--commons
            -build.gradle
            - AndroidManifest.xml
            |--src
               |--main, blah blah
         |--proprietary

Сега личната/общата библиотека зависи от всички библиотеки на трети страни (ABS, Facebook и т.н.). Всеки lib на трета страна зависи само от общи jar файлове, които могат да бъдат въведени от mavenCentral, и всеки от тях се изгражда перфектно. Важно е да има разделяне на личните библиотеки на трети страни и също толкова важно, че нито това, нито папката „библиотеки“ всъщност са проект за android сами по себе си.

(Актуализация: премахна всичко освен базовите файлове build.gradle и settings.gradle за опростяване.)

Имайте предвид, че се опитвам да следвам подобно решение в малко по-прост проблем.

В моята папка /root/ файлът settings.gradle гласи:

include ':libraries:personal:commons'  
include ':libraries:thirdparty:actionbarsherlock'
include ':libraries:thirdparty:facebook'
include ':libraries:thirdparty:google-play-services-lib'
include ':apps:MyApp'

и файлът build.gradle на същото ниво (/root/) е просто празен.

Редактиране: премахнати обаждания към evaluationDependsOn(':thirdparty:facebook') и другите подпроекти. Компилирането води до същия проблем с грешка при зависимост на отговора.

Когато стартирам gradle build на ниво /root/libraries/personal (отново, следвайки свързания пример), той първо успешно компилира всички библиотеки на трети страни (ура!). След това дава нещо, което изглежда като действителна грешка при компилиране на Java: /Root/libraries/personal/commons/src/main/java/com/personal/commons/dialog/AlertDialogFragment.java:19: не може намери символ символ : метод dismissAllowingStateLoss() местоположение: клас com.personal.commons.dialog.AlertDialogFragment instance.dismissAllowingStateLoss();

Подозирам обаче, че това е проблем със свързването, тъй като (1) се компилира повече от година в Eclipse без промяна в кода и (2) AlertDialogFragment разширява SherlockDialogFragment, който сам разширява DialogFragment, където е дефиниран dismissAllowingStateLoss(). Въпреки това не се оплаква от дефиницията на класа

public class AlertDialogFragment extends SherlockDialogFragment {

или import com.actionbarsherlock.app.SherlockDialogFragment в горната част на файла, така че някак си мисли, че всичко е наред, но не може да разреши зависимостите. Когато гледам папката за компилация на /root/libraries/thirdparty/actionbarsherlock, клас файл наистина се извежда за SherlockDialogFragment. Защо моята бедна персонализирана библиотека не вижда това?

Всички опити за разрешаване на този проблем досега са се провалили, тъй като моят gradle-fu е все още слаб. Някой знае ли къде ми е фаталната грешка?


person mrmcduff    schedule 17.07.2013    source източник
comment
защо имате 2 settings.gradle, които изглежда включват едни и същи модули (освен празните :thirdparty и :personal, които така или иначе не са необходими)? Мисля, че това може да прави нещата по-сложни, отколкото трябва.   -  person Xavier Ducrohet    schedule 17.07.2013
comment
също така наистина не е нужно да използвате evaluationDependsOn('...')   -  person Xavier Ducrohet    schedule 17.07.2013
comment
@Xav - добавянето на по-високото не е променило по един или друг начин, но други свързани решения казаха, че трябва да изисквате всички проекти на всички нива. Освен това причината да използвам evaluationDependsOn е решението на сложен проблем с форматирането на проект [тук] (stackoverflow.com/questions/17536652/)   -  person mrmcduff    schedule 17.07.2013
comment
@Xav - ако премахна всички извиквания на evaluationDependsOn, той се проваля в една от компилациите на трета страна: Could not determine the dependencies of task ':thirdparty:facebook:mergeReleaseResources'.. Ако премахна всички тях освен `evaluationDependsOn(':thirdparty'), получавам същата грешка като по-горе.   -  person mrmcduff    schedule 17.07.2013