From 1762d36ddecc152fb10657fb2b69df4fff048dea Mon Sep 17 00:00:00 2001 From: Joe Julian Date: Thu, 16 Apr 2026 21:04:56 -0700 Subject: [PATCH] gogio: deduplicate Android jars --- gogio/androidbuild.go | 9 +++++++- gogio/androidbuild_test.go | 42 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/gogio/androidbuild.go b/gogio/androidbuild.go index 3727a4e..2aacf0b 100644 --- a/gogio/androidbuild.go +++ b/gogio/androidbuild.go @@ -119,6 +119,7 @@ func buildAndroid(tmpDir string, bi *buildInfo) error { } moduleRoot := moduleRootForDir(bi.pkgDir) var extraJars []string + seenJars := make(map[string]bool) visitedPkgs := make(map[string]bool) var visitPkg func(*packages.Package) error visitPkg = func(p *packages.Package) error { @@ -130,7 +131,13 @@ func buildAndroid(tmpDir string, bi *buildInfo) error { if err != nil { return err } - extraJars = append(extraJars, jars...) + for _, jar := range jars { + if seenJars[jar] { + continue + } + seenJars[jar] = true + extraJars = append(extraJars, jar) + } switch { case p.PkgPath == "net": perms = append(perms, "network") diff --git a/gogio/androidbuild_test.go b/gogio/androidbuild_test.go index 4ba1d37..d71c9d0 100644 --- a/gogio/androidbuild_test.go +++ b/gogio/androidbuild_test.go @@ -50,6 +50,48 @@ func TestAndroidExtraJarsIncludesModuleRootAndroidSubdirectory(t *testing.T) { } } +func TestAndroidExtraJarsDoesNotRepeatSharedModuleJarWhenCollectedAcrossPackages(t *testing.T) { + t.Parallel() + + root := t.TempDir() + moduleAndroidJar := filepath.Join(root, "android", "keepassgo-android.jar") + writeTestFile(t, filepath.Join(root, "go.mod"), "module example.invalid/crew\n") + writeTestFile(t, moduleAndroidJar, "module-android") + + dirs := []string{ + filepath.Join(root, "cmd", "keepassgo"), + filepath.Join(root, "internal", "appui"), + } + seen := make(map[string]bool) + var collected []string + for _, dir := range dirs { + if err := os.MkdirAll(dir, 0o755); err != nil { + t.Fatalf("MkdirAll(%q) error = %v", dir, err) + } + jars, err := androidExtraJars(dir, root) + if err != nil { + t.Fatalf("androidExtraJars(%q) error = %v", dir, err) + } + for _, jar := range jars { + if seen[jar] { + continue + } + seen[jar] = true + collected = append(collected, jar) + } + } + + count := 0 + for _, jar := range collected { + if jar == moduleAndroidJar { + count++ + } + } + if count != 1 { + t.Fatalf("collected module jar count = %d, want 1 in %v", count, collected) + } +} + func TestRenderAndroidManifestIncludesOptionalSnippets(t *testing.T) { t.Parallel()