LINUX.ORG.RU

java разная компиляция в зависимости от условий

 ,


0

3

Не знаю как правильно называется то что я хочу, по этому скажу конкретную задачу.

Я хочу использовать разный код для дебаг версии и релизной версии. В дебаг версии убрать код который ответственный за рекламу. Или может можно использовать какой-то ключ? И каким-то образом пометить в коде некомпилируемое место, что-то типа такого

[[if something]]
// Специфичный код тут
// Специфичный код тут
// Специфичный код тут
[[endif something]] 
★★★

Последнее исправление: abs (всего исправлений: 1)

Ответ на: комментарий от crowbar

Причем тут это? Мне это нужно для того чтоб не компилировать рекламу каждый раз в при разработке приложения

abs ★★★
() автор топика
Ответ на: комментарий от abs

Если тебе для андроида, то там есть такая вещь flavors. И конечно ты может просто отключить рекламу в коде

if (BuildConfig.DEBUG) {

}
crowbar
()
class SomeClass {

    private static final boolean DEBUG = false;

    public void doSomething() {
        //Если DEBUG равно true, следующий кусок не будет компилироваться
        if (!DEBUG) {
            showAds();
        }//
    }
}
slyjoeh ★★★
()
Последнее исправление: slyjoeh (всего исправлений: 1)
Ответ на: комментарий от slyjoeh

Оно не будет компилироваться, или лишь не будет запускаться? Оно будет тянуть за собой нужные для рекламы библиотеки?

abs ★★★
() автор топика
Ответ на: комментарий от abs

этого куска в байткоде не будет. библиотеки рекламные тянуть будет. чтобы не тянуло библиотеки, юзай sed и awk

slyjoeh ★★★
()
Ответ на: комментарий от abs

Мне это нужно для того чтоб не компилировать рекламу каждый раз в при разработке приложения

мейкфайлы не? или что у вас там в жаве, ant?

MyTrooName ★★★★★
()
Ответ на: комментарий от MyTrooName

мейкфайлы не? или что у вас там в жаве, ant?

У мня gradle. Но я только его и учил, если есть что-то получше могу перейти на другую (как это правильно? Систему сборки?)

UPD. Точнее учил это громко сказано, делал копипасту которая написана в туториалах(почти во всех туториалах под андроид только про gradle и рассказывают)

abs ★★★
() автор топика
Последнее исправление: abs (всего исправлений: 1)
Ответ на: комментарий от slyjoeh

этого куска в байткоде не будет

А в apk файле? Просто он же перебрасывается по кабелю на телефон, скорость не очень большая, 0.5Mb за секунду.

abs ★★★
() автор топика

Где Андроид в тэгах?

Лоровцы тебе правильно подсказывают - юзай flavors!

Adonai ★★★
()

я бы наверное делал через maven velocity plugin. из gradle его тоже можно запускать.

BillDver ★★★
()

Нет такой возможности в яве и никогда не будет. Принципиально. Если так уж надо что-то отключить - делай интерфейс и две реализации: полноценную и заглушку. Если очень уж критично не тащить часть библиотек в дебаг версию, то в maven-e для этого есть профили, в gradle тоже что-то из этой серии должно быть

Nagwal ★★★★
()

Есть два подхода.

Первый вариант — используй препроцессор перед компиляцией. cpp, m4 самые известные. Думаю, лучше всего использовать cpp, он всем хорошо знаком.

Второй вариант, идеологически более правильный — сделать интерфейс и две реализации. Реализацию, ответственную за рекламу, положить в отдельный jar-файл. В конфиге будет указано, какую реализацию надо использовать. Соответственно если тебе одна из реализаций не нужна, просто не клади соответствующий jar-файл в приложение и всё. Можешь посмотреть, как сделано в JDBC с драйверами БД.

Legioner ★★★★★
()

лол, кому это вообще может быть нужно? хочешь макросов - пиши на сишечке!

anonymous
()

Это правильно называется conditional compilation.

Можно сделать костылями:

https://weblogs.java.net/blog/2005/01/20/how-do-conditional-compilation-java, это если нужно, к примеру, чтобы в разных случаях компилялся разный код, ну или как уже подсказали выше можно просто кинуть кучу ифов :

http://www.javapractices.com/topic/TopicAction.do?Id=64

by_zero
()

Релизный пакет и дебажный подписаны разными ключами. Используй их чтобы отличить дебаг от релиза

no-dashi ★★★★★
()

Сделай библиотеку в виде отдельного плагина. В коде проверяй наличие плагина в classpath и подгружай соответствующие классы.

Плагин собирай отдельно. В gradle файле пропиши зависимость активируемую по отдельному ключу компиляции. Примерно так:

dependencies {
compile 'somelibs';
if (!project.hasProperty("debug")) {
     compile 'advertisinglib';
   }
}
TheKnight ★★★
()
Ответ на: комментарий от Legioner

там ещё гдето было что градл может подменять файлы исходников (в т.ч и директории) при сборке... только вот никак не могу найти как

mm3 ★★★
()
Ответ на: комментарий от Legioner

Думаю, лучше всего использовать cpp, он всем хорошо знаком.

перестанет работать корректно подсветка синтаксиса, автодополнение, и др. ништяки в ide.

но да, я делал так в eclipse какое-то время.

waker ★★★★★
()

compile <google probe lib> заменяешь на releaseCompile <google probe lib>

