chore: enable R8 optimised resource shrinking and guard it - #183

Open
code418 wants to merge 2 commits into
masterfrom
chore/enable-r8-app-optimization
Open

chore: enable R8 optimised resource shrinking and guard it#183
code418 wants to merge 2 commits into
masterfrom
chore/enable-r8-app-optimization

Conversation

@code418

Copy link
Copy Markdown
Owner

Summary

  • Remove the dead android.enableR8=true flag from gradle.properties (AGP has had it Enforced since 7.0 and warns to delete it).
  • Enable android.r8.optimizedShrinking=true — AGP 8.11's name for R8 optimised resource shrinking (prerequisites integratedResourceShrinking + nonFinalResIds already default true).
  • Assert in app/build.gradle that the release build type stays minifyEnabled + shrinkResources, so the implicit Flutter default can't silently regress.

Why

Android Studio surfaced a prompt to "Enable app optimization with R8". Investigation showed R8 code + resource shrinking is already on — the Flutter Gradle plugin enables it for release by default (minify{Phone,Auto,Wear}ReleaseWithR8 all run; mapping.txt shows R8 8.11.18 with 450k renamed symbols; full mode + integrated resource shrinking both default on). So the real gaps were: an obsolete no-op flag that misleads readers about where the switch lives, the one remaining opt-in the docs call out, and nothing in-repo pinning the behaviour.

The IDE quick-fix for that prompt inserts the AGP 9.3+optimization { enable = true } DSL, which does not exist on our AGP 8.11.1 (Optimization has no enable property until 9.3) and fails at configuration time — this PR uses the correct 8.11 path instead.

Design spec: docs/superpowers/specs/2026-07-24-r8-app-optimization-design.md.

Note: R8 only optimises the Java/Kotlin layer; the Dart code in libapp.so is untouched (--obfuscate is a separate, out-of-scope lever).

Test plan

  • flutter build appbundle --flavor phone --release builds clean (assertion passes, R8 runs)
  • flutter build appbundle --flavor wear --release -t lib/main_wear.dart builds clean
  • flutter build apk --flavor auto --release -t lib/main.dart builds clean
  • Release AAB/APK sizes hold or shrink vs baseline (no regression from optimised shrinking)
  • phone release APK on emulator: launch, login, Nearby map, James strip, claim quiz, History, About all render (no missing shrunk resources)
  • Sanity: a build with -Pshrink=false now fails with the R8-optimised assertion (guard works)

code418and others added 2 commits July 27, 2026 09:43
Investigation finding: R8 code + resource shrinking is already enabled by
Flutter's Gradle plugin default. Spec covers the remaining cleanup and
opt-ins: drop the dead android.enableR8 flag, add android.r8.optimizedShrinking,
and assert release stays R8-optimised so the implicit default can't silently
regress.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Android Studio prompted to "enable app optimization with R8". R8 code +
resource shrinking is already on (Flutter's Gradle plugin enables it for
release by default), so this covers the remaining gaps rather than a first
enablement:
- drop android.enableR8=true — AGP has had it Enforced since 7.0 and warns
to delete it; it misleads readers about where the real switch lives
- add android.r8.optimizedShrinking=true — AGP 8.11's name for R8 optimised
resource shrinking; prerequisites already default on
- assert release stays minifyEnabled + shrinkResources so the implicit
Flutter default can't silently regress via -Pshrink=false or an upstream
change
Verified: phone/wear/auto release builds all shrink (-719K/-670K/-478K B),
-Pshrink=false now fails fast with the assertion, and the phone release APK
renders cleanly on the Pixel 7a emulator (no missing shrunk resources).
The IDE quick-fix inserts the AGP 9.3+ optimization{enable=true} DSL, which
does not exist on our AGP 8.11.1 and fails to configure; this uses the
correct 8.11 path.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@code418
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

chore: enable R8 optimised resource shrinking and guard it - #183

Open
code418 wants to merge 2 commits into
masterfrom
chore/enable-r8-app-optimization
Open

chore: enable R8 optimised resource shrinking and guard it#183
code418 wants to merge 2 commits into
masterfrom
chore/enable-r8-app-optimization

Conversation

@code418

Copy link
Copy Markdown
Owner

