No. In an empirical comparison of written privacy policies against runtime log output across 1,000 Android apps, only 0.4%1 kept the two consistent, and 67.6%1 emitted sensitive data their policies never mention, according to the arXiv study. The practical consequence: privacy compliance stops being a document-review task for counsel and becomes a runtime-verification task for engineering, enforced at the log pipeline before release.
What did the study actually measure?
The study directly diffed what apps say they collect against what their code writes to logs at runtime. The paper, posted by Zhiyuan Chen in the cs.CR and cs.SE categories, analyzed 1,000 Android apps across multiple categories and generated 86,836,964 log entries1, then compared the disclosure statements in each app’s privacy policy against the data actually appearing in those logs. The first version was posted 2026-04-20; the third revision landed 2026-08-19, two days before this writing, and the arXiv page carries a related DOI (10.1145/3816483.3816485)1 pointing at a published ACM version.
The methodology matters more than the headline. Policy-versus-behavior checks built on network traffic or tracker presence catch what leaves the device. This study looks at a different surface entirely: the log statements the app itself emits, which the development team owns end-to-end. Logcat output, debug logs, and crash-report payloads are first-party disclosures, written by first-party code, and they are almost never reviewed by anyone who has read the privacy policy.
That is the shift the paper quantifies. If your policy says one thing and your Log.d() calls say another, the mismatch is not a drafting problem. It is a runtime fact about your software, and it can be measured mechanically, which is exactly what regulators and plaintiff-side experts are increasingly equipped to do.
How big is the policy-to-log mismatch?
The mismatch is near-total: 0.4%1 of apps achieved consistent alignment between declared policy contents and actual logged data, per the study’s abstract. The intermediate numbers explain how the failure accumulates, and the denominators matter.
Of the 1,000 apps analyzed, 88.0%1 provide a privacy policy at all. So the baseline “no policy” failure mode accounts for about one app in eight. But having a policy barely helps: only 28.5%1 of the apps explicitly mention logging practices anywhere in that policy text, according to the same source. The dominant failure is omission. Roughly seven apps in ten log data while their policies stay silent on the practice entirely.
Among the apps that do mention logging, the study reports that most clearly describe what is logged. This undercuts the convenient “policies are dishonest” framing. The typical policy is not lying about logging; it simply never gets around to the subject. The failure mode is structural, not rhetorical: policies are drafted from templates before the logging code exists, and nothing in the release process ever reconciles the two.
Then comes the number with legal weight. 67.6%1 of the analyzed apps leaked sensitive information in their logs that their policies never mention. Two-thirds of apps are emitting data categories their own disclosure documents do not cover. Stack the filters together, policy exists, policy mentions logging, log statements accurate, no undisclosed sensitive data, and 0.4%1 of apps pass. That figure should end any argument that template-drafted policies can track what logging code actually emits.
Why do logs count as regulated data processing?
Because the regulation’s scope is defined by the processing of personal data, and logging is processing in any ordinary reading of that word. The official text is an act “on the protection of natural persons with regard to the processing of personal data and on the free movement of such data”; the obligations run from the data to whoever handles it. The transparency machinery sits in Chapter 3 of the regulation, in the section gdpr-info.eu’s legal-text index labels “Transparency and modalities” at the head of the data subject’s rights. A log line that captures an email address or a location fix is a record about a person, produced by your code, the moment the string hits the log buffer.
The regulation forecloses the obvious counterargument. Recital (1) of the official text grounds the protection of natural persons in relation to the processing of personal data in Article 8(1) of the Charter of Fundamental Rights, and its wording is about the person and the data, not about technique. A team cannot argue that logcat, a ring buffer, or a crash-reporting SDK is somehow outside the regulation because it is a diagnostic channel rather than a database. If the log records personal data, the transparency and purpose-limitation machinery attaches.
The extraterritorial reach closes the other exit. The GDPR applies to organizations based outside the EU if they collect or process personal data of individuals located inside the EU, per Wikipedia’s GDPR entry. A solo developer shipping an app worldwide on Google Play is inside the perimeter. The CCPA’s perimeter works differently: coverage turns on statutory thresholds rather than on who downloads the app, and the California Attorney General’s CCPA page notes the law applies to a defined set of businesses, including data brokers. The threshold numbers live in the statute, not in consumer-facing summaries, so read them there before betting a release on a coverage argument.
The penalty exposure is not theoretical. gdpr.eu’s overview describes penalties reaching into the tens of millions of euros, and the regulation carries a dedicated chapter on remedies, liability, and penalties (gdpr-info.eu). Enforcement on transparency grounds does not require proving harm from the logs; the inaccurate disclosure is itself the violation.
Which legal provisions does each mismatch class breach?
Each failure class the study identifies maps to a specific transparency duty, not a generalized “privacy violation.” Anchoring the mapping to the legal text:
| Mismatch class (from the study) | What it looks like | GDPR hook | CCPA hook |
|---|---|---|---|
| No policy at all (12.0% of apps) | App logs personal data; no disclosure document exists | Articles 12–14: the transparency-and-modalities block (gdpr-info.eu) | Notice at collection (CA AG) |
| Policy silent on logging (majority of the 88.0%) | Policy exists but never mentions logging as a processing activity | Article 5, in the regulation’s principles chapter (gdpr-info.eu) | Right to know: categories and specific pieces of PI collected, sources, purposes (CA AG) |
| Vague logging statements (27.7% of log-related statements) | “We may collect diagnostic information” with no categories named | Article 12, in the same transparency-and-modalities section (gdpr-info.eu) | Notice at collection must state the types collected and their uses (CA AG) |
| Undisclosed sensitive data in logs (67.6% of apps) | Logs carry precise geolocation, credentials, message contents; policy covers none of it | Articles 12–14 (gdpr-info.eu); Article 25, data protection by design (gdpr-info.eu) | The CPRA-added right to limit use and disclosure of sensitive personal information (CA AG) |
Two mappings deserve emphasis. First, the sensitive-data row is where CCPA exposure gets concrete. The CPRA amendments effective 2023-01-01 added the rights to correct inaccurate personal information and to limit the use and disclosure of sensitive personal information (CA AG). The statute’s sensitive-category list is where to check next, because what careless logging captures, session tokens, GPS fixes, message bodies, is the sort of data those duties were written for. An app that logs a session token or a GPS fix for debugging and discloses neither has a notice-at-collection problem.
Second, Article 25 inverts where the obligation lives. Data protection by design and by default is a design-time duty: it binds the architecture, not the disclosure document. “Design time” includes the logging architecture. A policy drafted after the fact by counsel cannot satisfy a by-design obligation; only an engineering control on what gets logged can.
What should engineering teams actually change?
Treat logs as a disclosure surface and gate releases on a policy-to-log diff, the same way you would gate on a license scan. The study’s 0.4%1 alignment figure is evidence that the current process, counsel drafts a policy from a template, engineering never sees it again, is structurally incapable of producing accurate disclosures. The fix has to live where the violation is created: the log pipeline.
Three controls, in descending order of payoff:
1. A log-inventory gate in CI. Build a machine-generated inventory of every log statement in the codebase that carries user-derived data: static analysis on logging calls, flagged by the type of the argument (identifiers, location objects, auth tokens, message bodies), plus runtime capture during instrumented test runs. Diff the resulting category list against the data categories the privacy policy declares. Fail the build on uncovered categories. This converts the study’s manual 86.8-million-entry methodology into a pre-release check, and it makes the policy a testable artifact instead of a PDF nobody diffs against anything.
2. PII redaction at the logger. The cheapest undisclosed disclosure is the one that never gets written. Route logging through a wrapper that redacts or hashes known-PII field patterns before the sink, and make raw logging calls that touch user objects a lint error. This is the data-protection-by-design duty implemented at the one place where it is fully enforceable: the call site. It also shrinks the inventory in step one, which shrinks the policy surface, which shrinks the audit.
3. Regenerate policy language from observed flows. Instead of writing a policy and hoping it matches the code, generate the logging-disclosure section from the CI inventory. If the inventory says the app logs coarse location and crash traces, the policy says exactly that, and the statement updates when the code does. Template policies fail because they describe an app that exists only in the template. Generated policies describe the app that shipped.
The second-order effect of the study is exactly this gap. The policy template industry, and the compliance workflows built around it, assume the disclosure problem is a writing problem. At 0.4%1 alignment, the writing is downstream of a measurement nobody is taking. Teams that build the measurement get the compliance posture as a side effect; teams that rewrite the policy get a more polished description of the wrong thing.
What does the study not show?
First, transmission. The headline “leaked sensitive information in their logs” (arXiv:2604.18552) does not distinguish logcat output that stays on the device from logs shipped to crash reporters, analytics backends, or support tooling. The GDPR/CCPA analysis above holds either way, since recording is processing regardless of destination, but the severity mapping and the remediation priority depend heavily on which case dominates. Until the full paper’s method section is read, the 67.6%1 figure should be quoted as “emitted in logs,” not “exfiltrated.”
Second, the sampling frame. The 1,000 apps1 span “multiple categories” per the abstract, but the fetched evidence states no region mix, rank distribution, or category weighting. Whether the 0.4%1 alignment rate generalizes to the most-downloaded apps, which have compliance teams, versus long-tail sideloaded apps is unknowable from the available text. The direction of the finding is unlikely to flip; the magnitude plausibly moves.
Third, review status. arXiv does not peer-review submissions; contents are wholly the responsibility of the submitter, per arXiv’s own about page. This paper carries a related ACM DOI (10.1145/3816483.3816485)1, which suggests a venue-reviewed version exists, but the PII-detection method’s precision, false positives inflate the leak rate, false negatives deflate it, is not visible in the abstract. Treat 67.6%1 and 0.4%1 as well-evidenced measurements with unreported error bars, not as constants.
The verdict
Run compliance as a runtime check, not a document review. Before each release, diff the policy’s declared data categories against a machine-generated inventory of every log statement carrying user-derived data, and fail CI on uncovered categories. The legal anchors are stable, GDPR’s Articles 5 and 12 through 14 and Article 25, the CCPA’s notice-at-collection and sensitive-PI provisions, and they all attach to what your code records, not to what your counsel intended. The strongest caveat is the one the study itself leaves open: if your logs never leave the device, your exposure is real but smaller, and the abstract cannot tell you which world your app lives in. Your log inventory can. Build that first.
Frequently Asked Questions
Does the 0.4% alignment rate apply to apps that do not ship to the EU or California?
No, the study’s 0.4% figure is a technical measurement of code-to-policy mismatch, not a legal coverage metric. However, GDPR applies extraterritorially to any organization processing data of individuals located in the EU, regardless of where the developer is based. A solo developer shipping globally on Google Play is inside the GDPR perimeter if their app logs data of EU residents, making the mismatch a compliance violation even without a physical EU presence.
How does a CI log-inventory gate differ from standard static analysis for security vulnerabilities?
Standard static analysis flags code patterns that pose security risks, such as buffer overflows or injection points, but does not track data lineage for disclosure purposes. A log-inventory gate specifically traces user-derived data types (like location objects or auth tokens) through logging calls to verify they are declared in the privacy policy. This shifts the focus from preventing attacks to ensuring transparency, requiring the build to fail if a logged data category is missing from the legal disclosure document.
What is the primary limitation of the 67.6% sensitive data leakage figure?
The abstract does not distinguish between on-device logcat output and logs transmitted to third-party crash reporting or analytics endpoints. This distinction is critical for severity mapping because on-device logs present a lower immediate exposure risk than data shipped to external servers. Until the full paper’s methodology is reviewed, the 67.6% figure should be interpreted as data emitted in logs, not necessarily exfiltrated off the device, which affects the urgency of remediation.
Why is regenerating policy text from observed code flows more effective than manual drafting?
Manual drafting relies on templates that describe an idealized version of the app, which often diverges from the actual logging code implemented by engineers. Regenerating policy language from a CI-generated inventory ensures the disclosure document reflects the exact data categories the code emits at runtime. This approach eliminates the structural gap where policies are written before logging code exists, ensuring the legal document updates automatically when the codebase changes.