Skip to content

[TrimmableTypeMap] Fix manifest builder gaps: SupportsGLTexture, UsesPermissionFlags, RoundIcon, dedup - #11044

Merged
jonathanpeppers merged 5 commits into
mainfrom
dev/simonrozsival/scanner-gap-fixes
Apr 1, 2026
Merged

[TrimmableTypeMap] Fix manifest builder gaps: SupportsGLTexture, UsesPermissionFlags, RoundIcon, dedup#11044
jonathanpeppers merged 5 commits into
mainfrom
dev/simonrozsival/scanner-gap-fixes

Conversation

@simonrozsival

@simonrozsivalsimonrozsival commented Mar 30, 2026

Copy link
Copy Markdown
Member

Summary

Fix gaps in the assembly-level manifest builder compared to the old ManifestDocument path.

Changes

Scanner

  • SupportsGLTexture: Add SupportsGLTextureInfo record and SupportsGLTextureAttribute handling in ScanAssemblyAttributes
  • UsesPermissionFlags: Add UsesPermissionFlags property to UsesPermissionInfo, extract in scanner
  • Perf: Guard ParseNameAndProperties with KnownAssemblyAttributes HashSet to skip non-manifest attributes early

Generator

  • SupportsGLTexture: Emit <supports-gl-texture> element in AssemblyLevelElementBuilder
  • UsesPermissionFlags: Emit android:usesPermissionFlags attribute on <uses-permission>
  • RoundIcon: Add android:roundIcon mapping for <permission>, <permission-group>, and <permission-tree> elements
  • BackupAgent/ManageSpaceActivity: Resolve managed type name strings to JNI names via scanned peers and emit android:backupAgent / android:manageSpaceActivity on <application>
  • Dedup: Deduplicate <permission-group> and <permission-tree> against manifest template (matching existing <permission> and <uses-permission> dedup)

Cleanup

  • Remove redundant #nullable enable from AssemblyLevelElementBuilder.cs
  • Dispose JavaPeerScanner in FixtureTestBase after scan completes
  • Remove unused parameters from ToComponentInfo
  • Use HashSet.Add() pattern for all dedup sets to prevent cross-assembly duplicates

Tests

  • Scanner tests: SupportsGLTexture_ConstructorArg, UsesPermission_Flags
  • Generator tests: AssemblyLevel_SupportsGLTexture, AssemblyLevel_UsesPermissionFlags, AssemblyLevel_PermissionRoundIcon

CopilotAI review requested due to automatic review settings March 30, 2026 12:11
@simonrozsivalsimonrozsival added copilot `copilot-cli` or other AIs were used to author this trimmable-type-map labels Mar 30, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Closes feature gaps in the TrimmableTypeMap assembly-level manifest generation path so it matches the legacy ManifestDocument behavior (adds missing attribute scanning/emission and improves template dedup/perf).

Changes:

  • Add scanning + manifest emission for SupportsGLTexture, UsesPermissionFlags, and permission RoundIcon attributes.
  • Add assembly-level attribute filtering (KnownAssemblyAttributes) to reduce scanning overhead.
  • Update unit tests/fixtures to cover new assembly-attribute scanning and manifest generation.

Reviewed changes

Copilot reviewed 24 out of 24 changed files in this pull request and generated 4 comments.

Show a summary per file
FileDescription
tests/Microsoft.Android.Sdk.TrimmableTypeMap.Tests/TestFixtures/StubAttributes.csAdds stub attribute types used by scanning tests (UsesFeature/Permission/Library/MetaData/IntentFilter/SupportsGLTexture).
tests/Microsoft.Android.Sdk.TrimmableTypeMap.Tests/TestFixtures/AssemblyAttributes.csAdds assembly-level attributes for scanner fixture coverage.
tests/Microsoft.Android.Sdk.TrimmableTypeMap.Tests/Scanner/AssemblyAttributeScanningTests.csNew tests for assembly-level attribute scanning (including UsesPermissionFlags + SupportsGLTexture).
tests/Microsoft.Android.Sdk.TrimmableTypeMap.Tests/Generator/ManifestGeneratorTests.csUpdates generator test helper to pass preloaded template; adds tests for new manifest emissions.
tests/Microsoft.Android.Sdk.TrimmableTypeMap.Tests/Generator/FixtureTestBase.csCaches both peers + scanned AssemblyManifestInfo for reuse across tests.
src/Microsoft.Android.Sdk.TrimmableTypeMap/Scanner/UsesPermissionInfo.csAdds UsesPermissionFlags support to uses-permission model.
src/Microsoft.Android.Sdk.TrimmableTypeMap/Scanner/UsesLibraryInfo.csModel for <uses-library>.
src/Microsoft.Android.Sdk.TrimmableTypeMap/Scanner/UsesFeatureInfo.csModel for <uses-feature> including GLESVersion/Required.
src/Microsoft.Android.Sdk.TrimmableTypeMap/Scanner/UsesConfigurationInfo.csModel for <uses-configuration>.
src/Microsoft.Android.Sdk.TrimmableTypeMap/Scanner/SupportsGLTextureInfo.csModel for <supports-gl-texture>.
src/Microsoft.Android.Sdk.TrimmableTypeMap/Scanner/PropertyInfo.csModel for <property>.
src/Microsoft.Android.Sdk.TrimmableTypeMap/Scanner/PermissionTreeInfo.csModel for <permission-tree>.
src/Microsoft.Android.Sdk.TrimmableTypeMap/Scanner/PermissionInfo.csModel for <permission>.
src/Microsoft.Android.Sdk.TrimmableTypeMap/Scanner/PermissionGroupInfo.csModel for <permission-group>.
src/Microsoft.Android.Sdk.TrimmableTypeMap/Scanner/MetaDataInfo.csModel for <meta-data> (record with required Name).
src/Microsoft.Android.Sdk.TrimmableTypeMap/Scanner/JavaPeerScanner.csAdds ScanAssemblyManifestInfo() and wires per-type ComponentAttribute into peers.
src/Microsoft.Android.Sdk.TrimmableTypeMap/Scanner/JavaPeerInfo.csClarifies comment for ComponentAttribute.
src/Microsoft.Android.Sdk.TrimmableTypeMap/Scanner/IntentFilterInfo.csModel for intent filters (actions/categories/properties).
src/Microsoft.Android.Sdk.TrimmableTypeMap/Scanner/ComponentInfo.csPublic component attribute model used for manifest generation.
src/Microsoft.Android.Sdk.TrimmableTypeMap/Scanner/AssemblyManifestInfo.csAggregates assembly-level manifest info lists + application properties.
src/Microsoft.Android.Sdk.TrimmableTypeMap/Scanner/AssemblyIndex.csImplements assembly attribute scanning, known-attribute guard, and intent-filter/meta-data ordering fix.
src/Microsoft.Android.Sdk.TrimmableTypeMap/Generator/ManifestModel.csRemoves legacy manifest model types (replaced by scanner records).
src/Microsoft.Android.Sdk.TrimmableTypeMap/Generator/ManifestGenerator.csChanges Generate() to accept optional preloaded template XDocument and refactors default manifest creation.
src/Microsoft.Android.Sdk.TrimmableTypeMap/Generator/AssemblyLevelElementBuilder.csEmits new attributes/elements (RoundIcon, UsesPermissionFlags, supports-gl-texture) and adds dedup checks.