Summary

  • Remove the dead android.enableR8=true flag from gradle.properties (AGP has had it Enforced since 7.0 and warns to delete it).
  • Enable android.r8.optimizedShrinking=true — AGP 8.11's name for R8 optimised resource shrinking (prerequisites integratedResourceShrinking + nonFinalResIds already default true).
  • Assert in app/build.gradle that the release build type stays minifyEnabled + shrinkResources, so the implicit Flutter default can't silently regress.

Why

Android Studio surfaced a prompt to "Enable app optimization with R8". Investigation showed R8 code + resource shrinking is already on — the Flutter Gradle plugin enables it for release by default (minify{Phone,Auto,Wear}ReleaseWithR8 all run; mapping.txt shows R8 8.11.18 with 450k renamed symbols; full mode + integrated resource shrinking both default on). So the real gaps were: an obsolete no-op flag that misleads readers about where the switch lives, the one remaining opt-in the docs call out, and nothing in-repo pinning the behaviour.

The IDE quick-fix for that prompt inserts the AGP 9.3+optimization { enable = true } DSL, which does not exist on our AGP 8.11.1 (Optimization has no enable property until 9.3) and fails at configuration time — this PR uses the correct 8.11 path instead.

Design spec: docs/superpowers/specs/2026-07-24-r8-app-optimization-design.md.

Note: R8 only optimises the Java/Kotlin layer; the Dart code in libapp.so is untouched (--obfuscate is a separate, out-of-scope lever).

Test plan

  • flutter build appbundle --flavor phone --release builds clean (assertion passes, R8 runs)
  • flutter build appbundle --flavor wear --release -t lib/main_wear.dart builds clean
  • flutter build apk --flavor auto --release -t lib/main.dart builds clean
  • Release AAB/APK sizes hold or shrink vs baseline (no regression from optimised shrinking)
  • phone release APK on emulator: launch, login, Nearby map, James strip, claim quiz, History, About all render (no missing shrunk resources)
  • Sanity: a build with -Pshrink=false now fails with the R8-optimised assertion (guard works)

code418and others added 2 commits July 27, 2026 09:43
Investigation finding: R8 code + resource shrinking is already enabled by
Flutter's Gradle plugin default. Spec covers the remaining cleanup and
opt-ins: drop the dead android.enableR8 flag, add android.r8.optimizedShrinking,
and assert release stays R8-optimised so the implicit default can't silently
regress.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Android Studio prompted to "enable app optimization with R8". R8 code +
resource shrinking is already on (Flutter's Gradle plugin enables it for
release by default), so this covers the remaining gaps rather than a first
enablement:
- drop android.enableR8=true — AGP has had it Enforced since 7.0 and warns
to delete it; it misleads readers about where the real switch lives
- add android.r8.optimizedShrinking=true — AGP 8.11's name for R8 optimised
resource shrinking; prerequisites already default on
- assert release stays minifyEnabled + shrinkResources so the implicit
Flutter default can't silently regress via -Pshrink=false or an upstream
change
Verified: phone/wear/auto release builds all shrink (-719K/-670K/-478K B),
-Pshrink=false now fails fast with the assertion, and the phone release APK
renders cleanly on the Pixel 7a emulator (no missing shrunk resources).
The IDE quick-fix inserts the AGP 9.3+ optimization{enable=true} DSL, which
does not exist on our AGP 8.11.1 and fails to configure; this uses the
correct 8.11 path.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@code418
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

chore: enable R8 optimised resource shrinking and guard it - #183

Open
code418 wants to merge 2 commits into
masterfrom
chore/enable-r8-app-optimization
Open

chore: enable R8 optimised resource shrinking and guard it#183
code418 wants to merge 2 commits into
masterfrom
chore/enable-r8-app-optimization

Conversation

@code418

Copy link
Copy Markdown
Owner

Summary

  • Remove the dead android.enableR8=true flag from gradle.properties (AGP has had it Enforced since 7.0 and warns to delete it).
  • Enable android.r8.optimizedShrinking=true — AGP 8.11's name for R8 optimised resource shrinking (prerequisites integratedResourceShrinking + nonFinalResIds already default true).
  • Assert in app/build.gradle that the release build type stays minifyEnabled + shrinkResources, so the implicit Flutter default can't silently regress.

Why

