Bazel Eğitimi: Android Uygulaması Oluşturma

Sorun bildir Kaynağı göster

Not: Android uygulamaları oluşturmak için Bazel kullanımıyla ilgili bilinen sınırlamalar vardır. Bilinen sorunların listesini görmek için GitHub ekibi-Android aktif listesini ziyaret edin. Bazel ekibi ve Açık Kaynak Yazılım'a (OSS) katkıda bulunanlar, bilinen sorunları gidermek için aktif olarak çalışsalar da kullanıcılar, Android Studio'nun Bazel projelerini resmi olarak desteklemediğini bilmelidir.

Bu eğiticide, Bazel kullanılarak basit bir Android uygulamasının nasıl oluşturulacağı açıklanmaktadır.

Bazel, Android kuralları kullanılarak Android uygulamaları oluşturmayı destekler.

Bu eğitim Windows, macOS ve Linux kullanıcılarına yöneliktir ve Bazel veya Android uygulaması geliştirme deneyimi gerektirmez. Bu eğiticide herhangi bir Android kodu yazmanız gerekmez.

Neler öğreneceksiniz?

Bu eğiticide şunları öğreneceksiniz:

  • Bazel ve Android Studio'yu yükleyip örnek projeyi indirerek ortamınızı ayarlayın.
  • Uygulamanın kaynak kodunu içeren bir Bazel çalışma alanı ve çalışma alanı dizininin en üst düzeyini tanımlayan bir WORKSPACE dosyası oluşturun.
  • WORKSPACE dosyasını, Android SDK gibi gerekli dış bağımlılıklara referanslar içerecek şekilde güncelleyin.
  • Bir BUILD dosyası oluşturun.
  • Uygulamayı Bazel ile oluşturun.
  • Uygulamayı bir Android emülatöre veya fiziksel cihaza dağıtıp çalıştırın.

Başlamadan önce

Bazel'ı yükleme

Eğiticiye başlamadan önce aşağıdaki yazılımları yükleyin:

  • Bazel. Yüklemek için yükleme talimatlarını uygulayın.
  • Android Studio. Yüklemek için Android Studio'yu indirme adımlarını uygulayın. SDK'yı indirmek ve ortamınızı yapılandırmak için kurulum sihirbazını çalıştırın.
  • (İsteğe bağlı) Git. Android uygulama projesini indirmek için git uygulamasını kullanın.

Örnek projeyi alma

Örnek proje için Bazel'in örnekler deposundaki temel Android uygulama projesini kullanın.

Bu uygulamada, tıklandığında karşılama mesajı yazdıran tek bir düğme vardır:

Düğmeli karşılama mesajı

Şekil 1. Android uygulaması düğme karşılama mesajı.

Depoyu git ile klonlayın (veya ZIP dosyasını doğrudan indirin):

git clone https://github.com/bazelbuild/examples

Bu eğitim için örnek proje examples/android/tutorial konumunda. Eğiticinin geri kalanında, komutları bu dizinde yürüteceksiniz.

Kaynak dosyaları inceleyin

Uygulamanın kaynak dosyalarına göz atın.

.
├── README.md
└── src
    └── main
        ├── AndroidManifest.xml
        └── java
            └── com
                └── example
                    └── bazel
                        ├── AndroidManifest.xml
                        ├── Greeter.java
                        ├── MainActivity.java
                        └── res
                            ├── layout
                            │   └── activity_main.xml
                            └── values
                                ├── colors.xml
                                └── strings.xml

Önemli dosya ve dizinler şunlardır:

Ad Konum
Android manifest dosyaları src/main/AndroidManifest.xml ve src/main/java/com/example/bazel/AndroidManifest.xml
Android kaynak dosyaları src/main/java/com/example/bazel/MainActivity.java ve Greeter.java
Kaynak dosya dizini src/main/java/com/example/bazel/res/

Bazel ile oluşturma

Çalışma alanını ayarlama

Çalışma alanı, bir veya daha fazla yazılım projesinin kaynak dosyalarını içeren ve kök dizininde WORKSPACE dosyası bulunan bir dizindir.

WORKSPACE dosyası boş olabilir veya projenizi derlemek için gereken harici bağımlılıklara referanslar içeriyor olabilir.

İlk olarak, boş bir WORKSPACE dosyası oluşturmak için aşağıdaki komutu çalıştırın:

