a96f302dc7
A renamed JNI callback does not fail the build — it produces a release APK that aborts on the first callback of every test. That shipped once, because every on-device check used the debug build, which does not minify. This reads R8's own mapping file for the classes and callback methods, and the DEX string pool for the native entry points. Native methods are deliberately not checked against mapping.txt: R8 only emits entries for members with a body or a rename, so a native method is absent either way and absence would prove nothing. Verified by deleting the callback keep rules and rebuilding: the check reports MainThreadCallback renamed along with onOutput, onError and onComplete, which is exactly the failure that shipped — with no device involved. Also avoids `... | strings | grep -q` and dumps to a file first. Under `set -o pipefail`, grep -q exits at the first match and SIGPIPEs strings, so the pipeline reports failure for a name found early and success for one found late. It reported two of four names missing while all four were present. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>