Android Studio surfaced a prompt to "Enable app optimization with R8". Investigation showed R8 code + resource shrinking is already on — the Flutter Gradle plugin enables it for release by default (minify{Phone,Auto,Wear}ReleaseWithR8 all run; mapping.txt shows R8 8.11.18 with 450k renamed symbols; full mode + integrated resource shrinking both default on). So the real gaps were: an obsolete no-op flag that misleads readers about where the switch lives, the one remaining opt-in the docs call out, and nothing in-repo pinning the behaviour.

The IDE quick-fix for that prompt inserts the AGP 9.3+optimization { enable = true } DSL, which does not exist on our AGP 8.11.1 (Optimization has no enable property until 9.3) and fails at configuration time — this PR uses the correct 8.11 path instead.

Design spec: docs/superpowers/specs/2026-07-24-r8-app-optimization-design.md.

Note: R8 only optimises the Java/Kotlin layer; the Dart code in libapp.so is untouched (--obfuscate is a separate, out-of-scope lever).

Test plan

  • flutter build appbundle --flavor phone --release builds clean (assertion passes, R8 runs)
  • flutter build appbundle --flavor wear --release -t lib/main_wear.dart builds clean
  • flutter build apk --flavor auto --release -t lib/main.dart builds clean
  • Release AAB/APK sizes hold or shrink vs baseline (no regression from optimised shrinking)
  • phone release APK on emulator: launch, login, Nearby map, James strip, claim quiz, History, About all render (no missing shrunk resources)
  • Sanity: a build with -Pshrink=false now fails with the R8-optimised assertion (guard works)

code418and others added 2 commits July 27, 2026 09:43
Investigation finding: R8 code + resource shrinking is already enabled by
Flutter's Gradle plugin default. Spec covers the remaining cleanup and
opt-ins: drop the dead android.enableR8 flag, add android.r8.optimizedShrinking,
and assert release stays R8-optimised so the implicit default can't silently
regress.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Android Studio prompted to "enable app optimization with R8". R8 code +
resource shrinking is already on (Flutter's Gradle plugin enables it for
release by default), so this covers the remaining gaps rather than a first
enablement:
- drop android.enableR8=true — AGP has had it Enforced since 7.0 and warns
to delete it; it misleads readers about where the real switch lives
- add android.r8.optimizedShrinking=true — AGP 8.11's name for R8 optimised
resource shrinking; prerequisites already default on
- assert release stays minifyEnabled + shrinkResources so the implicit
Flutter default can't silently regress via -Pshrink=false or an upstream
change
Verified: phone/wear/auto release builds all shrink (-719K/-670K/-478K B),
-Pshrink=false now fails fast with the assertion, and the phone release APK
renders cleanly on the Pixel 7a emulator (no missing shrunk resources).
The IDE quick-fix inserts the AGP 9.3+ optimization{enable=true} DSL, which
does not exist on our AGP 8.11.1 and fails to configure; this uses the
correct 8.11 path.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@code418
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

chore: enable R8 optimised resource shrinking and guard it - #183

Open
code418 wants to merge 2 commits into
masterfrom
chore/enable-r8-app-optimization
Open

chore: enable R8 optimised resource shrinking and guard it#183
code418 wants to merge 2 commits into
masterfrom
chore/enable-r8-app-optimization

Conversation

@code418

Copy link
Copy Markdown
Owner

Summary

  • Remove the dead android.enableR8=true flag from gradle.properties (AGP has had it Enforced since 7.0 and warns to delete it).
  • Enable android.r8.optimizedShrinking=true — AGP 8.11's name for R8 optimised resource shrinking (prerequisites integratedResourceShrinking + nonFinalResIds already default true).
  • Assert in app/build.gradle that the release build type stays minifyEnabled + shrinkResources, so the implicit Flutter default can't silently regress.

Why

Android Studio surfaced a prompt to "Enable app optimization with R8". Investigation showed R8 code + resource shrinking is already on — the Flutter Gradle plugin enables it for release by default (minify{Phone,Auto,Wear}ReleaseWithR8 all run; mapping.txt shows R8 8.11.18 with 450k renamed symbols; full mode + integrated resource shrinking both default on). So the real gaps were: an obsolete no-op flag that misleads readers about where the switch lives, the one remaining opt-in the docs call out, and nothing in-repo pinning the behaviour.

The IDE quick-fix for that prompt inserts the AGP 9.3+optimization { enable = true } DSL, which does not exist on our AGP 8.11.1 (Optimization has no enable property until 9.3) and fails at configuration time — this PR uses the correct 8.11 path instead.

