1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/thoughtworks-DroidIncUpdate

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
readme.md

DroidIncUpdate

Это простой проект, предоставляющий возможности инкрементального обновления для приложений Android.

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

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

Но есть и некоторые ограничения для инкрементных обновлений:

  • Можно обновить только собственный код.
  • Должен быть процесс обновления каждый раз при запуске приложения.

Эти функции срочно необходимы, особенно играм, разработанным на C++.

Как эти функции реализованы?

Как мы все знаем, Android предоставляет разработчикам возможность разработки собственного кода. Когда мы пишем код на собственном языке (C или C++), инструменты сборки Android компилируют код в файл .so, и приложение Android загружает их во время работы. На самом деле мы можем обновить файл so перед запуском приложения, и теперь приложение может работать с более новым кодом. Динамическое обновление приложения реализовано!

Благодаря инструментам bsdiff и bspatch мы можем использовать bsdiff для генерации изменений между двумя разными двоичными файлами и использовать bspatch с файлом патча и старым файлом для создания нового файла. С помощью этих инструментов реализовано инкрементное обновление приложения!

Исходный код

├── client                             // весь исходный код, необходимый клиенту
│   ├── droid-inc-update               // lib android project, который должен интегрировать приложение
│   ├── droid-inc-update-demo          // простая демонстрация
│   ├── droid-inc-update-demo-cocos    // демонстрация cocos2dx с функцией инкрементного обновления
│   └── incupdatedata                  // каталог для сохранения сгенерированных файлов обновления
│       ├── binding_gen.py             // инструмент для генерации кода привязки cocos2dx
│       ├── env.py                     // настройки, используемые во всех инструментах
│       ├── update_client_res_version.py         // инструмент для обновления версии клиентских ресурсов
│       └── zip_update.py              // инструмент для создания новой версии incupdate вашего приложения
└── server
    ├── config                         // файлы конфигурации
    ├── deploy.sh                      // скрипт развертывания
    ├── npm-install.sh                 // скрипт установки npm
    └── src                            // исходный код сервера, написанный на nodejs

Процесс обновления

  • Инструмент zip_update.py сканирует все ваши ресурсы в каталогах assets/incupdatelibs и assets/res, чтобы создать версию ресурсов, затем сохраняет некоторую информацию в файлы assets/files.conf и assets/incupdate.conf в формате JSON. Версия фактически является новой версией выпуска. Инструмент также создаёт резервную копию ресурсов и генерирует файл update.zip для всех старых версий. Файл update.zip содержит всё необходимое для обновления со старой версии до новой.
  • Инструмент update_limit.py обновляет файл updatelimit.json в каталоге incupdatedata, который содержит настройки ограничения обновления версии, например, может быть обновлена только версия приложения, работающая на Android 5.0. Сервер будет считывать файл updateLimit.json, чтобы правильно доставить новую версию.
  • Когда пользователь открывает старую версию приложения, автоматически начинается обновление приложения. Запущенное приложение отправит HTTP-запрос на сервер обновления с некоторой информацией об устройстве Android и версии запущенного приложения, которая была считана из файла assets/files.conf или assets/incupdate.conf. Затем сервер проверит версию и другую информацию об устройстве, чтобы определить, требуется ли клиенту обновление. Если да, сервер отправит файл update.zip. to the app, и приложение завершит процесс обновления с данными, содержащимися в файле update.zip.

Использование

  1. Добавьте ссылку на проект в свой каталог проекта Android в файл project.properties вашего проекта.
android.library.reference.1=relative/path/to/droid-inc-update
  1. Напишите привязки на C для всех ваших собственных методов, объявленных в коде Java, и сгенерируйте файл loader.so. Зачем это нужно? Если вы используете API System.loadLibrary или System.load для загрузки файла .so, он не будет перезагружен, даже если вы замените файл so и перезапустите приложение. Поскольку операционная система Android контролирует процесс загрузки файла .so, нам нужен файл loader.so для загрузки реального файла .so и проксирования всех используемых в коде Java собственных методов (это то, что раньше называлось привязкой). С помощью API dlopen, dlsym и dlclose этот механизм будет реализован. Обратитесь к файлу client/droid-inc-update-demo/jni/loader.c, чтобы реализовать загрузчик.

  2. Соберите собственный код в файл .so и поместите файл .so в каталог в активах. Создайте дерево каталогов, как показано ниже.