Comment threadsrc/Microsoft.Android.Sdk.TrimmableTypeMap/Scanner/JavaPeerScanner.cs Outdated
@simonrozsival
simonrozsival changed the base branch from main to dev/simonrozsival/scanner-manifest-attributesMarch 30, 2026 12:16
@simonrozsival
simonrozsival marked this pull request as draft March 30, 2026 16:25
Base automatically changed from dev/simonrozsival/scanner-manifest-attributes to mainMarch 31, 2026 14:50
@simonrozsival
simonrozsivalforce-pushed the dev/simonrozsival/scanner-gap-fixes branch from eadfbb3 to ab21c88CompareMarch 31, 2026 16:01
@simonrozsival
simonrozsival marked this pull request as ready for review March 31, 2026 16:02
simonrozsivaland others added 4 commits April 1, 2026 16:40
- Add SupportsGLTextureAttribute scanning + <supports-gl-texture> emission
- Add UsesPermissionFlags to UsesPermissionInfo + android:usesPermissionFlags emission
- Add RoundIcon mapping for <permission>, <permission-group>, <permission-tree>
- Add TODO comment for deferred BackupAgent/ManageSpaceActivity emission
- Add scanner + generator tests for all three gaps
- Add stub attributes + assembly-level usages in TestFixtures
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add KnownAssemblyAttributes guard to skip non-manifest attributes
- Add dedup for <permission-group> and <permission-tree> against template
- Remove redundant #nullable enable from AssemblyLevelElementBuilder.cs
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Replace the TODO with actual implementation: resolve managed type name
strings from ApplicationProperties to JNI names via the scanned peers
list, and emit android:backupAgent / android:manageSpaceActivity on
the <application> element.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Dispose JavaPeerScanner in FixtureTestBase after scan completes
- Remove unused typeDef/index params from ToComponentInfo
- Use HashSet.Add() pattern for all dedup sets so cross-assembly
duplicates are also prevented (not just template duplicates)
- Fix squashed closing brace in permission-group block
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@simonrozsival
simonrozsivalforce-pushed the dev/simonrozsival/scanner-gap-fixes branch from ab21c88 to 2b54030CompareApril 1, 2026 14:42

@simonrozsivalsimonrozsival left a comment

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 AI Review Summary

Verdict: ⚠️ Needs Changes

Found 1 issue (1 warning):

  • ⚠️Error handling: ApplyTypeProperty silently does nothing when the managed type cannot be resolved to a Java peer (AssemblyLevelElementBuilder.cs:207-212)

👍 Good changes overall:

  • HashSet.Add() pattern for dedup is correct per Postmortem #41
  • KnownAssemblyAttributes HashSet guard is a smart perf optimization to skip non-manifest attributes early
  • SupportsGLTexture and UsesPermissionFlags follow existing patterns well
  • Proper using var scanner in test base
  • Assembly-qualified name stripping handles "TypeName, AssemblyName" format correctly

Review generated by android-reviewer from review guidelines.

Add warning callback to ApplyTypeProperty so users get diagnostic
output when a managed type name cannot be resolved to a Java peer
for android:backupAgent or android:manageSpaceActivity attributes.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@jonathanpeppers
jonathanpeppers merged commit fa20c91 into mainApr 1, 2026
5 of 6 checks passed
@jonathanpeppers
jonathanpeppers deleted the dev/simonrozsival/scanner-gap-fixes branch April 1, 2026 21:45
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 2, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

copilot`copilot-cli` or other AIs were used to author thistrimmable-type-map

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@simonrozsival@jonathanpeppers