Design spec: docs/superpowers/specs/2026-07-24-r8-app-optimization-design.md.

Note: R8 only optimises the Java/Kotlin layer; the Dart code in libapp.so is untouched (--obfuscate is a separate, out-of-scope lever).

Test plan

  • flutter build appbundle --flavor phone --release builds clean (assertion passes, R8 runs)
  • flutter build appbundle --flavor wear --release -t lib/main_wear.dart builds clean
  • flutter build apk --flavor auto --release -t lib/main.dart builds clean
  • Release AAB/APK sizes hold or shrink vs baseline (no regression from optimised shrinking)
  • phone release APK on emulator: launch, login, Nearby map, James strip, claim quiz, History, About all render (no missing shrunk resources)
  • Sanity: a build with -Pshrink=false now fails with the R8-optimised assertion (guard works)

code418and others added 2 commits July 27, 2026 09:43
Investigation finding: R8 code + resource shrinking is already enabled by
Flutter's Gradle plugin default. Spec covers the remaining cleanup and
opt-ins: drop the dead android.enableR8 flag, add android.r8.optimizedShrinking,
and assert release stays R8-optimised so the implicit default can't silently
regress.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Android Studio prompted to "enable app optimization with R8". R8 code +
resource shrinking is already on (Flutter's Gradle plugin enables it for
release by default), so this covers the remaining gaps rather than a first
enablement:
- drop android.enableR8=true — AGP has had it Enforced since 7.0 and warns
to delete it; it misleads readers about where the real switch lives
- add android.r8.optimizedShrinking=true — AGP 8.11's name for R8 optimised
resource shrinking; prerequisites already default on
- assert release stays minifyEnabled + shrinkResources so the implicit
Flutter default can't silently regress via -Pshrink=false or an upstream
change
Verified: phone/wear/auto release builds all shrink (-719K/-670K/-478K B),
-Pshrink=false now fails fast with the assertion, and the phone release APK
renders cleanly on the Pixel 7a emulator (no missing shrunk resources).
The IDE quick-fix inserts the AGP 9.3+ optimization{enable=true} DSL, which
does not exist on our AGP 8.11.1 and fails to configure; this uses the
correct 8.11 path.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@code418
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

chore: enable R8 optimised resource shrinking and guard it - #183

Open
code418 wants to merge 2 commits into
masterfrom
chore/enable-r8-app-optimization
Open

chore: enable R8 optimised resource shrinking and guard it#183
code418 wants to merge 2 commits into
masterfrom
chore/enable-r8-app-optimization

Conversation

@code418

Copy link
Copy Markdown
Owner

Summary

  • Remove the dead android.enableR8=true flag from gradle.properties (AGP has had it Enforced since 7.0 and warns to delete it).
  • Enable android.r8.optimizedShrinking=true — AGP 8.11's name for R8 optimised resource shrinking (prerequisites integratedResourceShrinking + nonFinalResIds already default true).
  • Assert in app/build.gradle that the release build type stays minifyEnabled + shrinkResources, so the implicit Flutter default can't silently regress.

Why

Android Studio surfaced a prompt to "Enable app optimization with R8". Investigation showed R8 code + resource shrinking is already on — the Flutter Gradle plugin enables it for release by default (minify{Phone,Auto,Wear}ReleaseWithR8 all run; mapping.txt shows R8 8.11.18 with 450k renamed symbols; full mode + integrated resource shrinking both default on). So the real gaps were: an obsolete no-op flag that misleads readers about where the switch lives, the one remaining opt-in the docs call out, and nothing in-repo pinning the behaviour.

The IDE quick-fix for that prompt inserts the AGP 9.3+optimization { enable = true } DSL, which does not exist on our AGP 8.11.1 (Optimization has no enable property until 9.3) and fails at configuration time — this PR uses the correct 8.11 path instead.

Design spec: docs/superpowers/specs/2026-07-24-r8-app-optimization-design.md.

Note: R8 only optimises the Java/Kotlin layer; the Dart code in libapp.so is untouched (--obfuscate is a separate, out-of-scope lever).

Test plan

  • flutter build appbundle --flavor phone --release builds clean (assertion passes, R8 runs)
  • flutter build appbundle --flavor wear --release -t lib/main_wear.dart builds clean
  • flutter build apk --flavor auto --release -t lib/main.dart builds clean
  • Release AAB/APK sizes hold or shrink vs baseline (no regression from optimised shrinking)
  • phone release APK on emulator: launch, login, Nearby map, James strip, claim quiz, History, About all render (no missing shrunk resources)
  • Sanity: a build with -Pshrink=false now fails with the R8-optimised assertion (guard works)

