2014-10-13 6 views
3

Я работаю над проектом, где у нас есть несколько модулей, каждый из которых имеет ряд зависимостей от других модулей и т. Д. И т. Д. Мы перенесли наш проект в Gradle (а также изменили структуру, чтобы приспособить его к дефолтам Gradle) некоторое время назад, потому что нам нужна была универсальность при создании разных версий приложения: free vs paid, debug (no proguard) vs release (proguard) и т. Д. Мы были очень взволнованы, когда мы завершили миграцию, но это счастье быстро растворилось в луже грязи, когда время постройки стало больно. Выполнение довольно простых изменений кода и развертывание приложения на телефоне занимает 90-120 секунд, и это просто неприемлемо.Buck-building android app with multiple Gradle flavors/build types and manifestests

Итак, мы решили дать Бак попробовать, так как мы не слышали ничего, кроме хороших слов от других разработчиков. После очень небольшого времени (меньше, чем у Gradle) нам удалось успешно свернуть наше приложение (что, к сожалению, не означает «правильное создание APK», но, по крайней мере, оно построено). Дело в том, что, как правило, у нас есть один файл манифеста за аромат, и, если я не упустил что-то фундаментальное, Buck позволяет вам указывать файлы манифеста при использовании правила android_binary. Результатом этого является то, что файл манифеста сгенерированного APK содержит только шаблонный код первого модуля уровня, с которого начинается сборка цепи Gradle по:

main -> debug -> free/paid -> common 

То есть, файл манифеста содержит только манифест Мэйна. Это правило находится в файле верхнего уровня BUCK, который является файлом, который содержит псевдоним, указанный в .buckconfig.

Я уверен, что я делаю что-то неправильно. Это не имеет смысла. Бак не позволяет вам иметь несколько манифестаций.

Любые идеи?

ответ

2

Фрэнсис Toth (https://stackoverflow.com/users/1873643/francis-toth) придумал очень подробное объяснение в дискуссионной группе Buck:

Просто чтобы дать вам контекст, я приложение состоит из различных модулей библиотеки, каждый из которых имеет Android- Manifest, некоторые ресурсы, активы и т.д. ... и файл БАК, который в значительной степени выглядеть следующим образом:

android_library(
    name = 'src', 
    srcs = glob(['src/main/java/**/*.java']), 
    deps = DEPENDENCIES + [':res'], 
    visibility = [ 'PUBLIC' ], 
    exported_deps = DEPENDENCIES 
) 

android_resource(
    name = 'manifest', 
    manifest = 'src/main/AndroidManifest.xml', 
    deps = ['//othermodule:manifest'], 
    visibility = [ 'PUBLIC' ], 
) 

android_resource(
    name = 'assets', 
    assets = 'src/main/assets', 
    visibility = [ 'PUBLIC' ], 
) 

android_resource(
    name = 'res', 
    res = 'src/main/res', 
    package = 'com.sherpa.android', 
    visibility = [ 'PUBLIC' ], 
) 

project_config(
    src_target = ':src', 
    src_roots = ['src/main/java'] 
) 

Мой файл BUCK приложение выглядит следующим образом:

android_binary (
    name = 'bin', 
    manifest = ':manifest', # Here I make a reference on the android_manifest build rule described below 
    target = 'Google Inc.:Google APIs:19', 
    keystore = ':debug_keystore', 
    deps = BINARY_DEPENDENCIES 
) 

MANIFEST_DEPENDENCIES = ['//module1:manifest', '//module2:manifest'] 
android_manifest (
    name = 'manifest', 
    skeleton = 'AndroidManifest.xml', # The app's base manifest 
    deps = MANIFEST_DEPENDENCIES # App's manifest will be merged with all its dependencies (module1 and module2's manifest) 
) 

Ваша проблема, насколько я понимаю, кажется, очень похожи. Чтобы слить манифест, вам необходимо создать правило сборки android_resource, в котором указывается, где находится ваша библиотека модулей, а также манифеста, с которой она должна быть объединена.

И это решило мою проблему :-)