Мигрирам голям, сложен проект на 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 е все още слаб. Някой знае ли къде ми е фаталната грешка?
Could not determine the dependencies of task ':thirdparty:facebook:mergeReleaseResources'.
. Ако премахна всички тях освен `evaluationDependsOn(':thirdparty'), получавам същата грешка като по-горе. - person mrmcduff   schedule 17.07.2013