Android Studio 2.3.3, использующая компонентную модель gradle, создавала .aar автоматически; Android Studio 3.4.1 теперь с использованием CMake или NDK-Build не - PullRequest
0 голосов
/ 02 июля 2019

Мой wavvoxlibrary / build.gradle не только обслуживает основную программу (app / build.gradle), но и создает общую библиотеку .aar. И это прекрасно работает с Android Studio 2.3.3 и - для библиотеки - gradle-экспериментальный 0.9.3. Однако модель компонентов gradle не поддерживает abifilters, например, для сборки программ JNI / c / c ++ в 64-битной среде.

Итак, я обновился до Android Studio 3.4.1, и мой wavvoxlibrary / build.gradle удалил указанную модель компонента и получил соответствующий файл CMakeList.txt для вывода списка программ на c / c ++ и любых параметров компилятора, которые раньше были частью старого билда. Я также добавил опцию NDK-Build с файлами приложений Application.mk и Android.mk.

Пока все хорошо. Мое приложение создано и работает правильно, включая общие библиотеки для armabi-v7a (32-разрядная версия) и arm64-v8a (64-разрядная версия).

Чего не хватает: чтобы создать файл .aar, я должен явно вызвать задачу gradle wavvoxlibrary .. сборка.

Есть ли способ сгенерировать .aar, который при сборке моего, скажем, подписанного apk?

Я удалил модель компонентов gradle для перемещения из gradle: 2.3.3 и gradle-экспериментальный: 0.9.3 с помощью «apply plugin: 'com.android.model.library'» для gradle: 3.4.1 с «apply plugin: 'com.android.library'», а также вызвал cmake (или, вместо этого, ndkBuild), чтобы вывести там файлы c / c ++ и опции компилятора.

Смотрите мой блог с подробностями: http://jurgenmenge.com/blog/computer/migrate-a-library-in-android-studio/

import java.text.SimpleDateFormat

// migrate from Android Studio with gradle:2.3.3 + gradle-experimental:0.9.3
//           to Android Studio with gradle:3.4.1 + Cmake + ndkBuild
// jm*20190614

apply plugin: 'com.android.library'
//apply plugin: 'com.android.model.library'

/**
 * Each subversion code should be exactly 2 numeric digits or we will get wrong versions published
 * in the Google Play Store; buildType to switch between "cmake" and "ndkBuild"
 */
ext.majorVersion = "03"
ext.minorVersion = "08"
ext.patchVersion = "03"

static String buildKind() {    // neat trick I created  :-)   // jm*20190614
    //return "gradle"  // model - experimental
    //return "cmake"
    return "ndkBuild"
}

/**
 * The name of the app version, using the Semantic Versioning format (major.minor.patch)
 * @return
 */
String appVersionName() {
    String appVersion = removeLeadingZeros(ext.majorVersion) + "." \
                      + removeLeadingZeros(ext.minorVersion) + "." \
                      + ext.patchVersion

    System.out.println("  ************************************************")
    System.out.println("  *** WavvoxLibrary  version:  " + appVersion + " ")
    System.out.println("  ***                buildKind " + buildKind() )
    System.out.println("  ************************************************")
    return appVersion
}

