PICO Scan is the Android static-analysis tool for the paper "Navigating the Privacy Compliance Maze: Understanding Risks with Privacy-Configurable Mobile SDKs." It analyzes APKs that embed privacy-configurable SDKs, or PICO SDKs, and reports risky app, SDK, and wrapper behavior around privacy APIs.
- JDK 11. The tool has been tested with OpenJDK 11.
- The bundled Android platform jars under
platforms/. - The Gradle wrapper in this repository.
On macOS, select JDK 11 with:
export JAVA_HOME=$(/usr/libexec/java_home -v 11)
export PATH="$JAVA_HOME/bin:$PATH"config/flowdroid/ FlowDroid callback, taint-wrapper, and source/sink specs
data/privacy-apis/ PICO SDK metadata and privacy API catalog
data/debug/ Saved analysis/debug traces from the paper artifact
docs/ Paper and implementation documentation
platforms/ Android SDK platform jars used by Soot/FlowDroid
samples/apks/ Bundled APKs for reproduction and debugging
scripts/ Batch runner scripts
src/main/java/ PICO Scan code plus vendored FlowDroid/infoflow code
outputs/ Generated logs, source/sink files, and Jimple output
outputs/, build/, .gradle/, and sootOutput/ are generated and ignored.
The bundled files in samples/apks/ and data/debug/ are intentionally kept in
the release artifact.
./gradlew clean build -x test./gradlew run --args="samples/apks/com.motorola.ccc.notification.apk"The CLI runs the full PICO analysis pipeline by default:
- Load the PICO SDK/privacy API metadata from
data/privacy-apis/. - Build and post-process the app call graph with Soot.
- Run the detector sequence:
PrivacyLandscape,APIDisconnection,MisssingConfiguration,UnevenPrivacySupport,PrivacyAPITracking,HardCodeConfiguration, and final API-disconnection post-analysis.
Full analysis can take several minutes per APK. Large or heavily obfuscated APKs can take longer.
Create a text file with one APK path per line, then run:
PICO_TIMEOUT=7200 scripts/run_tool.sh apk_paths.txtPICO_TIMEOUT is in seconds. Batch logs are written to outputs/logs/.
The release includes three APKs from the original artifact:
samples/apks/com.SNG.Pool.Billiard.apk
samples/apks/com.motorola.ccc.notification.apk
samples/apks/yifan.apk
For example:
./gradlew run --args="samples/apks/com.motorola.ccc.notification.apk"Detector findings are logged as JSON objects with a FlawType field. Common
values include:
SDKInAppPrivacyAPILocationSDKConnectionRoughSDKConnectionStrictMissingConfigurationUnevenPrivacySupportAPIDisconnectionPotentialDiffusedDelegationHardCodeConfigurationForDynamicAnalysisHookValueCrossPrivacyAPIOverride
The analysis also logs timing markers such as #STEP# PrivacyLandscape and
#FINISH# Analysis. These markers are useful for confirming that the full
pipeline ran.
data/debug/ preserves saved traces that are useful for understanding and
debugging the artifact:
data/debug/entryPoints.txt
data/debug/reachable_methods.txt
data/debug/applovin_gdpr_dataflow.txt
See docs/implementation.md for the design and code-level guide.