Переподписание APK и получение данных через ContentProvider

В настоящее время я пишу приложение (приложение A), которое зависит от данных другого приложения (приложение B).

Будучи новичком в Android, я думал, что единственный способ включить это — использовать ContentProvider и выполнить запрос.

Как бы то ни было, текущий способ сделать это проблематичен, потому что приложение B имеет другую подпись, чем та, которую мы используем для приложения A. Это означает:

  • The only way we can get our apps to talk to each other is to send our apk on a signing server so that it is also signed with the same key used for App B
    • This process is not automated, so it is therefore time-inefficient (takes around 2 - 4 mins).
    • Это также означает, что мы не можем устанавливать точки отладки, что причиняет нам много боли при попытке увидеть, какие именно данные возвращаются ContentProvider

Я провел дополнительное исследование, и мой коллега сказал, что вместо того, чтобы подписывать наш apk каждый раз, когда мы вносим небольшое изменение, мы можем извлечь apk приложения B и подписать его нашим ключом только один раз.

Это привело меня к созданию хранилища ключей и ключа для моей команды, которые я использовал для повторной подписи apk приложения B и переустановки его на нашем тестовом устройстве. Затем я настроил свою Android Studio на автоматическую подпись отладочных версий приложения A с помощью того же самого ключа. Проблема в том, что, к сожалению, ничего не изменилось... Это всегда заканчивается следующим исключением:

Failed to find provider info for com.App.B.provider

(в основном та же ошибка возникает, когда мы используем apk приложения B по умолчанию, не отправляя apk приложения A на сервер подписи)

Просто хочу отметить, если вам интересно, отправка apk приложения А на подписывающий сервер и его запуск действительно работает, и мы получаем данные из ContentProvider

Так что да, я больше не знаю, что делать... Есть идеи? Кроме того, поскольку я не уверен, что имею представление о том, что делаю, любое объяснение того, как все это должно происходить, будет очень кстати!


person Skwiggs    schedule 19.04.2016    source источник


Ответы (1)


Тег <provider> должен быть помещен внутри тега <application>. Кроме того, будьте осторожны, чтобы не поместить его в тег <activity>. Также вы можете заставить его работать, указав полный путь в теге <authorities> в файле манифеста (см. пример кода SearchableDictionary в SDK).

<provider android:name=".DictionaryProvider"
   android:authorities="com.example.android.searchabledict.DictionaryProvider">

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

person Devendra Singh    schedule 19.04.2016
comment
Я не уверен, как тогда ссылаться на этот тег в коде Java. На данный момент я использую этот код для запроса ContentProvider: private final Uri APP_B_URI = Uri.parse("content://com.App.B/CALENDAR"); - person Skwiggs; 19.04.2016
comment
Я имел в виду файл menifest.xml. - person Devendra Singh; 19.04.2016
comment
Я понял, что я имел в виду, как тогда я могу получить URI из этого тега? Так как я запрашиваю ContentProvider во время выполнения следующим образом: Cursor cursor = contentResolver.query(APP_B_URI, null, where, null, "localstart"); - person Skwiggs; 19.04.2016