Пользователь
0,5
рейтинг
25 марта 2014 в 13:38

Разработка → Неприятный сюрприз от Eclipse

image
В некоторых случаях Eclipse добавляет в apk исходные коды из каталога jni.

Крайне неприятный повод для написания данной заметки.
Думаю, все представляют себе, какой проблемой может стать публикация apk, содержащего собственный исходный код.
Обнаружено это было совершенно случайно.
В процессе разработки apk нашего проекта весил 19 мегабайт.
Перед релизом мы переосмыслили менеджмент проекта и провели несколько изменений в структуре каталогов.
В частности, перенесли исходные коды из jni во внешний каталог.
И вдруг, при сборке проект похудел до 13 мегабайт. При этом полностью сохраняя работоспособность.
Такое изменение поведения проекта нельзя оставлять без внимания. И мы стали копаться — что же изменилось.
Каково же было наше удивление, когда при распаковке apk предыдущих версий (да, мы храним все подписанные сборки) оказалось, что они в себе содержат все содержимое каталога jni! Те самые 6 мегабайт.
Когда мы перенесли исходные коды на уровень выше проекта, они вышли из зоны ответственности сборщика и перестали добавляться в apk.
На данный момент мы еще не разобрались, почему Eclipse при сборке добавляет jni к пакету, но уже считаем важным сообщить об этой возможности сообществу.

Я крайне рад, что мы обнаружили эту ситуацию до полноценной публикации и начала продвижения.
Страшно представить, на что можно нарваться, опубликовав собственные исходники. Но ещё страшнее опубликовать исходные коды закрытых лицензируемых библиотек.

UPD:
Справедливости ради, дабы не давать еще один повод обругать Eclipse:
Eclipse в данном тексте стоить читать как ADT. Ведь это не сам Eclipse пакет собирает, а ADT.
Александр Басов @AllexIn
карма
57,0
рейтинг 0,5
Пользователь
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (34)

  • +23
    Переходите на Open Source и эта проблема не будет Вас волновать (смайл). Исходники придётся публиковать самим.
    • +5
      Я с вами согласен. Но не всегда есть возможность все проекты перевести под OpenSource. :(
      • +6
        Поэтому и смайл.
        В большинстве коммерческих проектов это неприменимо, но даже в случае СПО такое «поведение» eclipse непростительно. Допустим все исходники и так открыты, но увеличивать размер приложения в полтора раза ?!
  • НЛО прилетело и опубликовало эту надпись здесь
    • +1
      Не видел.
  • +20
    Эклипс как бы говорит: давайте делать open source :)
    • +5
      Эклипс как бы говорит «Делайте Open Source и публикуйте исходники, а я всё равно запихаю их в .apk и увеличу размер приложения в полтора раза»
  • +3
    А как можно было не проверить состав apk?
    Я имею в виду, еще до того, как ваша сборка похудела.
    • +3
      А зачем его проверять?
      • +8
        ну, хотя бы из любопытства «а чавой эт он туда понасобирал?»
      • +2
        Например, у одного из ваших разработчиков может быть установлен MS OneNote. Эта программа добавляет в каждый каталог системы индексный файл, который может также попасть в apk. Ну и файл Thumbs.db не забывайте. (смайл)
        • –1
          какой такой файл добавляет OneNote?
          • +5
            Индексный (:
        • 0
          > индексный файл

          а можно поподробнее, ну там, ссылку, или где их искать?

          а то про Thumbs.db я знаю, про .DS_Store знаю, про OneNote тоже хочу узнать
  • 0
    Укажите, пожалуйста, версию эклипса. Проверил в старой (точно не скажу — годичной давности минимум) — такого нет. Ну и путь к jni в рамках apk не повредит. Или оно в корне появилось?
    • 0
      Тут важна не версия Эклипса, а версия ADT. Не сам же эклипс сборкой занимается. ADT самый свежий.
      Что характерно, не каждый рах в сборку исходники пихает. Пока не понимаю что влияет.
      • 0
        Может разница в подписанном/неподписанном билде? Или были ли изменения в jni.

        Заметил вот что — у меня в билд попали временные bak файлы. Но java-вские.
        • 0
          Мы только подписанные проверяем. Поэтому врядли подпись влияет.
          Изменения jni я сравнить не могу. Последние дни у нас SVN сервер в дауне и я не могу сравнить ревизии.
  • НЛО прилетело и опубликовало эту надпись здесь
    • +1
      А чем вам сборка из эклипсы не нравится? Три клика, и на руках подписанный apk-файл, готовый к заливке в маркет.
      • +2
        Вероятно имеется ввиду сборка больших проектов, над которыми работают полноценные команды.
        Когда сборка ведется на отдельном сервере и забирается оттуда отделом QA.
    • +2
      Нет смысла. Маленький инди проект, один программист, один художник. Прикручивать автоматизированную сборку нет смысла.
      Собрали, сразу потестировали что ничего не отвалилось — и на публикацию.
  • +1
    Allexin, а ссылка на багу имеется? Заведите обязательно. Если это «фича», то желательно, чтобы товарищи объяснили.
    • +2
      Надо сначала воспроизвести ситуацию. Разобраться в каких случаях добавляется.
      Попробовать собрать гугловские примеры с воспроизведением бага.
      Но в ближайшие пару недель я этого точно сделать не смогу: прямо сейчас занимаемся публикацией, не спим практически. :) Простонету сил еще и с выявлением причин разбираться.
  • +2
    А у меня 900 мегабайт исходников, лол.
    • +5
      Вы альтернативную операционку чтоли под андроид пилите?
      • +4
        Движок Source :D
        Огромная часть, конечно, всякие утилиты типа компиляторов карт, но всё равно много.
  • +2
    Это все понятно, и информация очень полезна, но при чем тут хаб (и тег) «C++»? Да и к хабу «Программирование» тоже непонятно, каким образом относится.
    • +1
      NDK же. Добавляются с++-ные файлы, которые в jni лежат.
    • +1
      Логичное замечание по поводу Хабов. У них действительно немного дургая направленность.
      А вот тег помоему вполне уместен, т.к. явовский код к проекту не добавляется и речь именно про с++.
  • 0
    Не понятно из текста: куда попали исходники в APK? Укажите так же версию ADT и версию NDK.
    • 0
      Исходники лежат прямо в корне apk.
      ADT самый свежий. Регулярно обновляем. Все сборки за последний месяц с исходниками внутри.
      Версия NDK значения не имеет. NDK в сборке пакета не участвует.
      • 0
        NDK в сборке пакета не участвует.

        Интересно, каким образом вы собираете JNI библиотеку для андроида без NDK? И зачем тогда на картинке в статье написано «Android NDK», если NDK у вас не используется?
        • 0
          Ну вы же понимаете разницу между сборкой библиотки и сборки пакета?
          NDK в теме фигурирует постольку, поскольку сборщик именно файлы jni(относящиеся к NDK) добавляет в сборку, хотя не должен.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.