Gradle'ı yerel kitaplığınıza bağlama

Yerel kitaplık projenizi Gradle derleme bağımlılığı olarak eklemek için: kullanarak Gradle'a CMake veya ndk-build komut dosyası yolunu girin. Zaman Gradle, CMake veya ndk-build ve paylaşılan paketler kitaplığını kullanımınıza sunulur. Gradle, hangi dosyaların bunları Android Studio projenize çekin. Böylece, Proje penceresi. Yerel reklamınız için derleme komut dosyanız yoksa bir proje başlatma belgesi Devam etmeden önce CMake komut dosyasını kullanın.

Android projenizdeki her modül yalnızca bir CMake veya ndk-build'a bağlanabilir komut dosyası olarak da kullanabilirsiniz. Örneğin, birden fazla CMake projesi varsa bir CMakeLists.txt dosyası kullanmanız gerekir üst düzey CMake derleme komut dosyanız olarak (daha sonra Gradle'ı bağlarsınız) ve diğer CMake projelerini şu şekilde ekleyin: bağımlılıklarını görebilirsiniz. Benzer şekilde, ndk-build kullanıyorsanız diğer Makefile'ları üst düzeyinize ekleyebilir. Android.mk komut dosyası dosyası.

Gradle'ı yerel bir projeye bağladığınızda Android Studio, Kaynak dosyalarınızı ve yerel kitaplıklarınızı gösteren Proje bölmesi cpp grubunda, harici derleme komut dosyalarınızda ise Harici Derleme Dosyaları grubu.

Not: Gradle yapılandırmasında değişiklik yaparken Projeyi Senkronize Et'i tıklayarak değişikliklerinizi uygulayın. tıklayın. Ayrıca, CMake veya ndk-build ayarlarınızda değişiklik yaparken Gradle'a bağladıktan sonra bu dosyayı Oluştur > Bağlı C++ Hesabını Yenile Projeler'i tıklayın.

Gradle'ı harici bir CMake veya ndk-build projesine bağlamak için Android Studio kullanıcı arayüzü:

  1. IDE'nin sol tarafından Proje bölmesini açın ve Android görünümünü seçin.
  2. Yerel kitaplığınıza bağlamak istediğiniz modülü sağ tıklayın, örneğin app modülünü bağlayıp C++ Projesini Bağla'yı seçin. kolayca ayarlayabilirsiniz. Şuna benzer bir iletişim kutusu göreceksiniz: Şekil 4'te gösterilmiştir.
  3. Açılır menüden Yap'ı veya ndk-build.
    1. CMake'i seçerseniz öğesinin yanındaki alanı kullanın CMakeLists.txt komut dosyasını belirtmek için Proje Yolu dosyası oluşturun.
    2. ndk-build'i seçerseniz yanındaki alanı kullanın Proje Yolu:Android.mk harici ndk-build projenize ekleyin. Android Studio, Application.mk dosyanızla aynı dizinde bulunuyorsa, Android.mk dosyası.

    4.Şekil Harici bir C++ projesini Android Studio iletişim kutusu.

  4. Tamam'ı tıklayın.

Gradle'ı manuel olarak yapılandırma

Gradle'ı yerel kitaplığınıza bağlanacak şekilde manuel olarak yapılandırmak için Modül düzeyinize externalNativeBuild blok build.gradle dosyasını seçin ve dosyayı cmake veya ndkBuild engelleme:

Eski

android {
  ...
  defaultConfig {...}
  buildTypes {...}

  // Encapsulates your external native build configurations.
  externalNativeBuild {

    // Encapsulates your CMake build configurations.
    cmake {

      // Provides a relative path to your CMake build script.
      path "CMakeLists.txt"
    }
  }
}

Kotlin

android {
  ...
  defaultConfig {...}
  buildTypes {...}

  // Encapsulates your external native build configurations.
  externalNativeBuild {

    // Encapsulates your CMake build configurations.
    cmake {

      // Provides a relative path to your CMake build script.
      path = file("CMakeLists.txt")
    }
  }
}

Not: Gradle'ı mevcut bir ndk-build'e bağlamak istiyorsanız kullanmak için yerine ndkBuild bloğu cmake engelle ve Android.mk dosyanız için göreli bir yol sağlayın. Gradle Application.mk dosyasını da içerirse Android.mk dosyanızla aynı dizinde bulunur.

İsteğe bağlı yapılandırmaları belirtin

CMake veya ndk-build için isteğe bağlı argümanlar ve işaretler belirtebilirsiniz: başka bir yapılandırılıyor externalNativeBuild blok içinde Modül düzeyinizin defaultConfig bloğu build.gradle dosya. Şuradaki diğer mülklere benzer: defaultConfig engelleme, her biri için bu özellikleri geçersiz kılabilirsiniz. ürün çeşidini ekleyin.