создаешь пути debug/java/... и release/java/... и туда кидаешь разные версии своего класса AdvHelper с одинаковыми внешними интерфейсами. в debug версии все методы будут заглушками. например как-то так:

boolean isAdvEnabled()

void setupBanner(View view)

void startBanner()

void stopBanner()
в release/java нужен AndroidManifest с дополнительными тегами для гугло-библиотек (версия, пермишены и т.п.).

а если ты ищешь точного пошагового решения, может стоит подумать о смене профессии?

crowbar
()
Ответ на: комментарий от crowbar

а если ты ищешь точного пошагового решения

А я где-то такое говорил? Я спрашивал абстрактно, но так чтоб люди меня правильно поняли написал один из конкретных примеров который я хотел реализовать. Дело же далеко не в рекламу, куча разной «воды», типа экрана приветствия, экрана выбора уровней, диалог «а вы точно хотите выйти?» и так далее мне абсолютно не нужны при тестировании основной, собственно игровой части. А время на компиляцию весьма существенно(секунд 10) + время на передачу APK файла по юсб кабелю. Конечно когда пишешь код 20 минут, а потом раз скомпилил то все норм. А если например пытаешься выбрать правильные константы «сложности» игры, или там какой-то мелкие изменения в дизайне почти все время только и уходит на компиляцию

abs ★★★
() автор топика
Ответ на: комментарий от abs

А время на компиляцию весьма существенно(секунд 10)

используешь gradle?

10 секунд — при использовании gradle у меня даже hello world дольше собирается. вообще говоря, жаба компилируется очень быстро, практически мгновенно. а вот на сборку всех этих jar, apk, подписи, и т.п. уходит дофига времени. только я не уверен, что вырезание googleplayservices lib тебя спасет.

например, можно выгадать намного больше времени если собирать через ant или eclipse. сборка APK происходит в разы быстрее. просто gradle тормоз.

waker ★★★★★
()
Ответ на: комментарий от Deleted

вышеприведенный способ с интерфейсом решает сферическую задачу в вакууме, и требует особой билд-системы (gradle, насколько я понимаю).

в реальной жизни задачи более обширные, билд-системы более другие, и интерфейс не спасает. например, попробуй собрать из 1 кодобазы 2 идентичных APK, отличающихся только package name (типа, com.myhelloworld vs com.myhelloworld.pro). кто-то писал на лоре, что для подобных целей каждая версия живет в отдельном бренче в VCS. видимо, не одни мы с ОПом ниасиливаем..

waker ★★★★★
()
Ответ на: комментарий от waker

например, попробуй собрать из 1 кодобазы 2 идентичных APK, отличающихся только package name

Я смотрю программирование под ондроед приводит к нездоровым фантазиям.

Почемуто даже адепты плюсов так не извращаюются.

Deleted
()
Ответ на: комментарий от Deleted

нездоровая платформа приводит к нездоровым фантазиям — все в порядке вещей.

waker ★★★★★
()
Ответ на: комментарий от waker

сборка APK происходит в разы быстрее. просто gradle тормоз.

Это неудивительно — Gradle ведь написан на Groovy: на каждый запуск тратиться куча ресурсов и часто впустую.

Про ant понятно, а что насчёт maven'а?

iZEN ★★★★★
()
Ответ на: комментарий от waker

это называется препроцессор, и в жабе его нет.

Нет есть. См. JSR-175, JSR-269. Можно написать свой препроцессор для обработки собственных аннотаций.

iZEN ★★★★★
()
Ответ на: комментарий от iZEN

аннотации это не то. похоже, речь о чем-то вроде custom attributes в c#. оно позволяет решать ряд задач, но не заменяет препроцессор даже на уровне ifdef.

waker ★★★★★
()
#ifdef _DEBUG
// Специфичный код тут
// Специфичный код тут
// Специфичный код тут
#endif // _DEBUG
EXL ★★★★★
()
Ответ на: комментарий от waker

в реальной жизни задачи более обширные, билд-системы более другие, и интерфейс не спасает. например, попробуй собрать из 1 кодобазы 2 идентичных APK, отличающихся только package name (типа, com.myhelloworld vs com.myhelloworld.pro). кто-то писал на лоре, что для подобных целей каждая версия живет в отдельном бренче в VCS. видимо, не одни мы с ОПом ниасиливаем..

любая из использовавшихся мной билд-систем умела делать replace и move, не вижу почему вдруг вам этого не хватает.

maloi ★★★★★
()
Ответ на: комментарий от waker

собрать из 1 кодобазы 2 идентичных APK, отличающихся только package name (типа, com.myhelloworld vs com.myhelloworld.pro).

вот для этого достаточно уметь из системы сборки выполнять замену строки и перемещение файла из одной директории в другую. Ошибки при подходе в лоб конечно могут быть, но если это необходимо делать регулярно - подпирается костылями и проверяется в CI, чтобы неожиданностей избежать.

maloi ★★★★★
()
Ответ на: комментарий от maloi

можешь назвать систему сборки, которая умеет производить замену строк в коде перед компиляцией жабо-кода? мне бы такая штука очень пригодилась.

waker ★★★★★
()
Ответ на: комментарий от maloi

спасибо, попробую воспользоваться. у меня как раз ant, но я его не ковырял, скрипт автосгенерил билд-файлы, и все.

waker ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.