Как измерить уровень сети (как сравнить сетевого протокола),

Я заметил то же самое сообщение об ошибке, используя фрагмент кода, предоставленный с документацией Environment.getExternalStoragePublicDirectory .

Код работает нормально, как и ожидалось, и делает новый файл видимым в галерее устройства , но в то же время печатает ошибку о leaked ServiceConnection.

Глядя на внутренний код Android в MediaScannerConnection, кажется, что существует какой-то механизм для остановки службы после последнего файла. Может быть, это не работает, когда дается только один файл?

Я решил использовать совершенно другое решение, сообщив MediaScanner через Intent. Это тоже хорошо работает и не выдает никаких предупреждений:

Intent mediaScannerIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uri fileContentUri = Uri.fromFile(permFile); // With 'permFile' being the File object
mediaScannerIntent.setData(fileContentUri);
this.sendBroadcast(mediaScannerIntent); // With 'this' being the context, e.g. the activity

Кажется, что это предпочтительный способ, поскольку он также упоминается в Android-обучении о съемке фотографий .

12
задан mkc 1 July 2012 в 23:43
поделиться

2 ответа

Если я правильно вас понял, вас в основном интересует что-то вроде Linux 'strace' ( Введение ) для сетевых системных вызовов?

Возможно, комбинация профилировщика и отладчика для сетевых приложений (например, «ntrace»), обеспечивающая подробный анализ различных дополнительных измерений?

В Linux утилита strace в значительной степени основана на о функциях, предоставляемых ядром Linux, а именно ptrace (трассировка процессов) API:

Использование ptrace,должно быть возможно получить большую часть интересующих вас данных.

В Windows вы, вероятно, захотите изучить обходные пути , чтобы перехватить / перенаправить вызовы Winsock API для проверки / в целях тестирования.

Если вам действительно не нужно столько низкоуровневой информации, вы, вероятно, также можете напрямую использовать strace (в linux) и использовать его только для отслеживания определенных системных вызовов, например, рассмотрите следующую строку, которая будет только вызовы трассировки для открытого системного вызова (используя дополнительный параметр -o FILE, вы можете перенаправить весь вывод в выходной файл):

strace -e trace = open -o results.log

Путем передачи дополнительного флага -v to strace, вы можете увеличить его подробность, чтобы получить дополнительную информацию (при работе с SCM, такими как git, которые состоят из множества небольших утилит оболочки и автономных инструментов, выЯ, вероятно, также захочу изучить использование флага -f, чтобы также отслеживать разветвленные процессы).

Итак, то, что вас может заинтересовать, это все системные вызовы, связанные с сокетами , а именно:

  • accept
  • bind
  • connect
  • getpeername
  • getsockname
  • getsockopt
  • listen
  • recv
  • recvfrom
  • send
  • sendto
  • setsockopt
  • shutdown
  • socket
  • socketpair

(вначале вы, вероятно, захотите изучить только обработку вызовов send ... / recv ...)

Чтобы упростить это, вы также можете использовать «сеть» в качестве параметра для трассировки, которая будет отслеживать все связанные с сетью вызовы:

-e trace = network: отслеживать все связанные с сетью системные вызовы.

Таким образом, соответствующий вызов strace может выглядеть как это:

strace -v -e trace = accept, bind, connect, getpeername,getsockname, getsockopt, listen, recv, recvfrom, send, sendto setsockopt, shutdown, socket, socketpair -o results.log -f git pull

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

Например, при выполнении следующего в оболочке Linux: strace -v -o wget.log -e trace = connect, recv, recvfrom, send, sendto wget http://www.google.com

Полученный файл журнала содержит такие сообщения:

  • recv (3, "HTTP / 1.0 302 Найдено \ r \ nLocation: htt" ..., 511, MSG_PEEK) = 511
  • sendto (4, "\ 24 \ 0 \ 0 \ 0 \ 26 \ 0 \ 1 \ 3 ^ \ 206 * J \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 "..., 20, 0, {sa_family = AF_NETLINK, pid = 0, groups = 00000000}, 12) = 20

Глядя на страницы руководства для этих двух системных вызовов, становится очевидным, что 511 и 20 - это количество передаваемых байтов. Если вам также нужна подробная информация о времени, вы можете передать флаг -T в strace:

-T - время печати, затраченное на каждый системный вызов

Кроме того, вы можете получить некоторую статистику, передав флаг -c:

-c: подсчитывать время, количество вызовов и ошибок для каждого системного вызова и сообщать сводку по программе. выход. В Linux это пытается показать системное время (время процессора, затраченное на работу ядра) независимо от времени настенных часов. Если -c используется с -f или -F (ниже), только агрегат итоги по всем отслеживаемым процессам сохраняются.

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

-e read = set: выполнить полный дамп в шестнадцатеричном формате и ASCII всех данных, считанных из файла. дескрипторы, перечисленные в указанном наборе. Например, чтобы увидеть всю активность ввода в файле дескрипторы 3 и 5 используют -e read = 3,5. Обратите внимание, что это не зависит от нормального трассировка системного вызова read (2), который управляется опцией -e trace = read. -e write = set: выполнить полный дамп в шестнадцатеричном формате и ASCII всех данных, записанных в файл. дескрипторы, перечисленные в указанном наборе. Например, чтобы увидеть всю активность вывода в файле дескрипторы 3 и 5 используют -e write = 3,5. Обратите внимание, что это не зависит от нормального трассировка системного вызова write (2), который управляется опцией -e trace = write.

Вы также можете настроить максимальную длину строк:

-s strsize: укажите максимальный размер строки для печати (по умолчанию 32). Обратите внимание, что имена файлов не считаются строками и всегда печатаются полностью

Или строки должны быть выгружены как шестнадцатеричные:

-xx: Вывести все строки в шестнадцатеричном строковом формате.

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

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

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

Если вам также нужны данные об эффективности протокола, вы можете может захотеть изучить tcpdump .

15
ответ дан 2 December 2019 в 18:20
поделиться

Возможно ответ будет использовать SystemTap . Среди примеров скриптов есть nettop , который отображает (некоторую) требуемую сетевую информацию в "верхнем" виде, и есть скрипт iotime , который показывает информацию ввода-вывода в требуемой форме. .

5
ответ дан 2 December 2019 в 18:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: