mobile/cmd/gomobile: upgrade to ndk-r11c

Update gcc version to 4.9 everywhere. NDK r11 stopped support
for gcc 4.8.

Switch from bin/exe format to zip format.

Drop support for linux/x86, since r11c no longer supports it.

Change the NDK URLs from http://dl.google.com/android/ndk/ to
https://dl.google.com/android/repository/.

Add a flag, -ndkdir, to specify where the downloaded NDK files for
processing are found and downloaded.

Check the status code from the http.Get that fetches the NDK files.

Change-Id: I836de6611bd04f5220e01937a3288a91604b8999
Reviewed-on: https://go-review.googlesource.com/23592
Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com>
diff --git a/cmd/gomobile/bind_test.go b/cmd/gomobile/bind_test.go
index 09a89d1..d0b7736 100644
--- a/cmd/gomobile/bind_test.go
+++ b/cmd/gomobile/bind_test.go
@@ -101,7 +101,7 @@
 
 var bindAndroidTmpl = template.Must(template.New("output").Parse(`GOMOBILE={{.GOPATH}}/pkg/gomobile
 WORK=$WORK
-GOOS=android GOARCH=arm CC=$GOMOBILE/android-ndk-r10e/arm/bin/arm-linux-androideabi-gcc CXX=$GOMOBILE/android-ndk-r10e/arm/bin/arm-linux-androideabi-g++ CGO_ENABLED=1 GOARM=7 go install -p={{.NumCPU}} -pkgdir=$GOMOBILE/pkg_android_arm -tags="" -x golang.org/x/mobile/asset
+GOOS=android GOARCH=arm CC=$GOMOBILE/android-ndk-r11c/arm/bin/arm-linux-androideabi-gcc CXX=$GOMOBILE/android-ndk-r11c/arm/bin/arm-linux-androideabi-g++ CGO_ENABLED=1 GOARM=7 go install -p={{.NumCPU}} -pkgdir=$GOMOBILE/pkg_android_arm -tags="" -x golang.org/x/mobile/asset
 rm -r -f "$WORK/fakegopath"
 mkdir -p $WORK/fakegopath/pkg
 cp $GOMOBILE/pkg_android_arm/golang.org/x/mobile/asset.a $WORK/fakegopath/pkg/android_arm/golang.org/x/mobile/asset.a
diff --git a/cmd/gomobile/env.go b/cmd/gomobile/env.go
index dbfa852..4c65a65 100644
--- a/cmd/gomobile/env.go
+++ b/cmd/gomobile/env.go
@@ -287,7 +287,7 @@
 		arch:       "arm",
 		abi:        "armeabi-v7a",
 		platform:   "android-15",
-		gcc:        "arm-linux-androideabi-4.8",
+		gcc:        "arm-linux-androideabi-4.9",
 		toolPrefix: "arm-linux-androideabi",
 		minGoVer:   go1_5,
 	},
@@ -304,7 +304,7 @@
 		arch:       "x86",
 		abi:        "x86",
 		platform:   "android-15",
-		gcc:        "x86-4.8",
+		gcc:        "x86-4.9",
 		toolPrefix: "i686-linux-android",
 		minGoVer:   go1_6,
 	},
diff --git a/cmd/gomobile/hashes.go b/cmd/gomobile/hashes.go
index 871bf70..0771196 100644
--- a/cmd/gomobile/hashes.go
+++ b/cmd/gomobile/hashes.go
@@ -7,15 +7,13 @@
 // Hashes were computed with 'go run release.go'
 
 var fetchHashes = map[string]string{
-	"android-ndk-r10e-darwin-x86_64.bin":      "728c309e606f63101f1258c9d3d579b80ac74fe74c511ebb71f460ce5c5d084e",
-	"gomobile-ndk-r10e-darwin-x86_64.tar.gz":  "e8bff8a56f5688ec849a95a4e85130ce02eff5c2d54e361103777c396db8d308",
-	"android-ndk-r10e-linux-x86.bin":          "92b07d25aaad9b341a7f2b2a62402d508e948bf2dea3ee7b65a6aeb18bca7df5",
-	"gomobile-ndk-r10e-linux-x86.tar.gz":      "4cc1dd2a1bdf4d81618223d6b25a9d5b5673389c5977a7bff85a89a15afd36a2",
-	"android-ndk-r10e-linux-x86_64.bin":       "102d6723f67ff1384330d12c45854315d6452d6510286f4e5891e00a5a8f1d5a",
-	"gomobile-ndk-r10e-linux-x86_64.tar.gz":   "bacfed664a7b69b1b693f246ea49a85f04f502bd1ae723351c5345ab5b2ba850",
-	"android-ndk-r10e-windows-x86.exe":        "5378a60a796de75a2d609b76f5c56df7a343511ec36a823bae8c7423591cc8f5",
-	"gomobile-ndk-r10e-windows-x86.tar.gz":    "4c0d647519a5d254d39a13f8ec85951ca378d8eb8463fdcde5c46490b1f2c382",
-	"android-ndk-r10e-windows-x86_64.exe":     "9bc55ea4b3ad38dcd34157528760e62183b63ebc4a38a6ca478889ff7583d9c1",
-	"gomobile-ndk-r10e-windows-x86_64.tar.gz": "582cc90605c8cc026be0d70ccf58d2ec44373f7e855fbb2faee59c2cf2f7121e",
-	"gomobile-openal-soft-1.16.0.1.tar.gz":    "ff7ff835355a1158001e6b6cc03d3a65abb508abc34a5f19ae9af0bdeadd978b",
+	"android-ndk-r11c-darwin-x86_64.zip":      "fe2f8986074717240df45f03e93a4436dac2040dc12fecee4853953d584424b3",
+	"gomobile-ndk-r11c-darwin-x86_64.tar.gz":  "1d563c5c27dcb3643eb3cbd4e44b535aec052c600350d6203374e0100b1d75ff",
+	"android-ndk-r11c-linux-x86_64.zip":       "ba85dbe4d370e4de567222f73a3e034d85fc3011b3cbd90697f3e8dcace3ad94",
+	"gomobile-ndk-r11c-linux-x86_64.tar.gz":   "eb0a657e03dad70dce33281414d2fdf38f2b313a8a1a4323d0648e9d16198d74",
+	"android-ndk-r11c-windows-x86.zip":        "eea7d148cf046baad2b8f3fd8e4a27d3695964079db0da6b9fca08051bb4dccb",
+	"gomobile-ndk-r11c-windows-x86.tar.gz":    "7f6b53f55993aa0deccace0ab2829ebb0e93d6bf2196a964f63bfde46da95d9e",
+	"android-ndk-r11c-windows-x86_64.zip":     "55c69f1d5a3602b3f6d6cea280b16938f17d6a4b509af01641d4db1280088d90",
+	"gomobile-ndk-r11c-windows-x86_64.tar.gz": "b3e1e17ec6d19b7512e6b5277fccc3a61e4c4b6bab6c4a3874d856c0332a61db",
+	"gomobile-openal-soft-1.16.0.1.tar.gz":    "84c9361734902df622dd49a8c0cfb0090fd7743a2cbf927a9ae85c4826beb173",
 }
diff --git a/cmd/gomobile/init.go b/cmd/gomobile/init.go
index d976dd5..ef52e19 100644
--- a/cmd/gomobile/init.go
+++ b/cmd/gomobile/init.go
@@ -30,7 +30,7 @@
 // There is a significant size different (400MB compared to 30MB).
 var useStrippedNDK = true
 
-const ndkVersion = "ndk-r10e"
+const ndkVersion = "ndk-r11c"
 const openALVersion = "openal-soft-1.16.0.1"
 
 var (
diff --git a/cmd/gomobile/init_test.go b/cmd/gomobile/init_test.go
index 6fe8f5d..c6678b8 100644
--- a/cmd/gomobile/init_test.go
+++ b/cmd/gomobile/init_test.go
@@ -115,9 +115,9 @@
 tar xfz $GOMOBILE/dl/gomobile-{{.NDK}}-{{.GOOS}}-{{.NDKARCH}}.tar.gz
 mkdir -p $GOMOBILE/android-{{.NDK}}/arm/sysroot
 mv $WORK/android-{{.NDK}}/platforms/android-15/arch-arm/usr $GOMOBILE/android-{{.NDK}}/arm/sysroot/usr
-mv $WORK/android-{{.NDK}}/toolchains/arm-linux-androideabi-4.8/prebuilt/{{.GOOS}}-{{.NDKARCH}}/bin $GOMOBILE/android-{{.NDK}}/arm/bin
-mv $WORK/android-{{.NDK}}/toolchains/arm-linux-androideabi-4.8/prebuilt/{{.GOOS}}-{{.NDKARCH}}/lib $GOMOBILE/android-{{.NDK}}/arm/lib
-mv $WORK/android-{{.NDK}}/toolchains/arm-linux-androideabi-4.8/prebuilt/{{.GOOS}}-{{.NDKARCH}}/libexec $GOMOBILE/android-{{.NDK}}/arm/libexec
+mv $WORK/android-{{.NDK}}/toolchains/arm-linux-androideabi-4.9/prebuilt/{{.GOOS}}-{{.NDKARCH}}/bin $GOMOBILE/android-{{.NDK}}/arm/bin
+mv $WORK/android-{{.NDK}}/toolchains/arm-linux-androideabi-4.9/prebuilt/{{.GOOS}}-{{.NDKARCH}}/lib $GOMOBILE/android-{{.NDK}}/arm/lib
+mv $WORK/android-{{.NDK}}/toolchains/arm-linux-androideabi-4.9/prebuilt/{{.GOOS}}-{{.NDKARCH}}/libexec $GOMOBILE/android-{{.NDK}}/arm/libexec
 mkdir -p $GOMOBILE/android-{{.NDK}}/arm/arm-linux-androideabi/bin
 ln -s $GOMOBILE/android-{{.NDK}}/arm/bin/arm-linux-androideabi-ld{{.EXE}} $GOMOBILE/android-{{.NDK}}/arm/arm-linux-androideabi/bin/ld{{.EXE}}
 ln -s $GOMOBILE/android-{{.NDK}}/arm/bin/arm-linux-androideabi-as{{.EXE}} $GOMOBILE/android-{{.NDK}}/arm/arm-linux-androideabi/bin/as{{.EXE}}
diff --git a/cmd/gomobile/release.go b/cmd/gomobile/release.go
index 9e7f2ab..54288b1 100644
--- a/cmd/gomobile/release.go
+++ b/cmd/gomobile/release.go
@@ -17,6 +17,7 @@
 	"compress/gzip"
 	"crypto/sha256"
 	"encoding/hex"
+	"flag"
 	"fmt"
 	"hash"
 	"io"
@@ -29,7 +30,7 @@
 	"runtime"
 )
 
-const ndkVersion = "ndk-r10e"
+const ndkVersion = "ndk-r11c"
 
 type version struct {
 	os   string
@@ -38,7 +39,6 @@
 
 var hosts = []version{
 	{"darwin", "x86_64"},
-	{"linux", "x86"},
 	{"linux", "x86_64"},
 	{"windows", "x86"},
 	{"windows", "x86_64"},
@@ -52,15 +52,19 @@
 }
 
 var targets = []target{
-	{"arm", "android-15", "arm-linux-androideabi-4.8", "arm-linux-androideabi"},
+	{"arm", "android-15", "arm-linux-androideabi-4.9", "arm-linux-androideabi"},
 	{"arm64", "android-21", "aarch64-linux-android-4.9", "aarch64-linux-android"},
-	{"x86", "android-15", "x86-4.8", "i686-linux-android"},
+	{"x86", "android-15", "x86-4.9", "i686-linux-android"},
 	{"x86_64", "android-21", "x86_64-4.9", "x86_64-linux-android"},
 }
 
-var tmpdir string
+var (
+	ndkdir = flag.String("ndkdir", "", "Directory for the downloaded NDKs for caching")
+	tmpdir string
+)
 
 func main() {
+	flag.Parse()
 	var err error
 	tmpdir, err = ioutil.TempDir("", "gomobile-release-")
 	if err != nil {
@@ -187,15 +191,14 @@
 }
 
 func fetchNDK(host version) (binPath, url string, err error) {
-	ndkName := "android-" + ndkVersion + "-" + host.os + "-" + host.arch + "."
-	if host.os == "windows" {
-		ndkName += "exe"
-	} else {
-		ndkName += "bin"
-	}
+	ndkName := "android-" + ndkVersion + "-" + host.os + "-" + host.arch + ".zip"
 
-	url = "http://dl.google.com/android/ndk/" + ndkName
-	binPath = tmpdir + "/" + ndkName
+	url = "https://dl.google.com/android/repository/" + ndkName
+	binPath = *ndkdir
+	if binPath == "" {
+		binPath = tmpdir
+	}
+	binPath += "/" + ndkName
 
 	if _, err := os.Stat(binPath); err == nil {
 		log.Printf("\t%q: using cached NDK\n", ndkName)
@@ -336,6 +339,9 @@
 	if err != nil {
 		return "", err
 	}
+	if sc := resp.StatusCode; sc != http.StatusOK {
+		return "", fmt.Errorf("invalid HTTP status %d", sc)
+	}
 	hashw := sha256.New()
 	_, err = io.Copy(io.MultiWriter(hashw, f), resp.Body)
 	err2 := resp.Body.Close()
@@ -353,11 +359,8 @@
 }
 
 func inflate(dst, path string) error {
-	p7zip := "7z"
-	if runtime.GOOS == "darwin" {
-		p7zip = "/Applications/Keka.app/Contents/Resources/keka7z"
-	}
-	cmd := exec.Command(p7zip, "x", path)
+	unzip := "unzip"
+	cmd := exec.Command(unzip, path)
 	cmd.Dir = dst
 	out, err := cmd.CombinedOutput()
 	if err != nil {