├── assets
│   ├── incupdatelibs                  // каталог для хранения файлов `.so`, которые необходимо обновить
│   │   ├── libdemo.so                 // ваш скомпилированный файл `.so`
│   └── res                            // корневой каталог всех ваших ресурсных файлов, которые необходимо обновить
  1. Используйте client/tools/zip_update.py, чтобы создать версию всех ваших ресурсных файлов и файлов .so. Возможно, вам потребуется изменить настройку INCUPDATE_DATA_DIR в файле client/tools/env.py.

  2. Соберите проект в apk. Этот apk теперь действительно поддерживает инкрементное обновление.

  3. Измените исходный код файла .so, например libdemo.so, и соберите его. Замените файл в каталоге активов (assets/incupdatelibs/libdemo.so). Используйте инструмент client/tools/zip_update.py для создания новой версии ваших ресурсов. Запустите сервер с настроенным каталогом incupdata. Запустите apk, собранный на шаге 5, и вы увидите, что изменения действительно применяются к apk.

Привязка Cocos2dx

Привязка Cocos2d-x уже выполнена проектом droid-inc-update. Вы можете посмотреть код в каталоге client/droid-inc-update/jni/cocosloader. Привязка основана на версии 2.2.2 Cocos2d-x. Для других версий Cocos2d-x может потребоваться изменить что-то ещё.

Однако привязка Cocos2d-x требует изменения некоторого исходного кода Cocos2d-x. Файл cocos2dx/platform/android/CCFileUtilsAndroid.cpp в корневом каталоге Cocos2d-x необходимо заменить на client/cocos-changes/CCFileUtilsAndroid.cpp. Каталог cocos2dx/platform/android/java/src/ необходимо заменить на client/java. Эти изменения должны быть сделаны, потому что Cocos2d-x загружает ресурсы из assets/ в apk, а нам нужно загрузить новейшие ресурсы из файловой системы.

Изменения в файле CCFileUtilsAndroid:

  • Добавьте функцию инициализации Java_org_cocos2dx_lib_Config_initPath и статические переменные s_assetsPath, s_resDirRootPath и s_useAssets.
  • Измените реализацию функций CCFileUtilsAndroid::isFileExist и CCFileUtilsAndroid::doGetFileData, чтобы изменить путь поиска ресурсов.

Изменения в коде Java:

  • Добавьте Config.java, чтобы инициализировать путь из кода Java и предоставить функцию fixPath для другого кода Java, чтобы изменить ресурс в активах apk на ресурс в файловой системе.
  • Измените все случаи получения данных из активов, чтобы сначала использовать Config.fixPath.

Отладка

Если вам нужно отладить код и вы не хотите использовать функцию обновления, вы можете установить com.comeplus.droidincupdate.Config.FORCE_EXTRACT в значение true. Таким образом, вам не нужно каждый раз создавать обновлённую версию при обновлении кода. Всё будет новейшим, когда вы соберёте и запустите свой отлаживаемый apk.

Сервер

Сервер разработан с использованием nodejs и полностью использует асинхронность nodejs. Поэтому он будет очень эффективным и поддержит высокую параллельность запросов.

Также этот проект уже предоставляет вам очень полезные функции:

  • Обновление клиентского приложения можно ограничить по проценту или другому свойству среды выполнения клиента Android, такому как уровень API, страна, часовой пояс и так далее. Вы хотите протестировать новую функцию на небольшой группе пользователей, например, 10%, или когда вы хотите доставить новую версию только пользователям Android версии 5.0, вы можете использовать client/tool/update_limit.py, чтобы ограничить доставку.

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

Вы можете оставить комментарий после Вход в систему

Введение

Это простой проект, предоставляющий возможности инкрементального обновления приложений для Android. Развернуть Свернуть
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/thoughtworks-DroidIncUpdate.git
git@api.gitlife.ru:oschina-mirror/thoughtworks-DroidIncUpdate.git
oschina-mirror
thoughtworks-DroidIncUpdate
thoughtworks-DroidIncUpdate
master