code418and others added 2 commits July 27, 2026 09:43
Investigation finding: R8 code + resource shrinking is already enabled by
Flutter's Gradle plugin default. Spec covers the remaining cleanup and
opt-ins: drop the dead android.enableR8 flag, add android.r8.optimizedShrinking,
and assert release stays R8-optimised so the implicit default can't silently
regress.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Android Studio prompted to "enable app optimization with R8". R8 code +
resource shrinking is already on (Flutter's Gradle plugin enables it for
release by default), so this covers the remaining gaps rather than a first
enablement:
- drop android.enableR8=true — AGP has had it Enforced since 7.0 and warns
to delete it; it misleads readers about where the real switch lives
- add android.r8.optimizedShrinking=true — AGP 8.11's name for R8 optimised
resource shrinking; prerequisites already default on
- assert release stays minifyEnabled + shrinkResources so the implicit
Flutter default can't silently regress via -Pshrink=false or an upstream
change
Verified: phone/wear/auto release builds all shrink (-719K/-670K/-478K B),
-Pshrink=false now fails fast with the assertion, and the phone release APK
renders cleanly on the Pixel 7a emulator (no missing shrunk resources).
The IDE quick-fix inserts the AGP 9.3+ optimization{enable=true} DSL, which
does not exist on our AGP 8.11.1 and fails to configure; this uses the
correct 8.11 path.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@code418
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

chore: enable R8 optimised resource shrinking and guard it - #183

Open
code418 wants to merge 2 commits into
masterfrom
chore/enable-r8-app-optimization
Open

chore: enable R8 optimised resource shrinking and guard it#183
code418 wants to merge 2 commits into
masterfrom
chore/enable-r8-app-optimization

Conversation

@code418

Copy link
Copy Markdown
Owner

Summary

  • Remove the dead android.enableR8=true flag from gradle.properties (AGP has had it Enforced since 7.0 and warns to delete it).
  • Enable android.r8.optimizedShrinking=true — AGP 8.11's name for R8 optimised resource shrinking (prerequisites integratedResourceShrinking + nonFinalResIds already default true).
  • Assert in app/build.gradle that the release build type stays minifyEnabled + shrinkResources, so the implicit Flutter default can't silently regress.

Why

Android Studio surfaced a prompt to "Enable app optimization with R8". Investigation showed R8 code + resource shrinking is already on — the Flutter Gradle plugin enables it for release by default (minify{Phone,Auto,Wear}ReleaseWithR8 all run; mapping.txt shows R8 8.11.18 with 450k renamed symbols; full mode + integrated resource shrinking both default on). So the real gaps were: an obsolete no-op flag that misleads readers about where the switch lives, the one remaining opt-in the docs call out, and nothing in-repo pinning the behaviour.

The IDE quick-fix for that prompt inserts the AGP 9.3+optimization { enable = true } DSL, which does not exist on our AGP 8.11.1 (Optimization has no enable property until 9.3) and fails at configuration time — this PR uses the correct 8.11 path instead.

Design spec: docs/superpowers/specs/2026-07-24-r8-app-optimization-design.md.

Note: R8 only optimises the Java/Kotlin layer; the Dart code in libapp.so is untouched (--obfuscate is a separate, out-of-scope lever).

Test plan

  • flutter build appbundle --flavor phone --release builds clean (assertion passes, R8 runs)
  • flutter build appbundle --flavor wear --release -t lib/main_wear.dart builds clean
  • flutter build apk --flavor auto --release -t lib/main.dart builds clean
  • Release AAB/APK sizes hold or shrink vs baseline (no regression from optimised shrinking)
  • phone release APK on emulator: launch, login, Nearby map, James strip, claim quiz, History, About all render (no missing shrunk resources)
  • Sanity: a build with -Pshrink=false now fails with the R8-optimised assertion (guard works)