Örneğin, CMake veya ndk-build projeniz birden fazla yerel kod tanımlıyorsa kitaplıkları ve yürütülebilir dosyaları bulmak için Bunların bir alt kümesini oluşturmak ve paketlemek için kullanılan targets özelliği eserleri ortaya çıkarır. Aşağıdaki kod örneğinde yapılandırabileceğiniz özelliklerden bazıları şunlardır:

Eski

android {
  ...
  defaultConfig {
    ...
    // This block is different from the one you use to link Gradle
    // to your CMake or ndk-build script.
    externalNativeBuild {

      // For ndk-build, instead use the ndkBuild block.
      cmake {

        // Passes optional arguments to CMake.
        arguments "-DANDROID_ARM_NEON=TRUE", "-DANDROID_TOOLCHAIN=clang"

        // Sets a flag to enable format macro constants for the C compiler.
        cFlags "-D__STDC_FORMAT_MACROS"

        // Sets optional flags for the C++ compiler.
        cppFlags "-fexceptions", "-frtti"
      }
    }
  }

  buildTypes {...}

  productFlavors {
    ...
    demo {
      ...
      externalNativeBuild {
        cmake {
          ...
          // Specifies which native libraries or executables to build and package
          // for this product flavor. The following tells Gradle to build only the
          // "native-lib-demo" and "my-executible-demo" outputs from the linked
          // CMake project. If you don't configure this property, Gradle builds all
          // executables and shared object libraries that you define in your CMake
          // (or ndk-build) project. However, by default, Gradle packages only the
          // shared libraries in your app.
          targets "native-lib-demo",
                  // You need to specify this executable and its sources in your CMakeLists.txt
                  // using the add_executable() command. However, building executables from your
                  // native sources is optional, and building native libraries to package into
                  // your app satisfies most project requirements.
                  "my-executible-demo"
        }
      }
    }

    paid {
      ...
      externalNativeBuild {
        cmake {
          ...
          targets "native-lib-paid",
                  "my-executible-paid"
        }
      }
    }
  }

  // Use this block to link Gradle to your CMake or ndk-build script.
  externalNativeBuild {
    cmake {...}
    // or ndkBuild {...}
  }
}

Kotlin

android {
  ...
  defaultConfig {
    ...
    // This block is different from the one you use to link Gradle
    // to your CMake or ndk-build script.
    externalNativeBuild {

      // For ndk-build, instead use the ndkBuild block.
      cmake {

        // Passes optional arguments to CMake.
        arguments += listOf("-DANDROID_ARM_NEON=TRUE", "-DANDROID_TOOLCHAIN=clang")

        // Sets a flag to enable format macro constants for the C compiler.
        cFlags += listOf("-D__STDC_FORMAT_MACROS")

        // Sets optional flags for the C++ compiler.
        cppFlags += listOf("-fexceptions", "-frtti")
      }
    }
  }

  buildTypes {...}

  productFlavors {
    ...
    create("demo") {
      ...
      externalNativeBuild {
        cmake {
          ...
          // Specifies which native libraries or executables to build and package
          // for this product flavor. The following tells Gradle to build only the
          // "native-lib-demo" and "my-executible-demo" outputs from the linked
          // CMake project. If you don't configure this property, Gradle builds all
          // executables and shared object libraries that you define in your CMake
          // (or ndk-build) project. However, by default, Gradle packages only the
          // shared libraries in your app.
          targets += listOf("native-lib-demo",
                  // You need to specify this executable and its sources in your CMakeLists.txt
                  // using the add_executable() command. However, building executables from your
                  // native sources is optional, and building native libraries to package into
                  // your app satisfies most project requirements.
                  "my-executible-demo")
        }
      }
    }

    create("paid") {
      ...
      externalNativeBuild {
        cmake {
          ...
          targets += listOf("native-lib-paid",
                  "my-executible-paid")
        }
      }
    }
  }

  // Use this block to link Gradle to your CMake or ndk-build script.
  externalNativeBuild {
    cmake {...}
    // or ndkBuild {...}
  }
}

Ürün aromalarını yapılandırma ve derleme varyantları hakkında daha fazla bilgi edinmek için şu adrese gidin: Derleme Varyantlarını Yapılandırma Örneğin, CMake için yapılandırabileceğiniz değişkenlerin bir listesini arguments özelliği için CMake Değişkenlerini Kullanma bölümüne bakın.

