mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-05 01:15:35 +00:00
cmd/gogio: add -minversion flag to specify minimum Android platform
Allow the user to specify a minimum supported Android platform version. Signed-off-by: Greg Pomerantz <gmp.gio@wow.st>
This commit is contained in:
committed by
Elias Naur
parent
370ff4bcc9
commit
81814e6fa4
@@ -85,15 +85,15 @@ func compileAndroid(tmpDir string, tools *androidTools, bi *buildInfo) (err erro
|
|||||||
var builds errgroup.Group
|
var builds errgroup.Group
|
||||||
for _, a := range bi.archs {
|
for _, a := range bi.archs {
|
||||||
arch := allArchs[a]
|
arch := allArchs[a]
|
||||||
clang := filepath.Join(tcRoot, "bin", arch.clang)
|
clang, err := latestCompiler(tcRoot, a, bi.minsdk)
|
||||||
if _, err := os.Stat(clang); err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("no NDK compiler found. Please make sure you have NDK >= r19c installed. Use the command `sdkmanager ndk-bundle` to install it. Path %s", clang)
|
return fmt.Errorf("%s. Please make sure you have NDK >= r19c installed. Use the command `sdkmanager ndk-bundle` to install it.", err)
|
||||||
}
|
}
|
||||||
if runtime.GOOS == "windows" {
|
if runtime.GOOS == "windows" {
|
||||||
// Because of https://github.com/android-ndk/ndk/issues/920,
|
// Because of https://github.com/android-ndk/ndk/issues/920,
|
||||||
// we need NDK r19c, not just r19b. Check for the presence of
|
// we need NDK r19c, not just r19b. Check for the presence of
|
||||||
// clang++.cmd which is only available in r19c.
|
// clang++.cmd which is only available in r19c.
|
||||||
clangpp := filepath.Join(tcRoot, "bin", arch.clang+"++.cmd")
|
clangpp := clang + "++.cmd"
|
||||||
if _, err := os.Stat(clangpp); err != nil {
|
if _, err := os.Stat(clangpp); err != nil {
|
||||||
return fmt.Errorf("NDK version r19b detected, but >= r19c is required. Use the command `sdkmanager ndk-bundle` to install it")
|
return fmt.Errorf("NDK version r19b detected, but >= r19c is required. Use the command `sdkmanager ndk-bundle` to install it")
|
||||||
}
|
}
|
||||||
@@ -177,9 +177,9 @@ func archiveAndroid(tmpDir string, bi *buildInfo) (err error) {
|
|||||||
aarw.Create("res/")
|
aarw.Create("res/")
|
||||||
manifest := aarw.Create("AndroidManifest.xml")
|
manifest := aarw.Create("AndroidManifest.xml")
|
||||||
manifest.Write([]byte(fmt.Sprintf(`<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="%s">
|
manifest.Write([]byte(fmt.Sprintf(`<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="%s">
|
||||||
<uses-sdk android:minSdkVersion="16"/>
|
<uses-sdk android:minSdkVersion="%d"/>
|
||||||
<uses-feature android:glEsVersion="0x00030000" android:required="true" />
|
<uses-feature android:glEsVersion="0x00030000" android:required="true" />
|
||||||
</manifest>`, bi.appID)))
|
</manifest>`, bi.appID, bi.minsdk)))
|
||||||
proguard := aarw.Create("proguard.txt")
|
proguard := aarw.Create("proguard.txt")
|
||||||
proguard.Write([]byte(`-keep class org.gioui.** { *; }`))
|
proguard.Write([]byte(`-keep class org.gioui.** { *; }`))
|
||||||
|
|
||||||
@@ -286,13 +286,19 @@ func exeAndroid(tmpDir string, tools *androidTools, bi *buildInfo) (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Link APK.
|
// Link APK.
|
||||||
|
// Currently, new apps must have a target SDK version of at least 28.
|
||||||
|
// https://developer.android.com/distribute/best-practices/develop/target-sdk
|
||||||
|
targetSDK := 28
|
||||||
|
if bi.minsdk > targetSDK {
|
||||||
|
targetSDK = bi.minsdk
|
||||||
|
}
|
||||||
appName := strings.Title(bi.name)
|
appName := strings.Title(bi.name)
|
||||||
manifestSrc := fmt.Sprintf(`<?xml version="1.0" encoding="utf-8"?>
|
manifestSrc := fmt.Sprintf(`<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="%s"
|
package="%s"
|
||||||
android:versionCode="%d"
|
android:versionCode="%d"
|
||||||
android:versionName="1.0.%d">
|
android:versionName="1.0.%d">
|
||||||
<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="28" />
|
<uses-sdk android:minSdkVersion="%d" android:targetSdkVersion="%d" />
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-feature android:glEsVersion="0x00030000"/>
|
<uses-feature android:glEsVersion="0x00030000"/>
|
||||||
<application %s android:label="%s">
|
<application %s android:label="%s">
|
||||||
@@ -307,7 +313,7 @@ func exeAndroid(tmpDir string, tools *androidTools, bi *buildInfo) (err error) {
|
|||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
</application>
|
</application>
|
||||||
</manifest>`, bi.appID, bi.version, bi.version, iconSnip, appName, appName)
|
</manifest>`, bi.appID, bi.version, bi.version, bi.minsdk, targetSDK, iconSnip, appName, appName)
|
||||||
manifest := filepath.Join(tmpDir, "AndroidManifest.xml")
|
manifest := filepath.Join(tmpDir, "AndroidManifest.xml")
|
||||||
if err := ioutil.WriteFile(manifest, []byte(manifestSrc), 0660); err != nil {
|
if err := ioutil.WriteFile(manifest, []byte(manifestSrc), 0660); err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -515,6 +521,44 @@ func latestPlatform(sdk string) (string, error) {
|
|||||||
return bestPlat, nil
|
return bestPlat, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func latestCompiler(tcRoot, a string, minsdk int) (string, error) {
|
||||||
|
arch := allArchs[a]
|
||||||
|
allComps, err := filepath.Glob(filepath.Join(tcRoot, "bin", arch.clangArch+"*-clang"))
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
var bestVer int
|
||||||
|
var firstVer int
|
||||||
|
var bestCompiler string
|
||||||
|
var firstCompiler string
|
||||||
|
for _, compiler := range allComps {
|
||||||
|
var ver int
|
||||||
|
pattern := filepath.Join(tcRoot, "bin", arch.clangArch) + "%d-clang"
|
||||||
|
if n, err := fmt.Sscanf(compiler, pattern, &ver); n < 1 || err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if firstCompiler == "" || ver < firstVer {
|
||||||
|
firstVer = ver
|
||||||
|
firstCompiler = compiler
|
||||||
|
}
|
||||||
|
if ver < bestVer {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if ver > minsdk {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
bestVer = ver
|
||||||
|
bestCompiler = compiler
|
||||||
|
}
|
||||||
|
if bestCompiler == "" {
|
||||||
|
bestCompiler = firstCompiler
|
||||||
|
}
|
||||||
|
if bestCompiler == "" {
|
||||||
|
return "", fmt.Errorf("no NDK compiler found for architecture %s", a)
|
||||||
|
}
|
||||||
|
return bestCompiler, nil
|
||||||
|
}
|
||||||
|
|
||||||
func latestTools(sdk string) (string, error) {
|
func latestTools(sdk string) (string, error) {
|
||||||
allTools, err := filepath.Glob(filepath.Join(sdk, "build-tools", "*"))
|
allTools, err := filepath.Glob(filepath.Join(sdk, "build-tools", "*"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
+18
-15
@@ -24,6 +24,7 @@ import (
|
|||||||
var (
|
var (
|
||||||
target = flag.String("target", "", "specify target (ios, tvos, android, js).\n")
|
target = flag.String("target", "", "specify target (ios, tvos, android, js).\n")
|
||||||
archNames = flag.String("arch", "", "specify architecture(s) to include (arm, arm64, amd64).")
|
archNames = flag.String("arch", "", "specify architecture(s) to include (arm, arm64, amd64).")
|
||||||
|
minsdk = flag.Int("minsdk", 16, "specify minimum supported Android platform sdk version (e.g. 28 for android28 a.k.a. Android 9 Pie).")
|
||||||
buildMode = flag.String("buildmode", "exe", "specify buildmode (archive, exe)")
|
buildMode = flag.String("buildmode", "exe", "specify buildmode (archive, exe)")
|
||||||
destPath = flag.String("o", "", "output file or directory.\nFor -target ios or tvos, use the .app suffix to target simulators.")
|
destPath = flag.String("o", "", "output file or directory.\nFor -target ios or tvos, use the .app suffix to target simulators.")
|
||||||
appID = flag.String("appid", "", "app identifier (for -buildmode=exe)")
|
appID = flag.String("appid", "", "app identifier (for -buildmode=exe)")
|
||||||
@@ -41,6 +42,7 @@ type buildInfo struct {
|
|||||||
version int
|
version int
|
||||||
dir string
|
dir string
|
||||||
archs []string
|
archs []string
|
||||||
|
minsdk int
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -91,6 +93,7 @@ func mainErr() error {
|
|||||||
appID: *appID,
|
appID: *appID,
|
||||||
dir: dir,
|
dir: dir,
|
||||||
version: *version,
|
version: *version,
|
||||||
|
minsdk: *minsdk,
|
||||||
}
|
}
|
||||||
if bi.appID == "" {
|
if bi.appID == "" {
|
||||||
bi.appID = appIDFromPackage(pkgPath)
|
bi.appID = appIDFromPackage(pkgPath)
|
||||||
@@ -211,31 +214,31 @@ func copyFile(dst, src string) (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type arch struct {
|
type arch struct {
|
||||||
iosArch string
|
iosArch string
|
||||||
jniArch string
|
jniArch string
|
||||||
clang string
|
clangArch string
|
||||||
}
|
}
|
||||||
|
|
||||||
var allArchs = map[string]arch{
|
var allArchs = map[string]arch{
|
||||||
"arm": arch{
|
"arm": arch{
|
||||||
iosArch: "armv7",
|
iosArch: "armv7",
|
||||||
jniArch: "armeabi-v7a",
|
jniArch: "armeabi-v7a",
|
||||||
clang: "armv7a-linux-androideabi16-clang",
|
clangArch: "armv7a-linux-androideabi",
|
||||||
},
|
},
|
||||||
"arm64": arch{
|
"arm64": arch{
|
||||||
iosArch: "arm64",
|
iosArch: "arm64",
|
||||||
jniArch: "arm64-v8a",
|
jniArch: "arm64-v8a",
|
||||||
clang: "aarch64-linux-android21-clang",
|
clangArch: "aarch64-linux-android",
|
||||||
},
|
},
|
||||||
"386": arch{
|
"386": arch{
|
||||||
iosArch: "i386",
|
iosArch: "i386",
|
||||||
jniArch: "x86",
|
jniArch: "x86",
|
||||||
clang: "i686-linux-android16-clang",
|
clangArch: "i686-linux-android",
|
||||||
},
|
},
|
||||||
"amd64": arch{
|
"amd64": arch{
|
||||||
iosArch: "x86_64",
|
iosArch: "x86_64",
|
||||||
jniArch: "x86_64",
|
jniArch: "x86_64",
|
||||||
clang: "x86_64-linux-android21-clang",
|
clangArch: "x86_64-linux-android",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user