cmd/gomobile: add arg to set android api level Fixes golang/go#31905 Change-Id: Icee0ece2e78028fa4afd8b273b86e4eed404d99a Reviewed-on: https://go-review.googlesource.com/c/mobile/+/176077 Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com>
diff --git a/cmd/gomobile/bind_androidapp.go b/cmd/gomobile/bind_androidapp.go index 3b01adc..719e376 100644 --- a/cmd/gomobile/bind_androidapp.go +++ b/cmd/gomobile/bind_androidapp.go
@@ -148,7 +148,7 @@ } const manifestFmt = `<manifest xmlns:android="http://schemas.android.com/apk/res/android" package=%q> <uses-sdk android:minSdkVersion="%d"/></manifest>` - fmt.Fprintf(w, manifestFmt, "go."+pkgs[0].Name+".gojni", minAndroidAPI) + fmt.Fprintf(w, manifestFmt, "go."+pkgs[0].Name+".gojni", buildAndroidAPI) w, err = aarwcreate("proguard.txt") if err != nil { @@ -365,7 +365,7 @@ defer sdkDir.Close() fis, err := sdkDir.Readdir(-1) if err != nil { - return "", fmt.Errorf("failed to find android SDK platform (min API level: %d): %v", minAndroidAPI, err) + return "", fmt.Errorf("failed to find android SDK platform (API level: %d): %v", buildAndroidAPI, err) } var apiPath string @@ -376,7 +376,7 @@ continue } n, err := strconv.Atoi(name[len("android-"):]) - if err != nil || n < minAndroidAPI { + if err != nil || n < buildAndroidAPI { continue } p := filepath.Join(sdkDir.Name(), name) @@ -387,8 +387,8 @@ } } if apiVer == 0 { - return "", fmt.Errorf("failed to find android SDK platform (min API level: %d) in %s", - minAndroidAPI, sdkDir.Name()) + return "", fmt.Errorf("failed to find android SDK platform (API level: %d) in %s", + buildAndroidAPI, sdkDir.Name()) } return apiPath, nil }
diff --git a/cmd/gomobile/build.go b/cmd/gomobile/build.go index e19e041..c2f40c1 100644 --- a/cmd/gomobile/build.go +++ b/cmd/gomobile/build.go
@@ -50,6 +50,9 @@ Flag -iosversion sets the minimal version of the iOS SDK to compile against. The default version is 7.0. +Flag -androidapi sets the Android API version to compile against. +The default and minimum is 15. + The -bundleid flag is required for -target ios and sets the bundle ID to use with the app. @@ -230,6 +233,7 @@ buildWork bool // -work buildBundleID string // -bundleid buildIOSVersion string // -iosversion + buildAndroidAPI int // -androidapi ) func addBuildFlags(cmd *command) { @@ -239,6 +243,7 @@ cmd.flag.StringVar(&buildTarget, "target", "android", "") cmd.flag.StringVar(&buildBundleID, "bundleid", "", "") cmd.flag.StringVar(&buildIOSVersion, "iosversion", "7.0", "") + cmd.flag.IntVar(&buildAndroidAPI, "androidapi", minAndroidAPI, "") cmd.flag.BoolVar(&buildA, "a", false, "") cmd.flag.BoolVar(&buildI, "i", false, "")
diff --git a/cmd/gomobile/doc.go b/cmd/gomobile/doc.go index e160b5a..5061f4c 100644 --- a/cmd/gomobile/doc.go +++ b/cmd/gomobile/doc.go
@@ -106,6 +106,9 @@ Flag -iosversion sets the minimal version of the iOS SDK to compile against. The default version is 7.0. +Flag -androidapi sets the Android API version to compile against. +The default and minimum is 15. + The -bundleid flag is required for -target ios and sets the bundle ID to use with the app.
diff --git a/cmd/gomobile/env.go b/cmd/gomobile/env.go index c70b2a1..cb42d1c 100644 --- a/cmd/gomobile/env.go +++ b/cmd/gomobile/env.go
@@ -83,6 +83,9 @@ // Setup the cross-compiler environments. if ndkRoot, err := ndkRoot(); err == nil { androidEnv = make(map[string][]string) + if buildAndroidAPI < minAndroidAPI { + return fmt.Errorf("gomobile requires Android API level >= %d", minAndroidAPI) + } for arch, toolchain := range ndk { clang := toolchain.Path(ndkRoot, "clang") clangpp := toolchain.Path(ndkRoot, "clang++") @@ -283,15 +286,23 @@ type ndkToolchain struct { arch string abi string + minAPI int toolPrefix string clangPrefix string } +func (tc *ndkToolchain) ClangPrefix() string { + if buildAndroidAPI < tc.minAPI { + return fmt.Sprintf("%s%d", tc.clangPrefix, tc.minAPI) + } + return fmt.Sprintf("%s%d", tc.clangPrefix, buildAndroidAPI) +} + func (tc *ndkToolchain) Path(ndkRoot, toolName string) string { var pref string switch toolName { case "clang", "clang++": - pref = tc.clangPrefix + pref = tc.ClangPrefix() default: pref = tc.toolPrefix } @@ -312,27 +323,31 @@ "arm": { arch: "arm", abi: "armeabi-v7a", + minAPI: 16, toolPrefix: "arm-linux-androideabi", - clangPrefix: "armv7a-linux-androideabi16", + clangPrefix: "armv7a-linux-androideabi", }, "arm64": { arch: "arm64", abi: "arm64-v8a", + minAPI: 21, toolPrefix: "aarch64-linux-android", - clangPrefix: "aarch64-linux-android21", + clangPrefix: "aarch64-linux-android", }, "386": { arch: "x86", abi: "x86", + minAPI: 16, toolPrefix: "i686-linux-android", - clangPrefix: "i686-linux-android16", + clangPrefix: "i686-linux-android", }, "amd64": { arch: "x86_64", abi: "x86_64", + minAPI: 21, toolPrefix: "x86_64-linux-android", - clangPrefix: "x86_64-linux-android21", + clangPrefix: "x86_64-linux-android", }, }
diff --git a/cmd/gomobile/init.go b/cmd/gomobile/init.go index ed40230..0ada746 100644 --- a/cmd/gomobile/init.go +++ b/cmd/gomobile/init.go
@@ -182,7 +182,7 @@ cmd := exec.Command(cmake, initOpenAL, "-DCMAKE_TOOLCHAIN_FILE="+initOpenAL+"/XCompile-Android.txt", - "-DHOST="+t.clangPrefix) + "-DHOST="+t.ClangPrefix()) cmd.Dir = buildDir tcPath := filepath.Join(ndkRoot, "toolchains", "llvm", "prebuilt", archNDK(), "bin") if !buildN {