Önceden oluşturulmuş yerel kitaplıkları dahil et

Gradle'ın hiçbir uygulamada kullanılmayan önceden oluşturulmuş yerel kitaplıkları paketlemesini istiyorsanız harici yerel derlemesi varsa, bunları src/main/jniLibs/ABI bulun.

CMake dahil olmak üzere Android Gradle eklentisinin 4.0'dan önceki sürümleri jniLibs dizininizde eklenebilmesi için IMPORTED hedefin oluşturulması gerekiyor uygulamasını indirin. Eklentinin önceki bir sürümünden taşıma işlemi gerçekleştiriyorsanız aşağıdaki gibi bir hatayla karşılaşırsanız:

* What went wrong:
Execution failed for task ':app:mergeDebugNativeLibs'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade
   > More than one file was found with OS independent path 'lib/x86/libprebuilt.so'

Android Gradle Plugin 4.0 kullanıyorsanız IMPORTED CBu hatadan kaçınmak için jniLibs dizininizden hedefler oluşturun.

ABI'leri belirtin

Gradle, varsayılan olarak yerel kitaplığınızı ayrı bir .so ürününde oluşturur. Uygulama İkili Arabirimleri için dosyalar (ABI'ler) NDK'nın desteklediği ve bunların tümünü uygulamanıza paket haline getirdiğinde. Şunu istiyorsanız: Yerel uygulamanızın yalnızca belirli ABI yapılandırmalarını oluşturmak ve paketlemek için Gradle kitaplıkları kullanarak bunları ndk.abiFilters işaretini aşağıda gösterildiği gibi, modül düzeyindeki build.gradle dosyanızda bulabilirsiniz:

Eski

android {
  ...
  defaultConfig {
    ...
    externalNativeBuild {
      cmake {...}
      // or ndkBuild {...}
    }

    // Similar to other properties in the defaultConfig block,
    // you can configure the ndk block for each product flavor
    // in your build configuration.
    ndk {
      // Specifies the ABI configurations of your native
      // libraries Gradle should build and package with your app.
      abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a',
                   'arm64-v8a'
    }
  }
  buildTypes {...}
  externalNativeBuild {...}
}

Kotlin

android {
  ...
  defaultConfig {
    ...
    externalNativeBuild {
      cmake {...}
      // or ndkBuild {...}
    }

    // Similar to other properties in the defaultConfig block,
    // you can configure the ndk block for each product flavor
    // in your build configuration.
    ndk {
      // Specifies the ABI configurations of your native
      // libraries Gradle should build and package with your app.
      abiFilters += listOf("x86", "x86_64", "armeabi", "armeabi-v7a",
                   "arm64-v8a")
    }
  }
  buildTypes {...}
  externalNativeBuild {...}
}

Çoğu durumda, abiFilters ndk blok, Gradle'a hem derleme hem de ve yerel kitaplıklarınızın bu sürümlerini paketleyin. Ancak isterseniz Gradle'ın yapmasını istediğiniz şeyden bağımsız olarak ne yapması gerektiğini kontrol edin. pakete eklemek içinabiFilters defaultConfig.externalNativeBuild.cmake blok (veya defaultConfig.externalNativeBuild.ndkBuild bloğu). Gradle bu ABI yapılandırmalarını oluşturur ancak yalnızca defaultConfig.ndk blok.

Uygulama yüklemelerinizin sayısını daha da azaltmak için Android App Bundle kullanarak yayınlamanız önerilir. yalnızca kullanıcının ABI'si ile eşleşen yerel kitaplıklar olarak cihaz indirme işlemiyle birlikte teslim edilir.

APK'ları kullanarak (Ağustos 2021'den önce oluşturulmuş) yayınlanan eski uygulamalar için şunları yapabilirsiniz: yapılandırma ABI'ye dayanan birden fazla APK oluşturabilirsiniz. Bunun yerine, sürümünü yüklediğinizde Gradle, her ABI için ayrı bir APK oluşturur her bir ABI'nın ihtiyaç duyduğu dosyaları desteklemek ve yalnızca paketler. Şu durumda: belirtmeden ABI başına birden fazla APK'yı yapılandırın Yukarıdaki kod örneğinde gösterildiği gibi abiFilters işareti. Gradle derlemeleri yerel kitaplıklarınızın desteklenen tüm ABI sürümleri ancak yalnızca bunları paketler birden fazla APK yapılandırmanızda belirttiğinizden emin olun. Farklı bir sürüm oluşturmaktan kaçınmak için istemediğiniz yerel kitaplıklar varsa, hem abiFilters işareti hem de ABI başına birden fazla APK'nız yapılandırma.