OS Komut
Linux, macOS touch WORKSPACE
Windows (Komut İstemi) type nul > WORKSPACE
Windows (PowerShell) New-Item WORKSPACE -ItemType file

Bazel - Koşu

Artık şu komutla Bazel'ın düzgün çalışıp çalışmadığını kontrol edebilirsiniz:

bazel info workspace

Bazel geçerli dizinin yolunu yazdırırsa, devam edebilirsiniz! WORKSPACE dosyası yoksa şunun gibi bir hata mesajı görebilirsiniz:

ERROR: The 'info' command is only supported from within a workspace.

Android SDK ile entegrasyon

Bazel'ın, uygulamayı derlemek için Android SDK oluşturma araçlarını çalıştırması gerekir. Bu, Bazel'ın bu bilgileri nerede bulacağını bilmesi için WORKSPACE dosyanıza bazı bilgiler eklemeniz gerektiği anlamına gelir.

Aşağıdaki satırı WORKSPACE dosyanıza ekleyin:

android_sdk_repository(name = "androidsdk")

Bu işlem, Android SDK'sını ANDROID_HOME ortam değişkeninde belirtilen yolda kullanır ve söz konusu konumda yüklü olan en yüksek API düzeyini ve derleme araçlarının en son sürümünü otomatik olarak algılar.

ANDROID_HOME değişkenini Android SDK'nın konumuna ayarlayabilirsiniz. Android Studio'nun SDK Yöneticisi'ni kullanarak yüklü SDK'nın yolunu bulun. SDK'nın varsayılan konumlara yüklendiğini varsayarsak ANDROID_HOME değişkenini ayarlamak için aşağıdaki komutları kullanabilirsiniz:

OS Komut
Linux export ANDROID_HOME=$HOME/Android/Sdk/
macOS export ANDROID_HOME=$HOME/Library/Android/sdk
Windows (Komut İstemi) set ANDROID_HOME=%LOCALAPPDATA%\Android\Sdk
Windows (PowerShell) $env:ANDROID_HOME="$env:LOCALAPPDATA\Android\Sdk"

Yukarıdaki komutlar, değişkeni yalnızca geçerli kabuk oturumu için ayarlar. Bunları kalıcı hale getirmek için aşağıdaki komutları çalıştırın:

OS Komut
Linux echo "export ANDROID_HOME=$HOME/Android/Sdk/" >> ~/.bashrc
macOS echo "export ANDROID_HOME=$HOME/Library/Android/Sdk/" >> ~/.bashrc
Windows (Komut İstemi) setx ANDROID_HOME "%LOCALAPPDATA%\Android\Sdk"
Windows (PowerShell) [System.Environment]::SetEnvironmentVariable('ANDROID_HOME', "$env:LOCALAPPDATA\Android\Sdk", [System.EnvironmentVariableTarget]::User)

Ayrıca path, api_level ve build_tools_version özelliklerini ekleyerek Android SDK'nın mutlak yolunu, API düzeyini ve kullanılacak derleme araçlarının sürümünü açıkça belirtebilirsiniz. api_level ve build_tools_version belirtilmezse android_sdk_repository kuralı, SDK'daki ilgili en son sürümü kullanır. SDK'da mevcut oldukları sürece bu özelliklerin herhangi bir kombinasyonunu belirtebilirsiniz. Örneğin:

android_sdk_repository(
    name = "androidsdk",
    path = "/path/to/Android/sdk",
    api_level = 25,
    build_tools_version = "30.0.3"
)

Windows'da path özelliğinin karma stilde yolu, yani düz eğik çizgili bir Windows yolunu kullanması gerektiğini unutmayın:

android_sdk_repository(
    name = "androidsdk",
    path = "c:/path/to/Android/sdk",
)

İsteğe bağlı: Yerel kodu Android uygulamanızda derlemek istiyorsanız Android NDK'yı indirmeniz ve aşağıdaki satırı WORKSPACE dosyanıza ekleyerek Bazel'a onu nerede bulacağını bildirmeniz gerekir:

android_ndk_repository(name = "androidndk")

android_sdk_repository yöntemine benzer şekilde, Android NDK yolu varsayılan olarak ANDROID_NDK_HOME ortam değişkeninden tahmin edilir. Yol, android_ndk_repository üzerinde bir path özelliğiyle açıkça belirtilebilir.

