cmd/gogio: Android: include jar files from dependencies

On Android, in addition to adding jar files found in the source
directory of the program being compiled, cmd/gogio also searches
every dependency for jar files to include in the output APK.

Signed-off-by: Greg Pomerantz <gmp.gio@wow.st>
This commit is contained in:
Greg Pomerantz
2019-11-01 12:39:57 -04:00
committed by Elias Naur
parent 4e71f195ab
commit 3cd633ee44
3 changed files with 49 additions and 9 deletions
+1
View File
@@ -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
)
+1
View File
@@ -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=
+47 -9
View File
@@ -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