누군가 반값을 선물했습니다
잠금 해제할 때 앱에서 이 코드를 입력하세요. 사용자나 이 휴대전화에 묶여 있지 않습니다.
휴대전화가
진짜 계측기가 됩니다.
Signal Collector는 휴대전화가 닿을 수 있는 센서와 무선, 네트워크 데이터를 휴대전화 안에 곧바로 계속 기록합니다. 클라우드 저장소도 없고, 측정 데이터가 기기를 떠나지도 않습니다.
실제 촬영 · Pixel 10a
-
진행 중인 측정. 고리는 위성과 네트워크, 센서가 들어오는 대로 보여 줍니다.
-
무엇을 측정할지 고르는 화면. 소스마다 무엇을 기록하는지 한 줄로 적혀 있습니다.
-
시작, 초기화, 중지. 그 위에 지속 시간과 거리, 레코드 수가 있습니다.
-
패널 아래쪽: 소스마다 무엇을 하고 있는지, 그리고 휴대전화를 떠나는 파일.
-
설정: 자체 서버로 전송, 단위, 그리고 중지한 뒤에 일어날 일.
내부 테스트
상점에 오르기 전의 다음 버전.
모든 빌드는 프로덕션으로 가기 전에 내부 테스트를 거칩니다. 휴대전화에 로그인된 Google 계정으로 참여하면 그 뒤로는 다른 앱과 똑같이 업데이트가 들어옵니다.
MVP 범위
한 번의 측정.
맥락 전부.
- 01GPS, GNSS와 기기 센서
- 02이동통신망: LTE / 5G / 3G / 2G
- 03Wi-Fi, Bluetooth와 네트워크 컨텍스트
- 04Wi-Fi와 이동통신을 통한 연속 인터넷 매핑
무엇에 쓰는가
모든 사례의 끝은
하나의 파일입니다.
계측기는 소스 목록이 아니라 그것이 답하는 질문으로 팔립니다. 이 앱이 상정한 열두 가지 상황 가운데 여섯 가지입니다. 하나하나가 한 번의 걷기이고, 그 끝에는 파일이 있습니다.
회의실의 사각지대
휴대전화를 주머니에 넣고 층을 걸으며 문마다 메모를 남기십시오. 초 단위 처리량과 휴대전화가 실제로 접속해 있던 AP가 나오고, 그러면 논쟁 대신 방 하나가 남습니다 — 두 부서 사이의 다툼이 그렇게 정리됩니다.
차량 없는 드라이브 테스트
SIM 두 장이 모두 스캔하고, GPS는 1초 간격, 휴대전화는 대시보드에 고정합니다. 기술이나 Cell ID, PCI가 바뀔 때마다 이벤트로 남으므로 핸드오버가 미터 단위 위치와 함께 나옵니다.
GPS가 잡히지 않는 곳의 조사
창고에서는 하늘이 곧 지붕입니다. 앱 자체 뷰파인더로 통로마다 사진을 찍어 표시하고 AP와 MLO 링크, RTT 거리를 모으십시오 — 새 AP를 한 대 사기 전에 커버리지 지도가 나옵니다.
스스로 알리는 센서
건물 곳곳에 BLE 온도계 수십 개가 있지만 어느 것과도 페어링되어 있지 않습니다. 지나가기만 하면 온도와 습도, 배터리 전압이 이름이 붙은 SI 단위로 들어옵니다. 그 값이 나온 바이트와 나란히 기록됩니다.
임대인에게 내놓을 증거
10분만 걸어도 시각과 위치, 신호 세기, 방 사진이 담긴 파일이 남습니다. 「어디서나 신호는 괜찮다」던 말이 확인할 수 있는 주장이 됩니다.
클라우드를 받아들이지 않는 고객
평소처럼 측정하고 자신의 S3, WebDAV, SFTP로 전송하거나 파일로 건네주십시오. 사진과 음성 메모는 휴대전화 갤러리에 닿지 않으므로 NDA를 그대로 지킬 수 있습니다.
작업이
눈에 보입니다.
1.5.1 버전은 열두 가지 언어를 모든 설치본에 담고, 오래 걸리는 내보내기나 초기화가 어디까지 진행됐는지 보여 주며, 측정을 켜지 않고 남긴 지점과 사진, 테스트를 담는 자유 노트를 더했습니다.
정말로 들어 있는 언어
예전에는 Google Play가 설치 시점에 휴대전화에 있던 언어만 내려주었습니다. 그래서 앱별 언어 선택에는 체코어를 비롯한 언어가 뒤에 문자열 없이 이름만 올라 있었습니다. 이제는 열두 가지 번역이 모든 설치본에 들어갑니다.
키 위의 혜성
큰 측정에서는 내려받기와 공유, 초기화에 수 초에서 수 분이 걸립니다. 이제 키 가장자리를 혜성이 돌며 끝난 만큼 꼬리가 길어지고, 그 아래 줄이 얼마나 끝났는지, 얼마나 돌았는지, 대략 얼마나 남았는지 알려 줍니다. 쓰기가 시작되기 전에 남은 공간이 보이고, 빠듯하면 호박색, 내보내기가 들어가지 않으면 빨간색이 됩니다.
자유 노트
측량 지점과 사진, 음성 메모, 일회성 인터넷 테스트와 Wi-Fi 처리량 주기에 더는 시작이 필요하지 않습니다. 측정이 돌고 있지 않으면 이것들은 별도의 기록으로 들어갑니다. 수집기도, 웨이크 록도, 무료 1시간 차감도 없습니다 — 자체 카드와 자체 공유 파일, 자체 비우기를 가집니다.
아이콘에서 공유, 시스템 컨트롤
측정이 멈춘 뒤 앱 아이콘을 길게 누르면 시작 옆에 공유가 있습니다; 앱이 열리며 곧바로 내보내기가 시작됩니다. 스위치와 텍스트 입력, 선택, 메시지는 이제 표준 Android 컨트롤입니다 — 키와 계측기는 그대로입니다.
Nothing lost
on the way out.
Version 1.5.0 adds no new key. It goes over everything that could cost a measurement its data — a Reset under a stray thumb, a point number used twice, an export torn in half by a second export — and closes each one, with a test that keeps it closed.
A Reset that asks first
The first touch on Reset deletes nothing. It opens a dialog that names what would go: the measurements, the photos and the voice notes. Cancel keeps everything; only a confirmation wipes. A thumb that brushes the key in a corridor no longer ends a day's work.
Points keep their numbers
Stop a measurement, start it again, mark a point: it gets the next number, not a repeat of one already in the file. The same holds for photo and voice marks, so two records never share one point index and the export stays unambiguous.
An export in one piece
Export takes a single atomic snapshot of the database, and two export requests at once queue instead of tearing one archive. The manifest is computed from the bytes that actually went into the archive, with a SHA-256 for every file. You get a readable archive or a plain error — never a silent torso.
Failures that stay failures
When the writer loses a batch, Stop cannot turn the run into a success. Encrypted Eddystone telemetry stops showing up as plausible plain numbers. Dual-SIM attribution, WPA3-only networks, probe time budgets and the microphone handoff are hardened, and the expandable cards tell TalkBack what they are.
Started without
opening it.
Version 1.4.0 puts Start and Stop where the hand already is — the quick settings shade and the app icon — and lets a marked point carry a photo and a voice, so what a corridor looked like leaves together with the numbers.
A tile in the shade
Start and Stop in the quick settings shade, within reach from any app and over the lock screen, where a widget cannot go. Over a secured lock it unlocks first — what it starts is location with a microphone. It measures with whatever the app measured with last, so one key never starts two different measurements.
Shortcuts under the icon
A long press on the app icon is the only control that is always on the home screen, so it offers the one thing that makes sense now: Start while nothing runs, Stop and Mark point once it does. The gate the launcher walks through is locked with a token no other app can read.
A photo and a voice at the point
A marked point can carry a photo taken through the app's own viewfinder, or a spoken note of up to ten minutes. The media never touch the phone gallery: they sit in the app's private storage and leave only through an export, which becomes a single tar.gz with a SHA-256 for every file.
Settings you can take with you
A new phone set up like the old one, without walking through two dozen sources by hand. Passwords go into the backup only if you ask, and only after a fingerprint, a face or the screen lock. The licence and the free hour never travel in it.
The data, open
to be looked at.
Version 1.3.0 puts the keys on the home screen, opens the measured rows inside the app, lets the controls be carried to the edge of the display, and starts reading sensors that are not in the phone at all.
Keys on the home screen
Three widgets that need no app opened first: a point mark with your own labels, a key that starts a saved set of sources, and a tile showing what one source is collecting. Each key keeps its own copy of what it starts, so a preset switched in the app later changes nothing on the home screen.
Rows you can read on the spot
Browse records opens the raw rows of the last measurement: filter by type and time, search the payload, and a sequence number that holds across the whole file. Marking and hiding is crossing out in the printout — the stored measurement and the export are untouched.
Keys carried to the edge
Hold Start, Reset or Stop and drag it to the bottom edge of the display; there it stays put while you scroll anywhere. Let go outside a berth and the key swings back with an overshoot as big as the distance it travelled.
Sensors that are not in the phone
BTHome, Ruuvi, ATC and pvvx, Eddystone telemetry. Read straight from the Bluetooth scan that is already running: nothing to pair, nothing to connect, no new permission. The values land named and in SI units, beside the bytes they came from.
A panel you can
put your thumb on.
Version 1.2.0 turns the screens into the front panel of an instrument. Switches light up as a whole, keys sink into their base under the thumb, and colour is left to mean a reading — everything else is grey.
Switches that light up as one
The switch is a rocker from a switchboard, cast from translucent red plastic. Switched on, the whole rocker glows instead of a dot in the corner; the I/O marking stays readable in both positions and the rocker always leans to the side that applies.
Keys that stand on a base
Start, stop and the export keys sit on their own base and a press sinks them into it, the same as the buttons here on the site. Haptics answer in the same order: a click going down, a quieter clack coming back.
Grey panel, colour that means something
The panel is neutral grey, so every colour on it is a reading: green for controls and for running, amber for warnings, red for stopping. A screen grid with divisions and dashed axes lies under the content.
Half the download
The release build is shrunk and optimised by R8, which took the bundle from 8.3 MB down to 4.3 MB, and the outdated library Google Play kept reporting is raised through the services that pull it in.
Edges instead
of pebbles.
Version 1.1.0 stops the app looking like a sketch. Shapes go to the right angle, measured values get a dial typeface, and selections become rows that say what each option means.
Sharp edges and a dial typeface
Cards, fields and buttons keep at most two pixels of rounding, and measured values are set in a face where every digit is the same width — a column of numbers no longer dances under the eye. Spacing sits on a four-point grid.
Rows with a description, not pills
Technologies, presets and targets are rows with the current value on the right. On a source with parameters, tapping the row switches it and the chevron opens its settings — a pill could not tell those two apart.
Units say what they changed
Switching units used to close the menu and leave no trace. The dialog now says what it switched to, where it shows up, and that the export stays in metres.
Out of testing,
into the world.
Version 1.0.0 is the first public release. The instrument itself is unchanged; what is new is that anyone can install it, try it for an hour before paying, and read the screens in their own language.
An hour of measuring, on the house
Every phone gets one hour of measuring time a year, split across as many measurements as you like — the tool is meant to be tried in the field, not from a screenshot. The remaining time and the date it comes back are shown right above the Start button.
Bought once, not rented
Unlocking is a single in-app purchase at the Google Play price for your country. No subscription, no expiry, and it follows the account onto every other phone you sign in to.
Permissions explained before they are asked
The first launch no longer opens with a stack of system dialogs. A screen says what each permission is for — and that location is what Android ties cells and Wi-Fi to — and the system asks only after you press the button.
Screens in your language
The app and this site speak a whole range of languages, chosen by the phone or set for Signal Collector alone. The export never follows: it stays in SI, UTC and English column names, so two files from two countries are still one dataset.
Ready for the world
and for the Store.
Version 0.10.0 completes the move to the production identity, adds full English and US units, closes the release blockers and gives the instrument a calmer, more precise visual system — without changing how it is operated.
English and Czech, neither one a bolt-on
Text is no longer produced inside the collection layer, and errors are no longer recognised by their wording. The language can be switched for the app alone, and an English phone never gets half-Czech screens. Numbers follow the locale; the export deliberately stays stable.
Metres, feet and miles
Units can follow the phone automatically, or be forced to metric or imperial in the settings. Only the screen and the notification are converted; the database and the scientific export always stay in SI.
A release with no silent traps
The production bundle requires the upload key, targets Android 16 / API 36 and carries the final identity app.signalcollector. Corrected permission checks close the crashes that followed a revoked permission, and the updated SSH client brings security fixes.
Around the globe
runs time itself.
Inside the globe sits only what has a bearing. Quantities without direction got their own bands outside the horizon, the operator composes the instrument themselves — and measured data can finally leave the phone by a route other than the share sheet.
Four quantities in the ring
Noise, temperature, pressure and now light. The angle along a band is time, not bearing — one minute split into seconds, so the head of the trace sweeps like a second hand with a gap behind it where values have aged out of the minute.
You compose the view
The middle button switches off whatever the cursor rests on. A switched-off row stays in the list with its value, only struck through: the filter changes the picture, not the measurement.
Data can leave on their own
The gear icon gained S3, WebDAV and SFTP destinations. Passwords are encrypted with a key from the Android Keystore, an address without https is rejected, and the server key fingerprint is verified.
You can see
where the signal came from.
The pulsing background circle gave way to a globe of the sky. Satellites sit where they actually are — and anything without a direction lights the whole ring instead of inventing a bearing.
Satellites in their real place
Android reports azimuth and elevation for GNSS only, and the app has recorded them since day one — there was simply nowhere to see them. Colour separates the constellation, size and brightness carry C/N0, a filled dot counts towards the fix. Verified on a Pixel 10a: 20 satellites from four constellations, 14 in the fix.
What has no bearing lights the whole horizon
Wi‑Fi gives strength, not azimuth; Bluetooth gives none either, and cells report only their identity. Samples without direction therefore ripple the entire ring rather than a sector — a sector would claim the signal came from there. The ripples also rotate, so not even the tallest of them points anywhere.
It tilts with the phone, not just turns
Lying face up it looks into the zenith, held upright it looks at the horizon — and what was near the horizon moves behind the phone. Collapsed, the card leaves a flat compass with a needle to north: calm, no flicker.
Scrolling that
never jumps away.
While hiding, the header used to take part of the gesture for itself and the content was re-measured under the finger. Now it only observes the scroll and takes nothing from it.
Content follows the finger the whole time
The finger used to drag while the page stood still until the header had collapsed — and on reversing direction it expanded again first. The header now sits above the content and takes no part in scrolling; it simply moves away, taking the status row with it.
Nothing is re-measured mid-scroll
It hides by offsetting at draw time, not by changing its height, so the content inset stays constant. Measured on a Pixel 10a: 0.30 % janky frames and no missed vsync across ten drags over the threshold where the header switches.
It returns the moment you pull down
Direction decides, not position — you do not have to scroll back to the top to get the header. Because it also returns mid-page, it got an opaque backdrop; otherwise the title would sit on top of the card text.
A scan that does not
pretend to be a measurement.
Android throttles Wi‑Fi scans and keeps handing back the same result meanwhile. The app used to write it down again and again — and the export then claimed a measurement every five seconds.
A repeated scan is recognisable
Every attempt records the state FRESH, THROTTLED or UNCHANGED together with the age of the result; per-AP records are written only for a fresh scan. Without that, the data could not tell you where measuring actually happened — and for a coverage map, that is the whole difference.
Six times denser sampling
Measured on a Pixel 10a: with throttling on, 70 rejected attempts against 45 fresh scans; with it off, zero rejections and a fresh scan every 4.2 s at the median. At walking pace that is one sample every 6 metres instead of every 40.
Points on a floor plan, throughput per network
GPS gives no position indoors, so a place marker was added — you stop, mark a point, walk on. And a new optional source visits the Wi‑Fi networks you list one by one and measures their actual throughput, not just their signal.
Every second
gets its own row.
Continuous internet measurement no longer leaves holes in the timeline. When measuring is impossible, the reason is written down — and a Wi‑Fi network that is gone is recognised at once, not ten minutes later.
A second without a measurement is still a row
A capacity burst or a manual speed test holds the link for several seconds, and the data used to be left with a gap — a full minute in the worst case. Now it says BUSY, naming who held the link. A missing second cannot be told apart from a failed measurement; a written one can.
A dead Wi‑Fi is recognised immediately
After losing Wi‑Fi, the app stayed bound to a network that no longer existed, and over six hundred samples claimed the internet was not answering. The handle is now dropped as soon as the system stops knowing about it, and the app waits for a new Wi‑Fi with internet.
A sample knows which Wi‑Fi it came from
SSID and BSSID were added to the quality record — until now only the direct Wi‑Fi source knew them, and measured quality could not be tied to a network. Android placeholder values (RSSI −127, frequency −1) are also left empty instead of looking like readings.
From your pocket you can tell
how the run is going.
The notification for a running measurement no longer just says “collecting data”. It shows the duration and the record count, refreshes every five seconds and speaks up when data stops being stored.
Time and count in the notification
On a dark screen you see 00:02:43 · 29,880 records instead of a terse line. The duration is pure collection time, the same as on the status card — a pause between Stop and Start does not count towards it.
Data loss reports itself
As soon as samples are dropped, their count joins the line, and the title changes when writing stalls or fails. It is the one thing worth reporting before the operator looks at the screen again.
Ready for Live Updates
The notification declares itself to the system as a Live Update — Android's counterpart to the iOS Dynamic Island, a strip inside the status bar itself. On the Android 16 build under test it does not render yet, because that part of the system is not switched on; the app is waiting for it, ready.
The colour tells you
what was just captured.
A wave crosses the background every time something is written — and now in a colour that says where the sample came from. From across the desk you can see not only that data is flowing, but what is being heard right now.
A colour per source
Green is sensors, blue networks, amber GNSS and violet Bluetooth. Sensors run at 50 ms, so green is a continuous swell with the other colours flashing through it — a blue flash is a network scan, a violet one Bluetooth.
The wave keeps off the text
It used to be drawn over the content as well, tinting the title in the header, the messages and the status row. Now it sits at the very bottom: it passes under the header but leaves the type alone.
Content runs under the bars
When the header hides on scroll, the cards continue under the status bar instead of stopping at it and leaving an empty strip above. The wave shows through under the bars too.
Start no longer overwrites
work in progress.
Start resumes the last measurement instead of quietly replacing it with a new one. Beyond that, the phone lets your pocket know when the connection drops or data stops being stored.
Start continues, it does not restart
Until now every Start opened a new measurement and the previous one became unreachable — it stayed in the phone, but only the new one could be exported. Now it continues, and a clean slate comes only from Reset, which deletes the previous measurement.
A pause does not count towards the duration
The duration is the sum of the time actually spent collecting, not the span from the first Start to the last Stop — for a run interrupted overnight that would claim fifteen hours of collection. In the export it is running_ms.
Interruptions are in the data
Every stop and every resume adds its own session record with a timestamp. The data therefore shows when collection ran and when it waited, so a pause is not mistaken for a hole in coverage.
A buzz at a hole in coverage
Losing the connection is a soft thud, regaining it two light taps, a failed write three firm knocks. The phone is in your pocket while you walk, and these are the events the screen cannot tell you about. Every buzz goes into the data as haptic, so a window can be cut around the vibration.
The counter runs live
The count is no longer sampled. At two thousand records per second it used to jump by more than five hundred; now it flows, and only the digits slow enough to read are animated. The figures have fixed slots and sit on the baseline.
A panel instead of a form
Start, Reset and Stop are solid colour fields — an unavailable switch turns translucent but keeps its colour. Export got its own plate with a label on which the size of the pending file grows, and a green wave crosses the background with every written sample.
How much ground
we actually covered.
This version adds distance walked next to the duration, in a way that does not credit metres to a phone lying on a desk. Beyond that, the capacity burst shows its progress and technology selection is driven by presets.
Distance walked, in metres
The status card shows Distance instead of a static source count. The value is stored with the session, so a finished measurement still shows it after an app restart, and in the export it is distance_m.
Metres, not GPS noise
A walker covers about 1.4 m between one-second fixes, while the uncertainty of a single fix is usually larger. Distance is therefore not measured between neighbours but by moving an anchor once it passes the threshold max(3 m, accuracy).
Location accuracy on show
The accuracy of the last fix sits under the metrics. When the position is too coarse to count towards distance, the card says so outright, so a number that will not move has an explanation.
The capacity burst shows its progress
A new record for the start of a burst puts its beginning into the data, not only its result. Meanwhile the UI runs a countdown next to the transport, and a burst interrupted by Stop is not left hanging.
Technology presets
“All” and “Clear all” became a single switch, with Default in front of it. The app recognises hand-tuned sensor values, asks before overwriting them and offers to keep them as the Custom preset.
Legible messages
A dark treatment tinted by message type, dismissible by dragging down. An error stays on screen for 15 seconds, an ordinary notice disappears after four.
Internet mapping
while moving through a building.
Continuous transfer mapping got its own card ahead of Start, a heartbeat began watching collection from the inside, and a code audit cleaned up the bindings to Android callbacks.
A card of its own for mapping
A separate card keeps continuous mapping apart from the one-off speed test. It can measure Wi‑Fi, cellular data or both transports at once over a specific Android Network.
A data estimate up front
The interface shows the upper bound before you start: at most 204 MB per 30 minutes for one transport and 407 MB for both.
A heartbeat over collection
A running check of the collectors, the writer and the write queue. The session then distinguishes an ordinary Stop, a writer failure and an interruption after the process died.
The export admits its gaps
The header carries the last stored timestamp, the trailing gap and the counts of accepted, written and dropped samples.
Audited callbacks
Registrations for GPS, GNSS, NMEA and navigation messages are visible in the export itself. Bluetooth Classic stores the states of the discovery cycle as well as the devices actually found.
Fixes from the code audit
The duration of a finished measurement is computed from stored timestamps, stopping the mapping leaves no NetworkCallback hanging, and sensors deliver data on their own thread.
Maintenance that
stops dropping samples.
No new measurement feature. A version born from a code audit, fixing the reliability of collection, writing and export, and moving the format to V3.
Dropped samples on show
When writing falls behind, the count appears in the app and goes into the header as dropped_samples. Samples used to vanish unannounced; ending a measurement no longer loses the last of them either.
Ranges hold
A setting outside the allowed range is pulled back into it, so a zero interval no longer spins a scan with no pause.
A disabled Bluetooth is recognised
With the adapter off, the sources are not marked as measured and ADAPTER_DISABLED goes into the export instead of a blank.
Collection off the main thread
The GNSS, location, Wi‑Fi RTT and cellular callbacks run aside, so raw GNSS no longer slows the controls. The microphone is released only after the read completes.
Format V3
SIGNAL_COLLECTOR_TXT_V3 adds the dropped_samples header and drops the source_timestamp_ns column, which only duplicated elapsed_realtime_ns.
Schema 2 without losses
The database moves by migration and existing measurements survive. Temporary files created for sharing are cleaned up, so the cache no longer grows by a whole measurement.
Transfer quality,
measured continuously.
Alongside the one-off speed test there is now a per-second stream of samples of real download, upload and RTT — bound to a specific network and enriched with radio context.
A sample every second
The measurement runs from Start to Stop and produces roughly one network_quality_sample per second.
What a sample holds
A 64 KiB download, an 8 KiB upload and three small HTTPS RTT probes. The output carries the real transfer times, short-term throughput, RTT min/avg/max, jitter, errors and timeouts.
Capacity burst
Every 30 seconds a network_capacity_probe is produced with a 1 MiB download and a 128 KiB upload.
Forced transport
The test can be sent over a specific Wi‑Fi or cellular Android Network, even when both are available at once.
Radio and location with the sample
Every sample carries the last Wi‑Fi or cellular radio context and the last known location, including its age.
Quality, not a record
The small samples are labelled as measurements of quality over time, not of maximum internet speed. The server layer supports the CLOUDFLARE, CUSTOM and LOCAL modes.
Controls that
stay where they are.
A small interface release. Actions no longer move with the state of the measurement, the top bar gives room to the content, and a message can be dismissed when it is in the way.
Download and Share stay put
The buttons keep their place. Without a finished measurement they are dimmed and inactive, not hidden.
A vanishing top bar
It hides when you scroll down and comes back when you scroll up.
Recommend from the bar
Prepares a new e‑mail with no recipient filled in, carrying a subject, a message and links to the app.
Dismissible messages
Status notices are a bottom message that can be closed; otherwise they disappear on their own after a longer interval.
The storage note moved down
The note about local data storage now sits at the very bottom, visually subdued.
Active scan
and a measured speed test.
This version introduces an experimental active cellular scan with an exact reason for refusal, and a full speed test bound to the transport actually chosen.
Active scan events
Unambiguous ACTIVE_NETWORK_SCAN_REQUESTED, STARTED, RESULT, COMPLETE and FAILED instead of guessing support from the phone brand.
The exact reason for refusal
A failed scan stores the numeric code, the exception type, the message, the carrier privileges state and the state of the MODIFY_PHONE_STATE permission.
Kept apart from passive cells
The result carries scan_mode=ACTIVE_NETWORK_SCAN and only the operator Android supplied; an unknown one stays UNKNOWN.
A test over the chosen transport
Manually over MOBILE, WIFI or sequentially BOTH, with the traffic genuinely bound to the requested Android Network. The options offered follow the validated networks available.
A complete test summary
speed_test_result carries download and upload in Mb/s, bytes and times, the minimum, mean, median, maximum and p95 RTT, jitter, packet loss, errors and the server — together with the last cell or Wi‑Fi context.
Collection that survives
The measurement continues in the background through a foreground service, preferences survive a restart, and from an estimated 10 MB upwards the export preselects GZIP.
설치
설치 경로는
Google Play뿐입니다.
- 1
Google Play에서 설치하십시오. 초대도, 테스터 명단도, 기다림도 없습니다.
- 2
해마다 최대 1시간까지 아무것도 내지 않고 측정할 수 있습니다.
- 3
1시간으로 모자라면 언제든 앱 안에서 무제한 측정의 잠금을 해제하십시오.
배포 경로는 Google Play뿐입니다. Play가 업데이트 사슬에 서명하며, 어디에서도 APK를 직접 내려받을 수 없습니다. 앱 자체는 저희 계정도, 저희 서버도 필요로 하지 않습니다.
체험, 가격과 지원
한 해에 한 시간,
판단하기에 충분합니다.
현장 계측기는 화면 사진만으로 판단할 수 없습니다. 그래서 Signal Collector는 모든 휴대전화에 해마다 1시간의 측정 시간을 줍니다. 한 구간을 걸어 보고, 고리가 차오르는 것을 지켜보고, 내보내기를 열어 보기에 충분한 시간입니다. 이 1시간은 실행 횟수가 아니라 측정 시간으로 세므로 여러 날 여러 장소에 나누어 쓸 수 있습니다. 다 쓰고 나면 잠금 해제는 국가별 Google Play 가격으로 앱 안에서 한 번만 하는 구매입니다. 구독도 갱신일도 없으며, 같은 계정으로 로그인한 모든 휴대전화로 이어집니다.
피드백은 Google Play 리뷰로 받습니다. 새 리뷰는 하루 안에 확인해 이슈로 옮기고 답을 달며, 수정은 다음 업데이트에 실립니다. 유료 앱에는 광고도 분석도 없고, 측정 안에 서드파티 SDK도 없습니다. 그 대신 가격이 개발 비용을 댑니다.
앱이 실제로 수집하는 것
물리 센서부터
주변 네트워크까지.
소스마다 측정 전에 따로 켜고 끌 수 있으며, 일부 기술은 간격까지 정할 수 있습니다.
이동통신망
서빙 셀과 인접 셀, LTE/NR/3G/2G 파라미터, 등록 변화, 그리고 실험적 능동 스캔.
GNSS와 위치
1 Hz GPS, 위성, GNSS 원시 측정값, 클록, AGC, 항법 메시지, NMEA와 안테나 정보.
Wi-Fi와 RTT
현재 연결, 주변 AP, Wi-Fi 7 MLO, 지원 기능, 그리고 지원하는 액세스 포인트까지의 RTT/FTM 거리.
Bluetooth
고전 방식 탐색과 제조사 데이터·서비스 데이터를 포함한 BLE 광고 페이로드.
센서와 소음
움직임, 자기장, 기압, 조도, 근접, 회전 벡터, 그리고 음성을 저장하지 않는 대략적인 dBFS 수준.
네트워크와 전송
초 단위로 재는 실제 다운로드와 업로드, RTT, 지터, 시간 초과, 30초 용량 버스트, 그리고 특정 Wi-Fi와 이동통신망에 동시에 바인딩.
SIM과 eSIM
슬롯, 사업자, MCC/MNC, 로밍, 그리고 어느 카드가 데이터를 쓰는지 기록합니다. 셀만으로는 송신기를 알 수 있을 뿐, 누가 보고 있었는지는 알 수 없습니다. ICCID도 EID도 기록하지 않습니다. 휴대전화를 바꿔도 남는 영구 가입 번호이기 때문입니다.
외부 센서
휴대전화 안에
없는 센서.
휴대전화는 닿을 수 있는 것을 잽니다. 벽에 붙은 프로브, 케이블에 매달린 계측기, 지붕 위의 수신기는 다른 길로 들어와야 합니다. 길은 넷이고, 첫 번째는 이미 동작합니다.
스스로 알리는 센서 · 지금 동작
BTHome, Ruuvi, ATC와 pvvx, Eddystone 텔레메트리. 페어링할 것도 연결할 것도 없습니다. 센서가 측정값을 공중에 외치면 이미 돌고 있는 스캔이 그것을 듣습니다. 온도, 습도, 기압, CO₂, 미세먼지, 전압이 이름과 SI 단위를 달고 다른 모든 것과 같은 파일에 들어갑니다.
Bluetooth LE 프로파일 · 예정
Environmental Sensing은 자신의 측정값을 스스로 설명하므로, 아무도 들어 본 적 없는 계측기도 단위와 함께 읽을 수 있습니다. 그 옆에는 배터리, 체온계, 위치 같은 표준 프로파일과, 직접 만든 프로브가 말하는 방식인 Nordic UART 서비스가 있습니다.
케이블로 잇는 직렬 회선 · 예정
CDC-ACM, FTDI, CP210x, PL2303, CH340. 이 다섯 칩 계열이면 USB에 꽂히는 것 가운데 디스크가 아닌 거의 모든 것을 다룹니다. Arduino와 ESP32 보드, u-blox 수신기, 스펙트럼 분석기, SCPI로 답하는 계측기까지.
로컬 네트워크의 기기 · 예정
mDNS로 찾고 HTTP나 순수 TCP 스트림으로 읽습니다. 요청은 Wi-Fi 네트워크에 묶이므로, 모바일 데이터로 빠져나가 한 방 건너에 있는 기계로 가는 길을 잃지 않습니다.
어림짐작은 없습니다. 센서 스스로 무효라고 표시한 값은 숫자로 적는 대신 빼고, 암호화된 페이로드는 지어낸 값으로 풀지 않고 암호화된 채로 기록하며, 앱이 모르는 형식은 원시 바이트 그대로 파일에 남습니다. 키 목록은 데이터 사전에 있습니다.
앱 밖의 조작
앱을 먼저 열지 않아도
되는 키.
현장에서 재려면 한 손은 휴대전화에, 다른 손은 다른 것에 가 있습니다. 그래서 중요한 조작에는 저마다 앱 밖의 자리가 있고, 그 하나하나가 화면과 똑같은 명령을 보냅니다.
측정 패널
여기에 저장된 소스 묶음과 간격으로 측정을 시작하는 위젯입니다. 도는 동안에는 그렇다고 알리고 측정의 수치를 담으며, 한 번 더 누르면 멈출지 묻습니다. 이 키는 자신이 무엇을 시작하는지 따로 복사해 두므로, 나중에 앱에서 사전 설정을 바꿔도 홈 화면이 재는 내용이 조용히 달라지지 않습니다.
지점 표시
직접 정한 이름을 최대 네 개까지 나란히 둡니다. 출입문, 모서리, 창문을 한 번씩 누르면 그대로 지점에 적힙니다. 아무것도 돌고 있지 않으면 이 키가 측정을 시작하면서 지점까지 한 번에 표시합니다.
소스 타일
소스 하나를 큰 숫자 하나로 보여 줍니다. 범위 안의 액세스 포인트, 측위에 쓰는 위성, 소음 크기. 아무것도 돌고 있지 않을 때 누르면 그 소스만으로 측정을 시작합니다.
소스 판독
소스를 최대 여섯 개까지 한 줄씩, 고른 순서 그대로 보여 줍니다. 찾는 목록이 아니라 한눈에 읽는 목록입니다.
빠른 설정의 타일
어느 앱에서든, 잠금 화면 위에서도 시작하고 중지합니다. 앱이 마지막으로 쓴 설정으로 측정합니다. 보안 잠금 화면 위에서는 먼저 잠금을 풀라고 요구합니다. 시작되는 것이 마이크가 딸린 위치 측정이기 때문입니다.
아이콘 아래의 바로가기
앱 아이콘을 길게 누르면 아무것도 돌지 않을 때는 시작이, 무언가 돌고 있을 때는 중지와 지점 표시가 나옵니다. 이때 지점에는 이름이 붙지 않습니다. 이름은 자리가 넉넉한 위젯 키에 있습니다.
알림
측정 중에는 지속 시간과 레코드 수, 걸은 거리를 담고 그 아래에 지점 표시와 중지를 둡니다. 아무것도 돌고 있지 않은 동안에는 알림 창에 시작을 계속 둘 수 있어, 구간을 나누어 재더라도 매번 앱을 찾지 않아도 됩니다.
키는 측정 자체가 5초에 한 번씩 다시 그립니다 — 위젯은 자기를 먹여 살리는 앱보다 새로울 수 없습니다. 그래서 키마다 그 수치를 읽은 시각을 함께 적습니다. 스톱워치만은 예외로 스스로 흘러갑니다. 모두 한곳에서, 설정 메뉴의 홈 화면 키 항목에서 설정하며, 자세한 설명은 도움말에 있습니다.
현장 점검, 2026년 8월 10일
실제 휴대전화에서
나온 데이터.
아래 내용은 모두 Android 16이 도는 Google Pixel 10a에서 쟀습니다. 0.7.2 버전에서 한 번의 측정을 세 구간으로 나누어 87,597개의 레코드를 모았습니다. 지속 시간은 2:49에서 7:21을 거쳐 8:12로 늘었고 측정 번호는 한 번도 바뀌지 않았으며, 구간 사이의 20분이 넘는 멈춤은 지속 시간에 세지 않았습니다. 거리 수치는 같은 휴대전화에서 0.7.1 버전을 9분 동안 돌린 결과이며, 거리 필터는 그 뒤로 바뀌지 않았습니다.
처음 274개의 측위는 정확도가 9 m에서 114 m 사이였습니다. 이웃한 측위 사이의 거리를 모두 더하면 429 m가 되고, 거친 측위를 걸러 내면 28 m가 됩니다. 기준점을 임계값 너머로 옮기자 0이 나왔습니다. 시험한 휴대전화에는 SIM이 없어 매핑의 이동통신 쪽은 망을 쓸 수 없다고 올바르게 보고했습니다.
버전과 자료
설치와 변경 내역,
그리고 소스 코드.
저장소는 비공개입니다. 로그인한 협력자는 그 안에서 소스 코드와 태그가 붙은 릴리스, APK 체크섬을 찾을 수 있습니다.
개인정보
측정 데이터는 휴대전화를 떠나지 않습니다.
앱은 오프라인으로 동작하며 분석, 광고, 어트리뷰션, 오류 보고 SDK를 하나도 담고 있지 않습니다 — 앞으로도 넣지 않습니다. 앱을 이루는 모든 라이브러리는 개인정보 처리방침에 이름이 적혀 있으며, 각각 정확한 버전으로 고정되어 있으므로 그 사실을 알리는 릴리스 없이는 안에 있는 무엇도 바뀌지 않습니다. 선택 사항인 전송 품질 연속 매핑은 작은 시험용 HTTPS 전송과 주기적인 버스트에 공개 Cloudflare Speedtest 엔드포인트를 씁니다. 이는 인터넷 최대 속도 측정이 아닙니다. 이 모듈은 기본적으로 꺼져 있습니다. 잠금 해제를 구매하면 구매 보고 하나가 휴대전화를 떠나지만 측정 데이터는 담기지 않습니다. 자세한 내용은 개인정보 처리방침에 적혀 있습니다. 내보낸 파일에는 민감한 위치 정보와 주변 네트워크 식별자가 담길 수 있습니다.
동작 방식
센서에서
파일의 한 행까지.
소스마다 자기 속도로 돕니다. 샘플에는 시각과 마지막으로 알려진 위치가 찍히고, 막히지 않는 큐를 지나 로컬 데이터베이스에 묶음으로 저장됩니다. 도표에서 밑줄 친 키의 설명은 데이터 사전에 있습니다.
수집 설정
측정을 시작하기 전에 앱이 소스마다 제공하는 것과 같은 파라미터입니다. 범위와 데이터 추정치는 구현과 일치하며, 값이 바뀌면 위 도표에 곧바로 나타납니다.
범위 10–1000 ms
범위 100–60000 ms
범위 5–300 s
범위 5–60 s
범위 5–300 s
인터넷 매핑연속 측정에 쓸 네트워크
둘 다 고르면 서로 다른 Android Network 핸들 두 개가 동시에 돕니다.
범위 500–5000 ms
범위 1–1024 KiB
범위 1–256 KiB
범위 10–300 s
범위 64–10240 KiB
범위 8–2048 KiB
이 추정치는 상한입니다. 느린 회선에서는 샘플 하나에 시간이 더 걸려 같은 시간에 들어가는 샘플이 줄고 전송량도 적어집니다. 이것은 최대 속도 측정이 아닙니다 — 이유.