Gradle: cambia la meta de compilación de NDK independiente de la meta de creación de SDK
En el pasado utilicé eclipse para proyectos NDK, el archivo Android.mk era perfectamente adecuado para compilar el NDK con el nivel 9 de la API al tiempo que permitía que la aplicación (SDK) se compilara en el nivel 22 de API. Pero parece que esto no es posible cuando se usa el Experimental Gradle construir el sistema (2.5) con Android Studio 1.3 RC1.
¿Qué puedo hacer para compilar SOLAMENTE el NDK en API nivel 9?
- Cómo establecer el nombre de la salida AAR de Gradle
- Las configuraciones de Gradle no funcionan como se espera en el nuevo sistema de compilación de Android
- Dónde poner manifestos de sabor para que se fusionen con el archivo principal de AndroidManifest
- La ruta local no existe Android Studio 1.0
- Agrega android-support-v13.jar en Android Studio
Mi archivo típico de Android.mk tiene este aspecto:
APP_PLATFORM := android-9 APP_STL := stlport_static APP_ABI := all # Enable c++11 extentions in source code APP_CPPFLAGS += -std=c++11 #Enable optimalization in release mode APP_OPTIM := release
Mi nuevo archivo gradle se ve así:
apply plugin: 'com.android.model.application' model { android { compileSdkVersion = 22 buildToolsVersion = "23.0.0 rc3" defaultConfig.with { applicationId = "com.example" minSdkVersion.apiLevel = 9 targetSdkVersion.apiLevel = 22 versionCode = 1 versionName = "1.0" } } android.ndk { moduleName = "NativeLibrary" cppFlags += "-I${file("src/main/jni/some_folder")}".toString() cppFlags += "-std=c++11" //What should be added here to compile the NDK on API 9??? CFlags += "-DNDEBUG" CFlags += "-fvisibility=hidden" cppFlags += "-fvisibility=hidden" ldLibs += ["log"] stl = "stlport_static" } android.buildTypes { release { isMinifyEnabled = true proguardFiles += file('D:/path/proguard-rules.pro') } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:support-v4:22.2.0' }
Investigué la fuente de Gradle y parece que la meta de construcción de NDK es codificada como la compileSdkVersion. ¿Existe un método para evitar o alterar este comportamiento?
NdkCompile.groovy (crear archivo)
// target IAndroidTarget target = getPlugin().loadedSdkParser.target if (!target.isPlatform()) { target = target.parent } commands.add("APP_PLATFORM=" + target.hashString())
Sdk.groovy (el destino se obtiene de la compileSdkVersion)
public SdkParser loadParser() { checkNotNull(extension, "Extension has not been set") // call getParser to ensure it's created. SdkParser theParser = getParser() if (!isSdkParserInitialized) { String target = extension.getCompileSdkVersion() if (target == null) { throw new IllegalArgumentException("android.compileSdkVersion is missing!") } FullRevision buildToolsRevision = extension.buildToolsRevision if (buildToolsRevision == null) { throw new IllegalArgumentException("android.buildToolsVersion is missing!") } theParser.initParser(target, buildToolsRevision, logger) isSdkParserInitialized = true } return theParser }
- Proyecto Android y Gradle: montar un solo módulo
- Android Studio 1.2.2, construir con éxito, pero no apk en la construcción / salida?
- "ZipAlignExe 'no existe." Error al ejecutar mi proyecto en Android Studio
- Vista personalizada en una biblioteca aar local no accesible?
- Gradle connectedAndroidTest devuelve "No se encontró ninguna prueba", sin embargo, el shell adb shell puede encontrar las pruebas
- Problema de representación con android API 22
- No se puede encontrar el paquete reactivo-nativo en bibliotecas externas
- Target Fire TV, Android y Android TV con Gradle
Si está utilizando la versión 0.4 del plugin experimental. Puedes establecer
android.ndk { platformVersion = "19" }
Ok, este es un hack terrible, pero es muy fácil. Encuentre el NDK, debe estar en android-sdk / ndk-bundle. Vaya a la carpeta de plataformas. Cambia el nombre de android-21 a otra cosa. Hacer una copia de android-19, y luego copiar las tres carpetas de 64 bits de android-21 en él, a continuación, cambie el nombre de android-21. Gradle va a pensar que está usando android-21, y lo hará para los objetivos de 64 bits, pero para objetivos de 32 bits que utilizará android 19.
No estoy 100% seguro de que esto es seguro, pero lo probé en algunos dispositivos y ahora tengo una aplicación en la prueba Beta. Creo que es más limpio que hacer tareas de gradle para ndk-build. Siempre que Google corrija gradle experimental, nada necesita cambiar a no ser reinstalar el ndk.
model { android { compileSdkVersion = 22 buildToolsVersion '20' defaultConfig.with { applicationId = "com.example" minSdkVersion.apiLevel = 9 targetSdkVersion.apiLevel = 22 versionCode = 1 versionName = "1.0" } }
- No se puede usar FakeHttpLayer de Robolectric (NullPointerException al llamar a getFakeHttpLayer)
- El efecto de ondulación no se produce cuando se utiliza también makeSceneTransitionAnimation