diff --git a/cmd/go.mod b/cmd/go.mod index 30a85175..50b29af6 100644 --- a/cmd/go.mod +++ b/cmd/go.mod @@ -12,4 +12,5 @@ require ( github.com/chromedp/chromedp v0.5.1 golang.org/x/image v0.0.0-20190802002840-cff245a6509b golang.org/x/sync v0.0.0-20190423024810-112230192c58 + golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e ) diff --git a/cmd/go.sum b/cmd/go.sum index 814ca19f..234e109c 100644 --- a/cmd/go.sum +++ b/cmd/go.sum @@ -45,5 +45,6 @@ golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191008105621-543471e840be h1:QAcqgptGM8IQBC9K/RC4o+O9YmqEm0diQn9QmZw/0mU= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e h1:1xWUkZQQ9Z9UuZgNaIR6OQOE7rUFglXUUBZlO+dGg6I= golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/cmd/gogio/androidbuild.go b/cmd/gogio/androidbuild.go index a42427ca..4209ecf3 100644 --- a/cmd/gogio/androidbuild.go +++ b/cmd/gogio/androidbuild.go @@ -10,12 +10,14 @@ import ( "io/ioutil" "os" "os/exec" + "path" "path/filepath" "runtime" "strconv" "strings" "golang.org/x/sync/errgroup" + "golang.org/x/tools/go/packages" ) type androidTools struct { @@ -64,6 +66,48 @@ func buildAndroid(tmpDir string, bi *buildInfo) error { buildtools: buildtools, androidjar: filepath.Join(platform, "android.jar"), } + + cfg := &packages.Config{ + Mode: packages.NeedName + + packages.NeedFiles + + packages.NeedImports + + packages.NeedDeps, + Env: append( + os.Environ(), + "GOOS=android", + "CGO_ENABLED=1", + ), + } + pkgs, err := packages.Load(cfg, bi.pkg) + if err != nil { + return err + } + var extraJars []string + visitedPkgs := make(map[string]bool) + var visitPkg func(*packages.Package) error + visitPkg = func(p *packages.Package) error { + if len(p.GoFiles) == 0 { + return nil + } + dir := path.Dir(p.GoFiles[0]) + jars, err := filepath.Glob(filepath.Join(dir, "*.jar")) + if err != nil { + return err + } + extraJars = append(extraJars, jars...) + + for _, imp := range p.Imports { + if !visitedPkgs[imp.ID] { + visitPkg(imp) + visitedPkgs[imp.ID] = true + } + } + return nil + } + if err := visitPkg(pkgs[0]); err != nil { + return err + } + if err := compileAndroid(tmpDir, tools, bi); err != nil { return err } @@ -71,7 +115,7 @@ func buildAndroid(tmpDir string, bi *buildInfo) error { case "archive": return archiveAndroid(tmpDir, bi) case "exe": - if err := exeAndroid(tmpDir, tools, bi); err != nil { + if err := exeAndroid(tmpDir, tools, bi, extraJars); err != nil { return err } return signAPK(tmpDir, tools, bi) @@ -207,7 +251,7 @@ func archiveAndroid(tmpDir string, bi *buildInfo) (err error) { return aarw.Close() } -func exeAndroid(tmpDir string, tools *androidTools, bi *buildInfo) (err error) { +func exeAndroid(tmpDir string, tools *androidTools, bi *buildInfo, extraJars []string) (err error) { classes := filepath.Join(tmpDir, "classes") var classFiles []string err = filepath.Walk(classes, func(path string, f os.FileInfo, err error) error { @@ -219,13 +263,7 @@ func exeAndroid(tmpDir string, tools *androidTools, bi *buildInfo) (err error) { } return nil }) - extraJars, err := filepath.Glob(filepath.Join(bi.dir, "*.jar")) - if err == nil { - classFiles = append(classFiles, extraJars...) - } - if err != nil { - return err - } + classFiles = append(classFiles, extraJars...) apkDir := filepath.Join(tmpDir, "apk") if err := os.MkdirAll(apkDir, 0755); err != nil { return err