code418and others added 2 commits July 27, 2026 09:43
Investigation finding: R8 code + resource shrinking is already enabled by
Flutter's Gradle plugin default. Spec covers the remaining cleanup and
opt-ins: drop the dead android.enableR8 flag, add android.r8.optimizedShrinking,
and assert release stays R8-optimised so the implicit default can't silently
regress.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Android Studio prompted to "enable app optimization with R8". R8 code +
resource shrinking is already on (Flutter's Gradle plugin enables it for
release by default), so this covers the remaining gaps rather than a first
enablement:
- drop android.enableR8=true — AGP has had it Enforced since 7.0 and warns
to delete it; it misleads readers about where the real switch lives
- add android.r8.optimizedShrinking=true — AGP 8.11's name for R8 optimised
resource shrinking; prerequisites already default on
- assert release stays minifyEnabled + shrinkResources so the implicit
Flutter default can't silently regress via -Pshrink=false or an upstream
change
Verified: phone/wear/auto release builds all shrink (-719K/-670K/-478K B),
-Pshrink=false now fails fast with the assertion, and the phone release APK
renders cleanly on the Pixel 7a emulator (no missing shrunk resources).
The IDE quick-fix inserts the AGP 9.3+ optimization{enable=true} DSL, which
does not exist on our AGP 8.11.1 and fails to configure; this uses the
correct 8.11 path.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@code418
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

chore: enable R8 optimised resource shrinking and guard it - #183

Open
code418 wants to merge 2 commits into
masterfrom
chore/enable-r8-app-optimization
Open

chore: enable R8 optimised resource shrinking and guard it#183
code418 wants to merge 2 commits into
masterfrom
chore/enable-r8-app-optimization

Conversation

@code418

Copy link
Copy Markdown
Owner

Summary

  • Remove the dead android.enableR8=true flag from gradle.properties (AGP has had it Enforced since 7.0 and warns to delete it).
  • Enable android.r8.optimizedShrinking=true — AGP 8.11's name for R8 optimised resource shrinking (prerequisites integratedResourceShrinking + nonFinalResIds already default true).
  • Assert in app/build.gradle that the release build type stays minifyEnabled + shrinkResources, so the implicit Flutter default can't silently regress.

Why

Android Studio surfaced a prompt to "Enable app optimization with R8". Investigation showed R8 code + resource shrinking is already on — the Flutter Gradle plugin enables it for release by default (minify{Phone,Auto,Wear}ReleaseWithR8 all run; mapping.txt shows R8 8.11.18 with 450k renamed symbols; full mode + integrated resource shrinking both default on). So the real gaps were: an obsolete no-op flag that misleads readers about where the switch lives, the one remaining opt-in the docs call out, and nothing in-repo pinning the behaviour.

The IDE quick-fix for that prompt inserts the AGP 9.3+optimization { enable = true } DSL, which does not exist on our AGP 8.11.1 (Optimization has no enable property until 9.3) and fails at configuration time — this PR uses the correct 8.11 path instead.

Design spec: docs/superpowers/specs/2026-07-24-r8-app-optimization-design.md.

Note: R8 only optimises the Java/Kotlin layer; the Dart code in libapp.so is untouched (--obfuscate is a separate, out-of-scope lever).

Test plan

  • flutter build appbundle --flavor phone --release builds clean (assertion passes, R8 runs)
  • flutter build appbundle --flavor wear --release -t lib/main_wear.dart builds clean
  • flutter build apk --flavor auto --release -t lib/main.dart builds clean
  • Release AAB/APK sizes hold or shrink vs baseline (no regression from optimised shrinking)
  • phone release APK on emulator: launch, login, Nearby map, James strip, claim quiz, History, About all render (no missing shrunk resources)
  • Sanity: a build with -Pshrink=false now fails with the R8-optimised assertion (guard works)

code418and others added 2 commits July 27, 2026 09:43
Investigation finding: R8 code + resource shrinking is already enabled by
Flutter's Gradle plugin default. Spec covers the remaining cleanup and
opt-ins: drop the dead android.enableR8 flag, add android.r8.optimizedShrinking,
and assert release stays R8-optimised so the implicit default can't silently
regress.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Android Studio prompted to "enable app optimization with R8". R8 code +
resource shrinking is already on (Flutter's Gradle plugin enables it for
release by default), so this covers the remaining gaps rather than a first
enablement:
- drop android.enableR8=true — AGP has had it Enforced since 7.0 and warns
to delete it; it misleads readers about where the real switch lives
- add android.r8.optimizedShrinking=true — AGP 8.11's name for R8 optimised
resource shrinking; prerequisites already default on
- assert release stays minifyEnabled + shrinkResources so the implicit
Flutter default can't silently regress via -Pshrink=false or an upstream
change
Verified: phone/wear/auto release builds all shrink (-719K/-670K/-478K B),
-Pshrink=false now fails fast with the assertion, and the phone release APK
renders cleanly on the Pixel 7a emulator (no missing shrunk resources).
The IDE quick-fix inserts the AGP 9.3+ optimization{enable=true} DSL, which
does not exist on our AGP 8.11.1 and fails to configure; this uses the
correct 8.11 path.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@code418
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

