У меня есть существующее приложение Hybrid Remote, созданное с использованием более старой версии SDK. Мне нужно обновить его из-за известных уязвимостей во включенной версии Cordova. Поэкспериментировав с обновлением существующего приложения, я решил просто начать заново с нового проекта forcehybrid. После некоторой работы (изложенной ниже) я могу создать отладочную версию приложения, которая успешно работает в эмуляторе и на устройстве. Однако, когда я пытаюсь собрать выпускную версию, я получаю следующую ошибку:

> Task :app:mergeDexRelease FAILED                                                                                 
D8: Program type already present: org.apache.cordova.AuthenticationToken                                    
com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives:                    
Program type already present: org.apache.cordova.AuthenticationToken                                  
Learn how to resolve the issue at https://developer.android.com/studio/build/dependencies#duplicate_classes.                                                                                                                          
        at com.android.builder.dexing.D8DexArchiveMerger.getExceptionToRethrow(D8DexArchiveMerger.java:131)
        <SNIP>

Я просмотрел ссылку «узнать, как решить» в сообщении об ошибке; в нем обсуждается наличие зависимости, которая также включена в другую зависимость. Однако я не могу найти такую ​​​​зависимость. Google обнаружил ряд ошибок «Тип программы уже присутствует», но все они, похоже, относятся к другим библиотекам. Я пробовал сборку из командной строки и из Android Studio с тем же результатом. Я запустил задачу gradle androidDependency из Android Studio, но не вижу повторяющейся зависимости. Я понятия не имею, как определить, какие модули/плагины/что-то еще пытаются включить org.apache.cordova.AuthenticationToken.

Вот шаги, которые я выполнил, чтобы получить работающую сборку отладки:

  1. Установлена ​​последняя версия Cordova (cordova --version сообщает 9.0.0 (cordova-lib@9.0.1))
  2. установлено forcehybrid (forcehybrid@8.0.0)
  3. Создал новый проект с forcehyrbid.
  4. Добавлен мой существующий bootconfig.xml и обновленный config.xml с настройками из моего существующего проекта.
  5. Добавлены плагины Cordova. Я просмотрел список плагинов в старом проекте и нашел современные эквиваленты, почти все версии cordova-plugin-X. <ул>
  6. значок плагина Cordova
  7. кордова-плагин-календарь
  8. кордова-плагин-камера
  9. кордова-плагин-контакты
  10. cordova-plugin-device
  11. cordova-plugin-inappbrowser
  12. информация о сети-плагина Cordova
  13. кордова-плагин-заставка
  14. кордова-плагин-статусбар
  15. версия-приложения-плагина-кордовы
  16. Кордова-плагин-ионная-клавиатура
  17. phonegap-plugin-push@1.11.1 (чтобы сохранить существующую конфигурацию GCM, это может быть ненужным/правильным)
  18. Удален и повторно добавлен плагин MobileSDK Cordova, как указано в документации, после добавления других плагинов.
  19. Обновлены файлы значков и заставок, а также добавлен пользовательский файл servers.xml.
  20. Обновлены имена значков (через поиск/замену) с @drawable/sf__icon на @mipmap/ic_launcher, так как я полагаюсь на Cordova для создания значков различных размеров из app/resources/icon, и я не могу понять, как изменить сгенерированные имена файлов. Мне всегда приходилось делать это и в старых сборках.
  21. На данный момент я думал, что готов, но я получил некоторые ошибки сборки, касающиеся библиотек поддержки Android; гугление предложило добавить плагин cordova-plugin-androidx-adapter. Это исправило ошибки сборки. Затем я снова удалил и снова добавил плагин MobileSDK Cordova и снова исправил имена значков.
  22. В этот момент приложение будет собрано, но в эмуляторе произойдет сбой. Отладка через Android Studio показала, что приложению не удалось найти модуль SalesforceSDK. После долгих исследований и экспериментов я обновил platforms/android/project.properties, добавив android.library.reference.# записей для SalesforceAnalytics, SalesforceSDK, SmartStore, MobileSync и SalesforceHybrid. Добавление только SalesforceSDK (например) привело к отсутствию еще одного модуля; в конце концов я добавил их все. До моих изменений были включены только CordovaLib и app (имя каталога моего приложения). Благодаря этому изменению я смог создать работающий отладочный APK.
  23. Я попытался собрать релиз apk и получил указанную выше ошибку. Во время исследования я обнаружил несколько различных отчетов об ошибках «Тип программы уже присутствует», которые якобы были исправлены путем добавления cordova-plugin-androidx и cordova-plugin-androidx-adapter. Поскольку я уже добавил cordova-plugin-androidx-adapter, я продолжил и добавил cordova-plugin-androidx (и снова удалил/повторно добавил плагин SF Mobile), но это ничего не изменило.

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

2
Jason Clark 26 Дек 2019 в 18:44

1 ответ

Я нашел решение. Как я упоминал в шаге № 10 выше, чтобы вообще создать работающее приложение, мне пришлось изменить platforms/android/project.properties. Первоначально он (созданный forcehybrid) содержал две ссылки на библиотеки:

 android.library.reference.1=CordovaLib
 android.library.reference.2=app

Это будет построено, но приложение вылетит; журнал показал, что системе не удалось найти класс com.salesforce.androidsdk.phonegap.app.HybridApp. В конце концов мне удалось создать отладочный apk, который запускается путем добавления модулей Salesforce в project.properties:

android.library.reference.1=CordovaLib
android.library.reference.2=SalesforceAnalytics
android.library.reference.3=SalesforceSDK
android.library.reference.4=SmartStore
android.library.reference.5=MobileSync
android.library.reference.6=SalesforceHybrid
android.library.reference.7=app

В конце концов я заподозрил, что повторяющаяся ссылка была вызвана этими ссылками; Я обнаружил, что могу удалить ссылку на CordovaLib (я предполагаю, что SalesforceSDK уже включает ее) и успешно собрать (и запустить) как отладочные, так и выпускные APK; мои последние ссылки на библиотеку:

android.library.reference.1=SalesforceAnalytics
android.library.reference.2=SalesforceSDK
android.library.reference.3=SmartStore
android.library.reference.4=MobileSync
android.library.reference.5=SalesforceHybrid
android.library.reference.6=app
0
Jason Clark 26 Дек 2019 в 19:55