From d53d93eb9eb44d38a8f7757274edda4293085873 Mon Sep 17 00:00:00 2001 From: Grey Vugrin Date: Sat, 4 Mar 2017 10:48:15 -0800 Subject: [PATCH 1/9] Improve documentation of customMapStyle (#1085) * Improve documentation of customMapStyle Readme addition described in https://github.com/airbnb/react-native-maps/issues/881. * Add customMapStyle prop to MapView doc --- README.md | 18 ++++++++++++++++++ docs/mapview.md | 1 + 2 files changed, 19 insertions(+) diff --git a/README.md b/README.md index 8322d0fcf..41139a4a0 100644 --- a/README.md +++ b/README.md @@ -190,6 +190,24 @@ render() { ); } ``` +For iOS, in addition to providing the `mapStyle` you will need to do the following + +```jsx +import MapView, { PROVIDER_GOOGLE } from 'react-native-maps' + +// ... + + +``` + +Then add the AirGoogleMaps directory: + +https://github.com/airbnb/react-native-maps/blob/1e71a21f39e7b88554852951f773c731c94680c9/docs/installation.md#ios + +An unoffical step-by-step guide is also available at https://gist.github.com/heron2014/e60fa003e9b117ce80d56bb1d5bfe9e0 ## Examples diff --git a/docs/mapview.md b/docs/mapview.md index ed8ecb71d..3c6dd08c4 100644 --- a/docs/mapview.md +++ b/docs/mapview.md @@ -9,6 +9,7 @@ | `initialRegion` | `Region` | | The initial region to be displayed by the map. Use this prop instead of `region` only if you don't want to control the viewport of the map besides the initial region.

Changing this prop after the component has mounted will not result in a region change.

This is similar to the `initialValue` prop of a text input. | `liteMode` | `Boolean` | `false` | Enable lite mode. **Note**: Android only. | `mapType` | `String` | `"standard"` | The map type to be displayed.

- standard: standard road map (default)
- satellite: satellite view
- hybrid: satellite view with roads and points of interest overlayed
- terrain: (Android only) topographic view +| `customMapStyle` | `Array` | | Adds custom styling to the map component. See [README](https://github.com/airbnb/react-native-maps#customizing-the-map-style) for more information. | `showsUserLocation` | `Boolean` | `false` | If `true` the app will ask for the user's location. **NOTE**: You need to add `NSLocationWhenInUseUsageDescription` key in Info.plist to enable geolocation, otherwise it is going to *fail silently*! | `followsUserLocation` | `Boolean` | `false` | If `true` the map will focus on the user's location. This only works if `showsUserLocation` is true and the user has shared their location. **Note**: iOS only. | `showsMyLocationButton` | `Boolean` | `true` | `Android only` If `false` hide the button to move map to the current user's location. From cbbea86127350ccbe58e780668ec4c7f56bdd940 Mon Sep 17 00:00:00 2001 From: Christian Mitchell Date: Wed, 8 Mar 2017 11:30:26 +1300 Subject: [PATCH 2/9] Updated Google play services and gradle build plugin (#1023) * Updated Gradle build version * Updated Google Play Services --- android/build.gradle | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index d6e86e557..740017fad 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -18,7 +18,7 @@ buildscript { } } dependencies { - classpath 'com.android.tools.build:gradle:2.1.0' + classpath 'com.android.tools.build:gradle:2.2.3' } } @@ -39,12 +39,12 @@ allprojects { } android { - compileSdkVersion 23 + compileSdkVersion 25 buildToolsVersion "23.0.3" defaultConfig { minSdkVersion 16 - targetSdkVersion 23 + targetSdkVersion 25 } lintOptions { @@ -54,6 +54,6 @@ android { dependencies { compile "com.facebook.react:react-native:+" - compile "com.google.android.gms:play-services-base:9.8.0" - compile "com.google.android.gms:play-services-maps:9.8.0" + compile "com.google.android.gms:play-services-base:10.0.1" + compile "com.google.android.gms:play-services-maps:10.0.1" } From a2dfedfb36c164da9e15862a9f6ba75ee988008b Mon Sep 17 00:00:00 2001 From: allthetime Date: Tue, 7 Mar 2017 15:12:11 -0800 Subject: [PATCH 3/9] specify `react-native link` command (#1086) `react-native link react-native-maps` should be used instead of simply `react-native link` because it may break, or double, manual linkings, especially for libraries that that do not work with `react-native link` (gl-react-native for example) --- docs/installation.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/installation.md b/docs/installation.md index 5a394322f..49f37fd85 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -10,7 +10,7 @@ Second, install the native dependencies: You can use `rnpm` (now part of `react- add native dependencies automatically then continue the directions below depending on your target OS. ``` -react-native link +react-native link react-native-maps ``` >This installation should work in physical devices. For Genymotion, be sure to check Android installation about Google Play Services @@ -63,7 +63,7 @@ After your `Podfile` is setup properly, run `pod install`. ## Android 1. In your `android/app/build.gradle` add: - >This step is not necessary if you ran "react-native link" + >This step is not necessary if you ran "react-native link react-native-maps" ```groovy ... @@ -125,13 +125,13 @@ If you have a blank map issue, ([#118](https://github.com/airbnb/react-native-ma You have to link dependencies with rnpm and re-run the build: -1. `react-native link` +1. `react-native link react-native-maps` 1. `react-native run-ios` ### On Android: 1. Be sure to have `new MapsPackage()` in your `MainApplication.java` : - >This step is not necessary if you ran "react-native link" + >This step is not necessary if you ran "react-native link react-native-maps" ``` import com.airbnb.android.react.maps.MapsPackage; @@ -190,7 +190,7 @@ You have to link dependencies with rnpm and re-run the build: - Extras / Google Repository - Android 6.0 (API 23) / Google APIs Intel x86 Atom System Image Rev. 19 - Android SDK Build-tools 23.0.3 -1. Check manual installation steps if you didn't run "react-native link" +1. Check manual installation steps if you didn't run "react-native link react-native-maps" 1. Go to [Google API Console](https://console.developers.google.com/flows/enableapi?apiid=maps_android_backend) and select your project, or create one. Then, once enabled, select `Go to credentials`. Select `Google Maps Android API` and create a new key. From dfa01ccae99c56fef50b6f2746e4ff7c72d6424d Mon Sep 17 00:00:00 2001 From: Grey Vugrin Date: Tue, 7 Mar 2017 15:12:40 -0800 Subject: [PATCH 4/9] Mention rgba option for polygons in docs (#1084) * Mention rgba option for polygon colors Courtesy of https://github.com/airbnb/react-native-maps/issues/183 * Added rgba mention to circle doc --- docs/circle.md | 4 ++-- docs/polygon.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/circle.md b/docs/circle.md index 706237c18..70a5e078e 100644 --- a/docs/circle.md +++ b/docs/circle.md @@ -7,8 +7,8 @@ | `center` | `LatLng` | (Required) | The coordinate of the center of the circle | `radius` | `Number` | (Required) | The radius of the circle to be drawn (in meters) | `strokeWidth` | `Number` | `1` | The stroke width to use for the path. -| `strokeColor` | `String` | `#000` | The stroke color to use for the path. -| `fillColor` | `String` | | The fill color to use for the path. +| `strokeColor` | `String` | `#000`, `rgba(r,g,b,0.5)` | The stroke color to use for the path. +| `fillColor` | `String` | `#000`, `rgba(r,g,b,0.5)` | The fill color to use for the path. | `zIndex` | `Number` | 0 | The order in which this tile overlay is drawn with respect to other overlays. An overlay with a larger z-index is drawn over overlays with smaller z-indices. The order of overlays with the same z-index is arbitrary. The default zIndex is 0. (Android Only) | `lineCap` | `String` | `round` | The line cap style to apply to the open ends of the path. | `lineJoin` | `Array` | | The line join style to apply to corners of the path. diff --git a/docs/polygon.md b/docs/polygon.md index 875327a81..085b31a18 100644 --- a/docs/polygon.md +++ b/docs/polygon.md @@ -6,8 +6,8 @@ |---|---|---|---| | `coordinates` | `Array` | (Required) | An array of coordinates to describe the polygon | `strokeWidth` | `Number` | `1` | The stroke width to use for the path. -| `strokeColor` | `String` | `#000` | The stroke color to use for the path. -| `fillColor` | `String` | | The fill color to use for the path. +| `strokeColor` | `String` | `#000`, `rgba(r,g,b,0.5)` | The stroke color to use for the path. +| `fillColor` | `String` | `#000`, `rgba(r,g,b,0.5)` | The fill color to use for the path. | `lineCap` | `String` | `round` | The line cap style to apply to the open ends of the path. | `lineJoin` | `Array` | | The line join style to apply to corners of the path. | `miterLimit` | `Number` | | The limiting value that helps avoid spikes at junctions between connected line segments. The miter limit helps you avoid spikes in paths that use the `miter` `lineJoin` style. If the ratio of the miter length—that is, the diagonal length of the miter join—to the line thickness exceeds the miter limit, the joint is converted to a bevel join. The default miter limit is 10, which results in the conversion of miters whose angle at the joint is less than 11 degrees. From 4b712670a72be5dde157202bb141e5379fd005bf Mon Sep 17 00:00:00 2001 From: Evan Siroky Date: Tue, 7 Mar 2017 15:14:38 -0800 Subject: [PATCH 5/9] Add one more tip to Android installation troubleshooting (#1060) * Add one more tip to Android installation troubleshooting Add note about dealing with correcting the system image to use with the emulator. * reword a tip in the troubleshooting section --- docs/installation.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/installation.md b/docs/installation.md index 49f37fd85..aefa6c5b6 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -22,7 +22,7 @@ react-native link react-native-maps 1. Setup your `Podfile` like the included [example/ios/Podfile](../example/ios/Podfile), replace all references to `AirMapExplorer` with your project name, and then run `pod install`. (If you do not need `GoogleMaps` support for iOS, then you can probably completely skip this step.) 1. Open your project in Xcode workspace -1. If you need `GoogleMaps` support also +1. If you need `GoogleMaps` support also - Drag this folder `node_modules/react-native-maps/ios/AirGoogleMaps/` into your project, and choose `Create groups` in the popup window. - In `AppDelegate.m`, add `@import GoogleMaps;` before `@implementation AppDelegate`. In `- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions`, add `[GMSServices provideAPIKey:@"YOUR_GOOGLE_MAP_API_KEY"];` - In your project's `Build Settings` > `Header Search Paths`, double click the value field. In the popup, add `$(SRCROOT)/../node_modules/react-native-maps/ios/AirMaps` and change `non-recursive` to `recursive`. (Dragging the folder `node_modules/react-native-maps/ios/AirMaps/` into your project introduces duplicate symbols. We should not do it.) @@ -72,9 +72,9 @@ After your `Podfile` is setup properly, run `pod install`. compile project(':react-native-maps') } ``` - + If you have a different play services than the one included in this library, use the following instead (switch 10.0.1 for the desired version): - + ```groovy ... dependencies { @@ -212,5 +212,7 @@ Enter the name of the API key and create it. gradlew clean cd .. ``` - + 1. If you are using Android Virtual Devices (AVD), ensure that `Use Host GPU` is checked in the settings for your virtual device. + +1. If using an emulator and the only thing that shows up on the screen is the message: `[APPNAME] won't run without Google Play services which are not supported by your device.`, you need to change the emulator CPU/ABI setting to a system image that includes Google APIs. These may need to be downloaded from the Android SDK Manager first. From 88e9aea7bfbecd72fdc6d3df86a74618d86b661e Mon Sep 17 00:00:00 2001 From: Alvaro Date: Wed, 8 Mar 2017 00:15:15 +0100 Subject: [PATCH 6/9] Improve documentation for fitToCoordinates (#1037) * added notes for fitToCoordinates call * Notes for fitToCoordinates set in correct box --- docs/mapview.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/mapview.md b/docs/mapview.md index 3c6dd08c4..5c80b87f9 100644 --- a/docs/mapview.md +++ b/docs/mapview.md @@ -57,9 +57,9 @@ |---|---|---| | `animateToRegion` | `region: Region`, `duration: Number` | | `animateToCoordinate` | `coordinate: LatLng`, `duration: Number` | -| `fitToElements` | `animated: Boolean` | +| `fitToElements` | `animated: Boolean` | | `fitToSuppliedMarkers` | `markerIDs: String[]`, `animated: Boolean` | If you need to use this in `ComponentDidMount`, make sure you put it in a timeout or it will cause performance problems. -| `fitToCoordinates` | `coordinates: Array, options: { edgePadding: EdgePadding, animated: Boolean }` | +| `fitToCoordinates` | `coordinates: Array, options: { edgePadding: EdgePadding, animated: Boolean }` | If called in `ComponentDidMount` in android, it will cause an exception. It is recommended to call it from the MapView `onLayout` event. From b7f33d0093970c4c6a6ca44a7b2b021713acdc39 Mon Sep 17 00:00:00 2001 From: David DiPanfilo Date: Mon, 13 Mar 2017 11:04:25 -0400 Subject: [PATCH 7/9] Update for dependency issues (#1092) * Update for dependency issues https://github.com/airbnb/react-native-maps/issues/1067 this is a common issue people are experiencing right now * Distinguish dependencies for React versions --- docs/installation.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/installation.md b/docs/installation.md index aefa6c5b6..9783b46a5 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -26,6 +26,8 @@ react-native link react-native-maps - Drag this folder `node_modules/react-native-maps/ios/AirGoogleMaps/` into your project, and choose `Create groups` in the popup window. - In `AppDelegate.m`, add `@import GoogleMaps;` before `@implementation AppDelegate`. In `- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions`, add `[GMSServices provideAPIKey:@"YOUR_GOOGLE_MAP_API_KEY"];` - In your project's `Build Settings` > `Header Search Paths`, double click the value field. In the popup, add `$(SRCROOT)/../node_modules/react-native-maps/ios/AirMaps` and change `non-recursive` to `recursive`. (Dragging the folder `node_modules/react-native-maps/ios/AirMaps/` into your project introduces duplicate symbols. We should not do it.) + +Note: We recommend using a version of React Native >= .40. Newer versions (>= .40) require `package.json` to be set to `"react-native-maps": "^0.13.0"`, while older versions require `"react-native-maps": "^0.12.4"`. ### Option 2: CocoaPods This is now considered the **old way** because it will only work if you **don't** have From bb5acfd533f593077c1d2828432491f2b026bfcd Mon Sep 17 00:00:00 2001 From: Leland Richardson Date: Mon, 20 Mar 2017 14:57:24 -0700 Subject: [PATCH 8/9] Fix null activity crash --- .../android/react/maps/AirMapManager.java | 23 +++-------- .../airbnb/android/react/maps/AirMapView.java | 39 ++++++++++--------- 2 files changed, 26 insertions(+), 36 deletions(-) diff --git a/android/src/main/java/com/airbnb/android/react/maps/AirMapManager.java b/android/src/main/java/com/airbnb/android/react/maps/AirMapManager.java index 75ed5777f..086aead67 100644 --- a/android/src/main/java/com/airbnb/android/react/maps/AirMapManager.java +++ b/android/src/main/java/com/airbnb/android/react/maps/AirMapManager.java @@ -43,8 +43,6 @@ public class AirMapManager extends ViewGroupManager { "none", GoogleMap.MAP_TYPE_NONE ); - private ReactContext reactContext; - private final ReactApplicationContext appContext; protected GoogleMapOptions googleMapOptions; @@ -61,24 +59,15 @@ public String getName() { @Override protected AirMapView createViewInstance(ThemedReactContext context) { - reactContext = context; - - try { - MapsInitializer.initialize(this.appContext); - } catch (RuntimeException e) { - e.printStackTrace(); - emitMapError("Map initialize error", "map_init_error"); - } - - return new AirMapView(context, this.appContext.getCurrentActivity(), this, this.googleMapOptions); + return new AirMapView(context, this, googleMapOptions); } - private void emitMapError(String message, String type) { + private void emitMapError(ThemedReactContext context, String message, String type) { WritableMap error = Arguments.createMap(); error.putString("message", message); error.putString("type", type); - reactContext + context .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) .emit("onError", error); } @@ -297,9 +286,9 @@ public void updateExtraData(AirMapView view, Object extraData) { view.updateExtraData(extraData); } - void pushEvent(View view, String name, WritableMap data) { - reactContext.getJSModule(RCTEventEmitter.class) - .receiveEvent(view.getId(), name, data); + void pushEvent(ThemedReactContext context, View view, String name, WritableMap data) { + context.getJSModule(RCTEventEmitter.class) + .receiveEvent(view.getId(), name, data); } } diff --git a/android/src/main/java/com/airbnb/android/react/maps/AirMapView.java b/android/src/main/java/com/airbnb/android/react/maps/AirMapView.java index 632e568bc..65ba78fd9 100644 --- a/android/src/main/java/com/airbnb/android/react/maps/AirMapView.java +++ b/android/src/main/java/com/airbnb/android/react/maps/AirMapView.java @@ -83,14 +83,15 @@ public class AirMapView extends MapView implements GoogleMap.InfoWindowAdapter, private final ThemedReactContext context; private final EventDispatcher eventDispatcher; - public AirMapView(ThemedReactContext reactContext, Context appContext, AirMapManager manager, + public AirMapView(ThemedReactContext reactContext, AirMapManager manager, GoogleMapOptions googleMapOptions) { - super(appContext, googleMapOptions); + super(reactContext, googleMapOptions); this.manager = manager; this.context = reactContext; super.onCreate(null); + // TODO(lmr): what about onStart???? super.onResume(); super.getMapAsync(this); @@ -141,7 +142,7 @@ public void onMapReady(final GoogleMap map) { this.map.setInfoWindowAdapter(this); this.map.setOnMarkerDragListener(this); - manager.pushEvent(this, "onMapReady", new WritableNativeMap()); + manager.pushEvent(context, this, "onMapReady", new WritableNativeMap()); final AirMapView view = this; @@ -154,12 +155,12 @@ public boolean onMarkerClick(Marker marker) { event = makeClickEventData(marker.getPosition()); event.putString("action", "marker-press"); event.putString("id", airMapMarker.getIdentifier()); - manager.pushEvent(view, "onMarkerPress", event); + manager.pushEvent(context, view, "onMarkerPress", event); event = makeClickEventData(marker.getPosition()); event.putString("action", "marker-press"); event.putString("id", airMapMarker.getIdentifier()); - manager.pushEvent(markerMap.get(marker), "onPress", event); + manager.pushEvent(context, markerMap.get(marker), "onPress", event); // Return false to open the callout info window and center on the marker // https://developers.google.com/android/reference/com/google/android/gms/maps/GoogleMap.OnMarkerClickListener @@ -177,7 +178,7 @@ public boolean onMarkerClick(Marker marker) { public void onPolygonClick(Polygon polygon) { WritableMap event = makeClickEventData(polygon.getPoints().get(0)); event.putString("action", "polygon-press"); - manager.pushEvent(polygonMap.get(polygon), "onPress", event); + manager.pushEvent(context, polygonMap.get(polygon), "onPress", event); } }); @@ -186,7 +187,7 @@ public void onPolygonClick(Polygon polygon) { public void onPolylineClick(Polyline polyline) { WritableMap event = makeClickEventData(polyline.getPoints().get(0)); event.putString("action", "polyline-press"); - manager.pushEvent(polylineMap.get(polyline), "onPress", event); + manager.pushEvent(context, polylineMap.get(polyline), "onPress", event); } }); @@ -197,17 +198,17 @@ public void onInfoWindowClick(Marker marker) { event = makeClickEventData(marker.getPosition()); event.putString("action", "callout-press"); - manager.pushEvent(view, "onCalloutPress", event); + manager.pushEvent(context, view, "onCalloutPress", event); event = makeClickEventData(marker.getPosition()); event.putString("action", "callout-press"); AirMapMarker markerView = markerMap.get(marker); - manager.pushEvent(markerView, "onCalloutPress", event); + manager.pushEvent(context, markerView, "onCalloutPress", event); event = makeClickEventData(marker.getPosition()); event.putString("action", "callout-press"); AirMapCallout infoWindow = markerView.getCalloutView(); - if (infoWindow != null) manager.pushEvent(infoWindow, "onPress", event); + if (infoWindow != null) manager.pushEvent(context, infoWindow, "onPress", event); } }); @@ -216,7 +217,7 @@ public void onInfoWindowClick(Marker marker) { public void onMapClick(LatLng point) { WritableMap event = makeClickEventData(point); event.putString("action", "press"); - manager.pushEvent(view, "onPress", event); + manager.pushEvent(context, view, "onPress", event); } }); @@ -225,7 +226,7 @@ public void onMapClick(LatLng point) { public void onMapLongClick(LatLng point) { WritableMap event = makeClickEventData(point); event.putString("action", "long-press"); - manager.pushEvent(view, "onLongPress", makeClickEventData(point)); + manager.pushEvent(context, view, "onLongPress", makeClickEventData(point)); } }); @@ -661,31 +662,31 @@ public void run() { @Override public void onMarkerDragStart(Marker marker) { WritableMap event = makeClickEventData(marker.getPosition()); - manager.pushEvent(this, "onMarkerDragStart", event); + manager.pushEvent(context, this, "onMarkerDragStart", event); AirMapMarker markerView = markerMap.get(marker); event = makeClickEventData(marker.getPosition()); - manager.pushEvent(markerView, "onDragStart", event); + manager.pushEvent(context, markerView, "onDragStart", event); } @Override public void onMarkerDrag(Marker marker) { WritableMap event = makeClickEventData(marker.getPosition()); - manager.pushEvent(this, "onMarkerDrag", event); + manager.pushEvent(context, this, "onMarkerDrag", event); AirMapMarker markerView = markerMap.get(marker); event = makeClickEventData(marker.getPosition()); - manager.pushEvent(markerView, "onDrag", event); + manager.pushEvent(context, markerView, "onDrag", event); } @Override public void onMarkerDragEnd(Marker marker) { WritableMap event = makeClickEventData(marker.getPosition()); - manager.pushEvent(this, "onMarkerDragEnd", event); + manager.pushEvent(context, this, "onMarkerDragEnd", event); AirMapMarker markerView = markerMap.get(marker); event = makeClickEventData(marker.getPosition()); - manager.pushEvent(markerView, "onDragEnd", event); + manager.pushEvent(context, markerView, "onDragEnd", event); } private ProgressBar getMapLoadingProgressBar() { @@ -778,6 +779,6 @@ public void onPanDrag(MotionEvent ev) { Point point = new Point((int) ev.getX(), (int) ev.getY()); LatLng coords = this.map.getProjection().fromScreenLocation(point); WritableMap event = makeClickEventData(coords); - manager.pushEvent(this, "onPanDrag", event); + manager.pushEvent(context, this, "onPanDrag", event); } } From 4247d9be4b4ff291737e2f512be3bf8ed16e42da Mon Sep 17 00:00:00 2001 From: Leland Richardson Date: Tue, 21 Mar 2017 11:34:40 -0700 Subject: [PATCH 9/9] Fix abi splits on example app --- example/android/app/build.gradle | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle index c0fcb022f..f46e51f10 100644 --- a/example/android/app/build.gradle +++ b/example/android/app/build.gradle @@ -61,6 +61,8 @@ import com.android.build.OutputFile apply from: "react.gradle" +def enableSeparateBuildPerCPUArchitecture = false + /** * Run Proguard to shrink the Java bytecode in release builds. */ @@ -76,6 +78,17 @@ android { targetSdkVersion 23 versionCode 1 versionName "1.0" + ndk { + abiFilters "armeabi-v7a", "x86" + } + } + splits { + abi { + reset() + enable enableSeparateBuildPerCPUArchitecture + universalApk false // If true, also generate a universal APK + include "armeabi-v7a", "x86" + } } buildTypes { release {