//model {
    android {
        compileSdkVersion 28
        buildToolsVersion "28.0.3"  // "25.0.3"

        defaultConfig {
            minSdkVersion 16       /*** was: 8 ***/
            targetSdkVersion 28
            //
            versionName appVersionName() + "_" + buildKind()
            setProperty("archivesBaseName", "wavvoxlibrary-$versionName")
            buildConfigField "String", "VERSION_NAME_WAVVOX_FORMAT", versionNameWavvoxFormat()

            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        //}   // defaultConfig

        ndk {
            moduleName "wavvox-decoder"
            ldLibs "log", "android"
            // these platforms cover 99% percent of all Android devices
            abiFilters "arm64-v8a", "armeabi-v7a"
                   //, "x86", "x86_64"
        }   // ndk

        externalNativeBuild {
            switch (buildKind()) {
                case "ndkBuild":
                    ndkBuild {
                        cFlags "-std=c99", "-O3", "-Ofast", "-mfpu=neon"            // jm*20190616
                            // "-Wno-error=format-security", "-mfloat-abi=softfp:, "-g"
                        abiFilters "armeabi-v7a", "arm64-v8a"
                    }
                    break
                case "cmake":
                    cmake {
                        cFlags "-std=c99", "-O3", "-Ofast", "-mfpu=neon"            // jm*20190616
                            // "-Wno-error=format-security", "-mfloat-abi=softfp:, "-g"
                        abiFilters 'armeabi-v7a', 'arm64-v8a'
                    }
                    break
                default:
                    println "**** unknown buildType value: " + buildType() + " ****"
            }
        }   // externalNativeBuild

        }   // defaultConfig

        buildTypes {
            release {
                minifyEnabled true
                proguardFiles "proguard-rules.pro"
            }
        }   // buildTypes
        // }   // android   // jm*20190405

        // android.ndk {   // jm*20190405

        // C source files to include in the build script
        // android.sources.main.jni {   // jm*20190405

  /*    if (buildKind() == "gradle")    // using "model"  in gradle_experimental
        sourceSets {
            main {
                jniLibs.srcDirs = ['src/main/jni']    // for pre-built .so files

                jni {
                    //source {
                        include "wavvoxNativeApp.c"
                        // ... and all the other c/c++ programs

                        srcDir "jni"
                    //}
                }   // jni
            }   // main
        }   // source
*/
        externalNativeBuild {
            switch (buildKind()) {
                case "ndkBuild":
                    ndkBuild {
                        path 'src/main/jni/Android.mk'
                    }
                    break
                case "cmake":
                    cmake {
                        version '3.10.2'
                        path 'src/main/jni/CMakeLists.txt'
                    }
                    break
                default:
                    println "**** unknown buildType value: " + buildType() + " ****"
            }
        }   // externalNativeBuild

    }   // android   // jm*20190405
//}   // model

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'

    implementation 'com.android.support:support-annotations:28.0.0'

    testImplementation 'junit:junit:4.12'
    testImplementation 'org.hamcrest:hamcrest-junit:2.0.0.0'
}

/**
 * Workaround for using ProGuard with the experimental Gradle plugin.
 *
 * Trouble seems to be that unless process(Debug|Release)Resources task is needed, it is not created
 * and VariantOutputScope.setProcessResourcesTask in TaskManager.createProcessResTask() is not
 * called so when TaskManager.applyProguardConfig() calls
 * BaseVariantOutputData.processResouresTask.getProguardOutputFile() it does so on a null object.
 * So, by making transformClassesAndResourcesWithProguardFor(Debug|Release) depend on
 * process(Debug|Release)Resources I force the task to be created
 *
 * More discussions here: https://issuetracker.google.com/issues/37079003
 */

tasks.all { task ->
    def match = task.name =~ /^transformClassesAndResourcesWithProguardFor(.*)$/
    if (match) {
        task.dependsOn "process${match.group(1)}Resources"
        return
    }
}

// ToDo:  get automatic build of .aar libraries working;
//        currently, double-click on Gradle "wavvoxlibrary / Tasks / build / assemble"

}

Я хотел, чтобы файл .aar создавался автоматически при создании подписанного приложения (.apk) без дополнительного шага, выполняющего задачу gradle wavvoxlibrary сборки.

Что мне не хватает?

Спасибо, ДжМ.

1 Ответ

0 голосов
/ 02 июля 2019

Я думаю, что вы, возможно, попробовали это, но добавление его в качестве ответа, если это не поможет, удалит этот ответ.

Добавьте библиотечный модуль в файл settings.gradle.

include ':app', ':my-library-module'

https://developer.android.com/studio/projects/android-library#AddDependency

...