- 1с для андроид ошибка загрузки библиотек
- Ошибки при работе с мобильным клиентом в 1С: Управление торговлей. Скажите в чем может быть причины таких ошибок и какие есть пути их устранения?
- Реверсим мобильную 1с под андроид. Как добавить немного функциональности и угробить несколько вечеров
- С чего все началось
- Первые шаги
- Строю планы
- Перепаковываю приложение без изменений кода
- Добавляю свои логи
- Запуск платформы через adb
- Внедряюсь в обработку данных от 1с и модифицирую метки
- Добавление новой функциональности
1с для андроид ошибка загрузки библиотек
Если у Вас наблюдается частое возникновение ошибки протокола (с кодом 8), попробуйте на МУ уменьшить значение настройки «Размер буфера (байт)», установив значение 1024. Данная возможность есть в МУ. В ПО «Агент Плюс: Мобильная торговля» настройку можно найти в меню «Сервис — Настройки» вкладка «Настройки обмена», открыв основную настройку обмена, и в поле «Размер буфера (байт)» установить необходимое значение.
Отметим, что размер буфера является экспериментальным значением и его необходимо подбирать в зависимости от типа установленного соединения, скорости и стабильности соединения. Если соединение стабильное и скорость передачи данных высокая, то в таком случае размер буфера можно попробовать увеличить: 2048 байт, 3072 байт и т.д. Если же соединение нестабильное, то значение размера буфера необходимо уменьшать. После каждой установки нового значения пробуйте обмениваться данными с 1С. Также хотим отметить, что мы не рекомендуем использовать зашифрованное соединение (например, с шифрованием «iPsec»), так как это также может приводить к ошибке протокола.
agkorepanov | Дата: Среда, 21.01.2015, 14:30 | Сообщение # 2 |
Ошибка загрузки библиотеки : \data\data\ru/agentplus.agentp2\lib\libapconf.so. код 4б Ошибка с кодом 46 означает, что попытка обращения к БД прошла неудачно. Если данная ошибка возникает при запуске приложения это означает, что для ее решения необходимо удалить БД на МУ. Удаление БД на МУ производится стандартными средствами ОС «Android» с помощью «Менеджера приложений» (меню «Settings» («Настройки») – «Applications» («Приложения») – «Manage Applications» («Менеджер приложений»). В общем списке приложений выберите «Agent+ 2.0» и нажмите кнопку «Clear data» («Очистить данные»). Приложение при этом должно быть остановлено. Обратите внимание, что при удалении файла БД удаляются и настройки обмена. Ошибка с кодом 46 может возникать в том случае, если на МУ заканчивается свободная оперативная или внутренняя системная память. Как правило, БД при этом бывает повреждена, и дальнейшая работа с ней невозможна. Поэтому помимо очистки БД мы рекомендуем провести дополнительные мероприятия по освобождению оперативной и внутренней системной памяти на МУ. Для этого можно удалить неиспользуемые приложения на МУ, очистить фоновые процессы и постоянно следить за объемом доступной постоянной и оперативной памяти на МУ. Обратите внимание, что рекомендуемый размер свободной системной памяти в МУ — это удвоенный размер БД в МУ. К сожалению, Вы не уточнили какую версию мобильного приложения «Агент Плюс: Мобильная торговля» используете в работе — «Базовая» или «Проф»? Дело в том, что ранее, при более частых обращениях по ошибке с кодом 46, нами был проведен анализ, в результате которого нам удалось выяснить некоторые обстоятельства, которые приводили к повреждению БД. В полнофункциональной версии ПО «Агент Плюс: Мобильная торговля. Проф», по данному вопросу нами были внесены некоторые изменения в текущем релизе 1.0.12, поэтому в работе мы рекомендуем использовать текущую версию ПО (1.0.12.69). Что же касается, базовой версии ПО, то в работе мы рекомендуем использовать версия «Агент Плюс: Мобильная торговля. Базовая» — 1.0.11.5, т.к. эта версия ПО является текущей. Ссылки на данные версии ПО направляем ниже в письме. Следует отметить, что число обращений среди наших клиентов по данной проблеме значительно уменьшилось, в результате использования текущих версий ПО. В свою очередь, решение проблемы с нехваткой памяти на МУ, заключается в хранении БД приложения не в системной памяти, а на карте памяти МУ. Такая возможность предусмотрена в обоих версия ПО «Агент Плюс: Мобильная торговля» (Базовая и Проф). Поэтому рекомендуем Вам поместить БД приложения на карту памяти МУ и проверить возникновение озвученной Вами ситуации. Папка хранения баз данных задается в настройках обмена «Агент Плюс: Мобильная торговля» (меню «Сервис — Настройки» закладка «Настройки обмена») в поле «Каталог хранения баз данных». Вы можете указать в этой настройке путь на карту памяти и все БД приложения будут автоматически перенесены в указанную папку. Источник Ошибки при работе с мобильным клиентом в 1С: Управление торговлей. Скажите в чем может быть причины таких ошибок и какие есть пути их устранения?Здравствуйте. У нас возникают непонятные ошибки в работе мобильного клиента на ТСД. На складской площади организации сотрудники работают с терминалами сбора данных (ТСД), на которых установлен мобильный клиент 1С для работы с конфигурацией 1С: Управление торговлей. Периодически на разных операциях возникают данные ошибки: Были проведены работы, которые исключили, что данные ошибки могут быть связаны с сетью. Скажите в чем может быть причины таких ошибок и какие есть пути их устранения? Технические и программные характеристики, используемого оборудования: Источник Реверсим мобильную 1с под андроид. Как добавить немного функциональности и угробить несколько вечеровСразу скажу что несмотря на громкое, как кому-то могло показаться, название статьи — тут не будет никакого прям уж совсем хардкора. А также несмотря на то что реверсинг чаще всего связывается с информационной безопасностью — здесь опять же ничего такого не будет, ибо никаких защит (за исключением небольшой минификации) обходить не было необходимости. Нет их. Мобильная 1с бесплатный продукт в который не встроено никаких проверок, защит и платных функций. Так что обращаюсь к тем кто надеется увидеть применение деобфускаторов, использование Frida/Xposed, другого хитрого софта — ничего интересного вы для себя не найдете. Тут мы просто будем использовать apktool, baksmali, apksigner, adb, jadx, консоль, текстовый редактор, javac, d8 и все. Также хочу заранее разочаровать тех кто ждал глубокий разбор платформы, или ее сильную модификацию. Будут внесены только небольшие правки буквально в несколько файлов, и собственно даже эти несколько файлов я не разбирал досконально, все по верхам. С чего все началосьНемного расскажу с чего мне вообще вдруг пришла идея как-то влезать в работу мобилки на 1с. На данный момент я вот уже скоро год как занимаюсь нативной разработкой под андроид, но до этого я проработал 4 года 1с программистом, причем последние года полтора мы часто работали именно с мобильной платформой. Несмотря на то что основные потребности она удовлетворяла, было у нее так же и очень много минусов (помимо языка программирования). В частности нельзя было по-человечески встроить какую нибудь внешнюю библиотеку, по крайней мере штатными средствами и с нашим тогдашним багажом знаний. Так же все было очень грустно, например, с функциональностью отображения меток на карте. Вся возможность ее настройки заключалась в указании текста для меток когда по ним тапаешь. На тот момент единственным способом как-то это обойти было использование специального объекта «ПолеHTMLДокумента», но с ним были свои проблемы. На время работы с 1с все мои знания в нативной разработке под андроид заключались в паре HelloWorld, так что идеи реверсить мобилку 1сную даже в голову не приходило, разные вопросы от заказчиков по нестандартному расширению возможностей 1с мы либо не решали никак, либо пилили очень простые нативные приложения ставившиеся рядом и криво/косо с 1с интегрировали (да и лицензионное соглашение 1с вроде запрещает правки в самой платформе). Так что первая причина заняться реверсингом 1с заключалась в том, что мне стало интересно, а что я могу сделать имея текущий багаж знаний. Сразу скажу, опыт нативной разработки оказался не сказать что нужен, в повседневной работе почти ничего из того что будет описано ниже не встречается. Так что в принципе наверно любой средний 1сник посидев несколько дней/недель смог бы во всем этом разобраться. Вторая же причина заключается в том, что мне просто захотелось попробовать поковырять чужие apk, ибо до этого я упускал этот, довольно широкий пласт знаний, и, поскольку нужно было с чего то начинать, мне пришла в голову как раз 1с. Первые шагиПервое что я сделал, еще когда идея реверсить 1с только смутно бродила в моей голове, просто перетащил мышью apk файл приложения на окно AndroidStudio. Хочу сказать сразу — что мне стало немного грустно, ибо большая часть кода 1с написана на C++ и лежит в .so библиотеках, и их отреверсить посложнее, да и не было интересно. А вот файл classes.dex всецело завладел моим вниманием, тем более что его скромный размер давал мне возможность предположить что и реверсить его будет несложно. В целом так и оказалось. Кстати, интересное следствие того что большая часть кода на C++ — очень много методов и классов избежали обработки с помощью ProGuard. Сложновато делать интероп с минифицированным кодом ;). Как можно видеть на скриншоте выше — минификации приложение почти не подвергалось (в плане переименования классов и методов). Плюс видно что кода на java очень немного и почти все место занимают so библиотеки. Повтыкав какое-то время на список классов, я увидел любопытный класс MapImpl, навевающий подозрения что именно он виновник такой грустной ситуации с кастомизацией отображения меток. Список методов и их сигнатуры внушали надежду что все будет очень просто, и я решил заглянуть в smali код, после чего сильно напрягся и пошел читать список команд smali, и как его читать/писать. Впрочем, именно на этом моменте я решил что дело обещает быть несложным и недолгим, а соответственно вот он, повод поиграться с реверсингом. Приняв для себя решение посвятить этому пару вечеров (как же жестоко я ошибался), пошел со спокойной душой спать ложиться. Строю планыПроснувшись с утра я решил что поскольку до этого момента никогда не занимался даже подменой ресурсов в приложениях, не то что изменениями логики, нечего мне замахиваться сразу на замену активити с картой, лучше приближаться к решению задачи маленькими шажками. После чего я составил себе небольшой список шагов который должен был привести меня в конечную точку моего путешествия в виде рабочей мобильной платформы с моими правками. Список этот выглядел следующим образом:
Ну, хорошо хоть с первым пунктом у меня проблем не возникло. Скачал бесплатную учебную версию платформы, скачал мобильную платформу, развернул все это у себя на компьютере (1С, сделайте вы уже версию учебную для linux, у меня как раз очередной порыв уйти с винды, а тут приходится часть работы в ней делать). Конфигурация очень простая, при запуске вызывает функцию ПоказатьНаКарте() в которую передает две точки на карте. Все. А вот со вторым пунктом из-за моей неграмотности вышло грустнее. Да что уж там, проблемы были со всеми пунктами кроме первого. Перепаковываю приложение без изменений кодаГугл мне сразу подсказал что есть такой отличный инструмент apktool позволяющий буквально двумя командами разбирать apk до .smali файлов, а так же собирать из них обратно. Им я и решил воспользоваться. Распаковал apk следующей командой (здесь и далее, несмотря на то что временами часть работы делал на linux, все команды буду приводить для windows): и получил каталог unpacked в котором лежала куча файлов, с ними в будущем предстояло работать. Запаковал apk обратно командой Попытавшись установить его на эмулятор я получил следующую ошибку: В общем нужно было больше внимания базе уделять. Я конечно знал что существуют подписи, и о том что они делятся на дебажные и релизные, но не знал что приложения вообще без подписей не устанавливаются. Я решил воспользоваться своей дебажной подписью, и подписав apk командой мне удалось запустить приложение. Правда вместо карты с двумя точками меня ждал серый экран с подписью google внизу. Почесав репу я решил что дело в том что используется ключ для гугл карт от 1с, который с моей подписью не работает. Поэтому пойдя в консоль разработчика на сайте google я создал новый проект для работы с api google карт на андроиде, получил api key, который указал в res/values/strings.xml в google_maps_key строке, а так же добавил свой дебажный ключ в разрешенные для проекта. Перепаковал и переподписал apk, запустил, и наконец все снова работало. Добавляю свои логиСледующее что я хотел сделать — это автоматизировать запуск приложения и добавление конфигурации 1с в платформу. Вручную после каждых правок делать это делать было бы той еще морокой. Сначала я нагуглил и попытался воспользоваться утилитами jadx или dex2jar, чтобы не мучиться с чтением smali, а читать более привычный код на java, но по какой-то причине они не работали (в дальнейшем jadx все таки завести удалось каким то шаманством). Пришлось разбирать smali, благо это оказалось не так ужасно как я боялся. Чтобы понять, как мобильная платформа получает от десктопной платформы команду на запуск конфигурации при подключении по adb, я решил посмотреть точки входа в приложение и добавить вывод в логи интентов и прочей полезной информации. Начать решил с application ( com.e1c.mobile.E1cApplication ) и активности имеющей android.intent.action.MAIN в intent-filter ( com.e1c.mobile.App ). Также меня заинтересовал reciever com.e1c.mobile.Starter с интересным intent filter на com.e1c.mobile.START_TEMPLATE и com.e1c.mobile.START_CMD . Уж очень похоже на то что он принимает интенты с командами 1с, и именно он стартует конфигурацию из шаблона. В E1cApplication ничего интересного к сожалению обнаружить не удалось, все что там происходит — установка своего хендлера на крэши. А вот в двух других классах, Starter и App информации было гораздо больше и оказалась она довольно полезной. Метод App.onCreate(Landroid/os/Bundle;)V довольно большой, так что приводить его целиком не буду, приведу только заинтересовавшие меня части. Из приведенного выше участка кода видно что приложение получает интент, кладет ссылку на него в регистр p1 , через StringBuilder дописывает к имени класса и метода и передает в статический метод V(Ljava/lang/String;)V класса Utils . Видимо какой-то свой логгер. После чего интент проверяется на наличие дополнительных данных, и, при наличии, из него получается Uri , из которого в свою очередь получается строка методом getQuery() и передается классу Starter . Дальше изучать onCreate смысла не видел, пробежался взглядом и убедился что действия довольно стандартные. Разве что вью вроде бы создается программно абсолютно другим классом, вместо использования LayoutInflater , но сильно глубоко я не копал, так что возможно все и не так как я подумал. Следующий класс куда я пошел — Starter . Благо он и в активити упоминался и в манифесте меня заинтересовал. К сожалению тот метод что вызывался из активити, оказался нативным ( .method static native startCmd(Ljava/lang/String;)V ), потому обратил внимание на метод onRecieve (в котором приложение принимает интенты на которые подписано). Приводить код не буду, меня в нем заинтересовало что интент так же логигуется методом V(Ljava/lang/String;)V класса Utils . Получается что достаточно дописать немного smali кода в этот метод — и я получу свои логи, причем на тех же местах где их задумывали разработчики платформы. Перейдя в класс Utils я увидел сразу 2 пустых метода, V и W. Видимо пустые они потому как при компиляции релизной версии вырезались. Я просто дописал в них запись переданной строки в стандартный android.utils.Log . Для этого сменил количество требуемых локальных регистров с 0 до 1 (для строки тега), поместил эту самую строку в регистр v0 , а также прописал вызов методов Log Запустил из 1с десктопной 1с мобильную и получил следующие логи Как видим — есть вся необходимая информация для автоматизации запуска приложения через adb. Правда к этому моменту я словил двойной фейспалм. Во-первых, наконец подобрал ключи с которыми jadx осилил перевод в java (понятно что писать все равно в smali бы пришлось, но все же). А вторым фейспалмом оказалось то что я осознал что зря я мучаю платформу разработчика (нужна только для разработки и отладки конфигураций), правильнее было бы реверсить сборку релизов 1сных приложений, причем там есть полу готовые gradle проекты для сборки, есть файл с перечнем зависимостей и другие плюшки. Я немного по этому поводу погрустил — и решил все таки закончить с тем что начал. Все равно ради фана делаю все это, а не ради практической пользы. Запуск платформы через adbАвтоматизировать установку и запуск через adb приложения я решил с помощью gradle. Все равно к тому моменту у меня уже был написан небольшой перечень тасок (распаковка, копирование модифицированных ресурсов и smali файлов в каталог с распакованным приложением, упаковка, подпись, по сути все таски просто раннеры для команд консольных). К существующим таскам добавил выполняющие следующие команды Перечисленной выше последовательностью команд мы устанавливаем apk, даем установленному приложению разрешение на чтение диска, копируем конфигурацию 1с на устройство, и даем команды на запуск 1с и загрузку конфигурации. Работает это кстати не на всех версиях андроида, но я тестировал на api 28, и соответственно на нем эта последовательность делает все корректно. На младших версиях могут быть проблемы с выдачей прав. Внедряюсь в обработку данных от 1с и модифицирую меткиТут у меня было несколько вариантов дальнейшего развития событий.
Пойдя по третьему варианту я создал 2 подкаталога в src: java, для MapImplExtenstion.java и stubJava для файлов которые нужны только для компиляции. Поскольку я решил подправить чуть внешний вид меток, меня заинтересовали два следующих поля: Используя jadx для декомпиляции в java нашел в декомпилированном коде метод отвечающий за их заполнение Соответственно у класса MapImplExtension добавил метод ArrayList[] kN(String[] titles, double[] coordinates) который в первом элементе массива вернет список который нужно будет поместить в Xj, а во втором список для Xk. Скомпилировал следующими командами сначала в class, затем в dex, затем декомпилировал в smali чтобы потом упаковать вместе с остальными файлами Добавил в MapImpl.smali поле extension типа нашего нового класса, и добавил его инициализацию А также заменил обработку в классе MapImpl данных от 1с на обработку в классе MapImplExtension Запаковав и запустив приложение — я радостно увидел что все работает. Но на данный момент я не сделал ничего такого что именно расширило бы возможности мобильной платформы. Просто подменил заголовки у меток на карте. А вот захотев изменить изображения меток я здорово обломался и зарылся довольно надолго в исходники и документацию. Добавление новой функциональностиСначала немного пояснений как вообще устанавливается маркер для метки. У класса MarkerOptions есть метод public MarkerOptions icon (BitmapDescriptor iconDescriptor) в который передается объект созданный одним из статических методов класса BitmapDescriptorFactory . И вот здесь собственно меня ждал облом. Поскольку 1с это дело не использует — соответствующие классы были просто вырезаны при минификации. Пришлось их восстанавливать, и было это больно и долго. Точнее классы то были, но были переименованы и не содержали нужных методов. Путем ковыряния в сорцах полной библиотеки для работы с картами — по сигнатурам и константам выяснил соответствия классов библиотеки классам приложения, добавил необходимые методы и поля, пересобрал, и порадовался что этот квест наконец закончил, поскольку все наконец то заработало, пусть и не с первой попытки (несколько раз косячил с сигнатурами и путал минифицированные классы). Поскольку объем измененного кода довольно большой — включать в статью его не буду, приведу только изменения сигнатур. Если кому интересны все правки которые я сделал на этом шаге — можете посмотреть в этом коммите. Подводя итоги — опыт был довольно интересный. По крайней мере для меня. Помог разобраться с некоторыми инструментами, узнал немного лучше о работе андроида и формате байткода для dalvik/art, опыт ковыряния минифицированного кода тоже будет полезен (уже был случай когда в релизной версии R8 вырезал поля класса которые на самом деле использовались, в тот раз только методом тыка разобрался, сейчас бы это проблем не доставило). Если кому-то интересно самому все повторить и возможно расковырять еще больше — я выложил на github все исходники вместе с кривым gradle скриптом осуществляющим сборку из исходного apk модифицированного. Источник |