Daha fazla bilgi için Android Yerel Geliştirme Kiti'ni Bazel ile Kullanma konusunu okuyun.

api_level, SDK ve NDK'nın hedeflediği Android API sürümüdür. Örneğin, Android 6.0 için 23 ve Android 7.1 için 25. Açıkça belirtilmediği takdirde api_level, android_sdk_repository ve android_ndk_repository için varsayılan olarak mevcut en yüksek API düzeyini ayarlar.

API düzeylerinin SDK ve NDK için aynı değere ayarlanmasına gerek yoktur. Bu sayfada, Android sürümlerinden NDK destekli API düzeylerine uzanan bir harita bulunmaktadır.

BUILD dosyası oluşturma

BUILD dosyası, aapt kaynağından derlenmiş Android kaynakları veya javac kaynağından derlenmiş sınıf dosyaları gibi bir dizi derleme çıkışı arasındaki ilişkiyi ve bunların bağımlılıklarını açıklar. Bu bağımlılıklar çalışma alanınızdaki kaynak dosyalar (Java, C++) veya diğer derleme çıkışları olabilir. BUILD dosyaları Starlark adlı dilde yazılmıştır.

BUILD dosyaları, Bazel'de paket hiyerarşisi olarak bilinen bir kavramın parçasıdır. Paket hiyerarşisi, çalışma alanınızdaki dizin yapısını kaplayan mantıksal bir yapıdır. Her paket, ilgili bir kaynak dosya grubunu ve bir BUILD dosyasını içeren bir dizindir (ve alt dizinleridir). Paket, kendi BUILD dosyasını içerenler dışında tüm alt dizinleri de içerir. Paket adı, BUILD dosyasının WORKSPACE ile göreli yoludur.

Dizinler aynı şekilde organize edilebilse de, Bazel'ın paket hiyerarşisinin, BUILD dosyasının bulunduğu Android App dizininizin Java paket hiyerarşisinden kavramsal olarak farklı olduğunu unutmayın.

Bu eğiticideki basit Android uygulaması için src/main/ ürünündeki kaynak dosyalar tek bir Bazel paketi oluşturur. Daha karmaşık bir projede çok sayıda iç içe yerleştirilmiş paket olabilir.

android_library kuralı ekle

Bir BUILD dosyası, Bazel için birkaç farklı bildirim türü içeriyor. En önemli tür, Bazel'a bir dizi kaynak dosyadan veya diğer bağımlılıklardan ara ya da nihai yazılım çıktısı oluşturmayı söyleyen oluşturma kuralıdır. Bazel, bir Android uygulaması oluşturmak için kullanabileceğiniz iki oluşturma kuralı (android_library ve android_binary) sağlar.

Bu eğiticide önce android_library kuralını kullanarak Bazel'a uygulama kaynak kodundan ve kaynak dosyalarından bir Android kitaplık modülü oluşturmasını söyleyin. Ardından Bazel'a Android uygulama paketini nasıl derleyeceğini bildirmek için android_binary kuralını kullanırsınız.

src/main/java/com/example/bazel dizininde yeni bir BUILD dosyası oluşturun ve yeni bir android_library hedefi bildirin:

src/main/java/com/example/bazel/BUILD:

package(
    default_visibility = ["//src:__subpackages__"],
)

android_library(
    name = "greeter_activity",
    srcs = [
        "Greeter.java",
        "MainActivity.java",
    ],
    manifest = "AndroidManifest.xml",
    resource_files = glob(["res/**"]),
)

android_library derleme kuralı, Bazel'ın kaynak dosyalardan kitaplık modülü oluşturmak için ihtiyaç duyduğu bilgileri belirten bir özellik kümesi içerir. Kuralın adının greeter_activity olduğunu da unutmayın. android_binary kuralında bağımlılık olarak bu adı kullanan kurala başvurursunuz.

android_binary kuralı ekleyin

android_binary kuralı, uygulamanız için Android uygulama paketini (.apk dosyası) oluşturur.

src/main/ dizininde yeni bir BUILD dosyası oluşturun ve yeni bir android_binary hedefi bildirin:

src/main/BUILD:

android_binary(
    name = "app",
    manifest = "AndroidManifest.xml",
    deps = ["//src/main/java/com/example/bazel:greeter_activity"],
)

