Есть ли способ декомпилировать двоичный файл google protobuf (файл .pb) в файл .proto

Когда я переворачиваю apk, я получаю файл .pb, но не файл .proto, есть ли способ декомпилировать этот файл в файл .proto или я могу просто сгенерировать код Java из этого файла .pb?


person Kevin    schedule 29.07.2019    source источник
comment
Файл .pb — это данные? Или это скомпилированный набор дескрипторов? Если это данные: вам придется перепроектировать их — есть инструменты, которые помогут, так что это не обязательно сложно. Если это скомпилированный набор дескрипторов: намного проще. У Protoc есть инструмент для просмотра необработанных полезных нагрузок, как и мои онлайн-инструменты здесь protogen.marcgravell.com/decode   -  person Marc Gravell    schedule 29.07.2019
comment
Это скомпилированный набор дескрипторов. вы имеете в виду --decode_raw ? Есть ли способ получить файл .proto напрямую?   -  person Kevin    schedule 29.07.2019
comment
вопрос: для чего вам нужен .proto для? это для редактирования? если это для генерации кода, протокол IIRC примет скомпилированный набор дескрипторов в качестве входных данных (или вы можете напрямую вызывать плагины — плагины работают так, что скомпилированный набор дескрипторов передается на стандартный ввод)   -  person Marc Gravell    schedule 29.07.2019
comment
Для создания кода Java. Какой плагин? protoc может не сгенерировать этот файл   -  person Kevin    schedule 30.07.2019


Ответы (1)


Если (согласно комментариям) файл, который у вас есть, представляет собой скомпилированный набор дескрипторов, то вы можете использовать protoc для создания из него любого языка (который он обычно поддерживает); просто используйте опцию --descriptor_set_in=FILES в командной строке, чтобы указать ваш файл в качестве входных данных (вместо FILES), и используйте --java_out=OUT_DIR (или что-то еще), чтобы указать язык вывода и местоположение.

person Marc Gravell    schedule 30.07.2019
comment
Как это работает на самом деле? Когда я использую команду protoc --description_set_in=./myfile.pb --java_out=. Я получил ошибку «Отсутствует входной файл». Когда я добавляю пустой файл в конец (независимо от того, существует он или нет). Я получил ошибку Нет такого файла или каталога. - person Kevin; 30.07.2019
comment
@Кевин descriptor_set_in, а не description_set_in - person Marc Gravell; 30.07.2019
comment
Извини. Это опечатка. Я использую descriptor_set_in - person Kevin; 30.07.2019
comment
@Kevin ой, мой плохой - вам все еще нужно указать файл - он проверяет наборы дескрипторов перед проверкой файла. Итак: попробуйте protoc --descriptor_set_in=your.pb --java_out=somedir your.proto — я только что проверил это локально, и все работает нормально (на диске нет your.proto); единственный трюк: знать имя файла в наборе дескрипторов. Я, вероятно, могу извлечь это, если вы не можете понять это - person Marc Gravell; 30.07.2019
comment
Хм, Unknown flag: --descriptor_set_in, версия 3.14.0 - person Andrii Karaivanskyi; 05.02.2021