chore: enable R8 optimised resource shrinking and guard it - #183

Open
code418 wants to merge 2 commits into
masterfrom
chore/enable-r8-app-optimization
Open

chore: enable R8 optimised resource shrinking and guard it#183
code418 wants to merge 2 commits into
masterfrom
chore/enable-r8-app-optimization

Conversation

@code418

Copy link
Copy Markdown
Owner

Summary

  • Remove the dead android.enableR8=true flag from gradle.properties (AGP has had it Enforced since 7.0 and warns to delete it).
  • Enable android.r8.optimizedShrinking=true — AGP 8.11's name for R8 optimised resource shrinking (prerequisites integratedResourceShrinking + nonFinalResIds already default true).
  • Assert in app/build.gradle that the release build type stays minifyEnabled + shrinkResources, so the implicit Flutter default can't silently regress.

Why

Android Studio surfaced a prompt to "Enable app optimization with R8". Investigation showed R8 code + resource shrinking is already on — the Flutter Gradle plugin enables it for release by default (minify{Phone,Auto,Wear}ReleaseWithR8 all run; mapping.txt shows R8 8.11.18 with 450k renamed symbols; full mode + integrated resource shrinking both default on). So the real gaps were: an obsolete no-op flag that misleads readers about where the switch lives, the one remaining opt-in the docs call out, and nothing in-repo pinning the behaviour.

The IDE quick-fix for that prompt inserts the AGP 9.3+optimization { enable = true } DSL, which does not exist on our AGP 8.11.1 (Optimization has no enable property until 9.3) and fails at configuration time — this PR uses the correct 8.11 path instead.

Design spec: docs/superpowers/specs/2026-07-24-r8-app-optimization-design.md.

Note: R8 only optimises the Java/Kotlin layer; the Dart code in libapp.so is untouched (--obfuscate is a separate, out-of-scope lever).

Test plan

  • flutter build appbundle --flavor phone --release builds clean (assertion passes, R8 runs)
  • flutter build appbundle --flavor wear --release -t lib/main_wear.dart builds clean
  • flutter build apk --flavor auto --release -t lib/main.dart builds clean
  • Release AAB/APK sizes hold or shrink vs baseline (no regression from optimised shrinking)
  • phone release APK on emulator: launch, login, Nearby map, James strip, claim quiz, History, About all render (no missing shrunk resources)
  • Sanity: a build with -Pshrink=false now fails with the R8-optimised assertion (guard works)

code418and others added 2 commits July 27, 2026 09:43
Investigation finding: R8 code + resource shrinking is already enabled by
Flutter's Gradle plugin default. Spec covers the remaining cleanup and
opt-ins: drop the dead android.enableR8 flag, add android.r8.optimizedShrinking,
and assert release stays R8-optimised so the implicit default can't silently
regress.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Android Studio prompted to "enable app optimization with R8". R8 code +
resource shrinking is already on (Flutter's Gradle plugin enables it for
release by default), so this covers the remaining gaps rather than a first
enablement:
- drop android.enableR8=true — AGP has had it Enforced since 7.0 and warns
to delete it; it misleads readers about where the real switch lives
- add android.r8.optimizedShrinking=true — AGP 8.11's name for R8 optimised
resource shrinking; prerequisites already default on
- assert release stays minifyEnabled + shrinkResources so the implicit
Flutter default can't silently regress via -Pshrink=false or an upstream
change
Verified: phone/wear/auto release builds all shrink (-719K/-670K/-478K B),
-Pshrink=false now fails fast with the assertion, and the phone release APK
renders cleanly on the Pixel 7a emulator (no missing shrunk resources).
The IDE quick-fix inserts the AGP 9.3+ optimization{enable=true} DSL, which
does not exist on our AGP 8.11.1 and fails to configure; this uses the
correct 8.11 path.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@code418