Burada deps özelliği, yukarıdaki BUILD dosyasına eklediğiniz greeter_activity kuralının çıkışını kullanır. Yani Bazel bu kuralın çıkışını derlerken ilk olarak greeter_activity kitaplık kuralı çıktısının derlenip derlenmediğini ve güncel olup olmadığını kontrol eder. Aksi takdirde, Bazel dosyayı oluşturur ve ardından bu çıktıyı kullanarak uygulama paketi dosyasını oluşturur.

Şimdi dosyayı kaydedip kapatın.

Uygulamayı oluşturma

Uygulamayı oluşturmayı deneyin. android_binary hedefini oluşturmak için aşağıdaki komutu çalıştırın:

bazel build //src/main:app

build alt komutu, Bazel'a takip eden hedefi oluşturma talimatı verir. Hedef, çalışma alanı dizininize göre paket yolu ile birlikte BUILD dosyası içindeki bir derleme kuralının adı olarak belirtilir. Bu örnekte, hedef app ve paket yolu //src/main/ şeklindedir.

Komut satırındaki geçerli çalışma dizininize ve hedefin adına bağlı olarak, bazen paket yolunu veya hedef adını yok sayabileceğinizi unutmayın. Hedef etiketler ve yollar hakkında daha fazla ayrıntı için Etiketler bölümüne bakın.

Bazel, örnek uygulamayı derlemeye başlar. Derleme işlemi sırasında uygulamanın çıkışı aşağıdakine benzer şekilde görünür:

INFO: Analysed target //src/main:app (0 packages loaded, 0 targets configured).
INFO: Found 1 target...
Target //src/main:app up-to-date:
  bazel-bin/src/main/app_deploy.jar
  bazel-bin/src/main/app_unsigned.apk
  bazel-bin/src/main/app.apk

Derleme çıktılarını bulma

Bazel, ara ve son derleme işlemlerinin çıktılarını kullanıcı ve çalışma alanı başına çıkış dizinlerine yerleştirir. Bu dizinler, proje dizininin en üst düzeyinde bulunan aşağıdaki konumlardan sembolik bağlantıyla gösterilmektedir: WORKSPACE:

  • bazel-bin, yürütülebilir ikili programları ve diğer çalıştırılabilir derleme çıkışlarını depolar
  • bazel-genfiles, Bazel kuralları tarafından oluşturulan aracı kaynak dosyaları depolar
  • bazel-out, diğer derleme çıktısı türlerini depolar

Bazel, android_binary kuralı kullanılarak oluşturulan Android .apk dosyasını bazel-bin/src/main dizininde depolar. Burada, src/main alt dizin adı Bazel paketinin adından türetilir.

Komut isteminde bu dizinin içeriğini listeleyin ve app.apk dosyasını bulun:

OS Komut
Linux, macOS ls bazel-bin/src/main
Windows (Komut İstemi) dir bazel-bin\src\main
Windows (PowerShell) ls bazel-bin\src\main

Uygulamayı çalıştırma

Artık uygulamayı bazel mobile-install komutunu kullanarak komut satırından bağlı bir Android cihaza veya emülatöre dağıtabilirsiniz. Bu komut, cihazla iletişim kurmak için Android Debug Bridge'i (adb) kullanır. Dağıtımdan önce Android Hata Ayıklama Köprüsü'ndeki talimatları uygulayarak cihazınızı adb kullanacak şekilde ayarlamanız gerekir. Uygulamayı, Android Studio'da bulunan Android emülatöre yüklemeyi de seçebilirsiniz. Aşağıdaki komutu yürütmeden önce emülatörün çalıştığından emin olun.

Aşağıdakileri girin:

bazel mobile-install //src/main:app

Daha sonra, "Bazel Tutorial App"i (Bazel Eğitim Uygulaması) bulup başlatın:

Bazel eğitim uygulaması

2. Şekil. Bazel eğitim uygulaması.

Tebrikler! Bazel tarafından geliştirilmiş ilk Android uygulamanızı yüklediniz.

mobile-install alt komutunun, uygulamanın yalnızca son dağıtımdan bu yana değişen bölümlerini dağıtmak için kullanılabilen --incremental işaretini de desteklediğini unutmayın.

Ayrıca, uygulamanın yüklendikten hemen sonra başlatılması için --start_app işaretini de destekler.

Daha fazla bilgi

Daha fazla bilgi için şu sayfalara bakın:

Kolay gelsin!