Bazel Eğitimi: Android Uygulaması Oluşturma

Sorun bildir Kaynağı görüntüle Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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

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

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

Bu eğitim, Windows, macOS ve Linux kullanıcıları için hazırlanmıştır ve Bazel veya Android uygulama geliştirme konusunda deneyim gerektirmez. Bu eğitimde herhangi bir Android kodu yazmanız gerekmez.

Neler öğreneceksiniz?

Bu eğitimde ş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 harici bağımlılıklarla ilgili referansları içerecek şekilde güncelleyin.
  • BUILD dosyası oluşturun.
  • Uygulamayı Bazel ile oluşturun.
  • Uygulamayı bir Android emülatörüne veya fiziksel cihaza dağıtıp çalıştırın.

Başlamadan önce

Bazel'i 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 simgesini kullanın.

Örnek projeyi alma

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

Bu uygulamada, tıklandığında selamlama yazdıran tek bir düğme var:

Düğme karşılama

1.şekil Android uygulama düğmesiyle selamlama.

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

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

Bu eğitimdeki örnek proje examples/android/tutorial konumunda yer alır. Eğitimin geri kalanında bu dizinde komutlar yürüteceksiniz.

Kaynak dosyaları inceleme

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 dosyalar 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 dosyası dizini src/main/java/com/example/bazel/res/

Bazel ile derleme

Ç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 oluşturmak için gereken harici bağımlılıklarla ilgili referanslar içerebilir.

Öncelikle 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'i çalıştırma

Artık Bazel'in doğru şekilde çalışıp çalışmadığını şu komutla kontrol edebilirsiniz:

bazel info workspace

Bazel, mevcut dizinin yolunu yazdırıyorsa hazırsınız demektir. WORKSPACE dosyası yoksa şu gibi bir hata mesajı görebilirsiniz:

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

Android SDK ile entegrasyon

Bazel'in uygulamayı oluşturmak için Android SDK derleme araçlarını çalıştırması gerekir. Bu nedenle, Bazel'in bu araçları nerede bulacağını bilmesi için WORKSPACE dosyanıza bazı bilgiler eklemeniz gerekir.

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

android_sdk_repository(name = "androidsdk")

Bu işlem, ANDROID_HOME ortam değişkeni tarafından referans verilen yoldaki Android SDK'sını kullanır ve en yüksek API düzeyini ve bu konumda yüklü olan 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üklenen 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 mevcut 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ü de açıkça belirtebilirsiniz. api_level ve build_tools_version belirtilmezse android_sdk_repository kuralı, SDK'da bulunan ilgili en son sürümü kullanır. SDK'da bulunduğu 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 stil yolu kullanması gerektiğini unutmayın. Yani eğik çizgiler içeren bir Windows yolu:

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ı da indirmeniz ve WORKSPACE dosyanıza aşağıdaki satırı ekleyerek Bazel'e NDK'yı nerede bulacağını söylemeniz gerekir:

android_ndk_repository(name = "androidndk")

android_sdk_repository'ya benzer şekilde, Android NDK'nin yolu varsayılan olarak ANDROID_NDK_HOME ortam değişkeninden çıkarılır. Yol, android_ndk_repository üzerinde path özelliğiyle de açıkça belirtilebilir.

Daha fazla bilgi için Android Native Development Kit'i Bazel ile Kullanma başlıklı makaleyi 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, Android 7.1 için 25. Açıkça ayarlanmamışsa api_level, android_sdk_repository ve android_ndk_repository için varsayılan olarak mevcut en yüksek API düzeyine ayarlanır.

SDK ve NDK için API düzeylerinin aynı değere ayarlanması gerekmez. Bu sayfada, Android sürümlerinden NDK'nın desteklediği API düzeylerine kadar olan eşlemeler yer alır.

BUILD dosyası oluşturma

BUILD dosyası, aapt'den derlenen Android kaynakları veya javac'den sınıf dosyaları gibi bir dizi derleme çıktısı ile bunların bağımlılıkları arasındaki ilişkiyi açıklar. Bu bağımlılıklar, çalışma alanınızdaki kaynak dosyalar (Java, C++) veya diğer derleme çıktıları olabilir. BUILD dosyaları, Starlark adlı bir dilde yazılı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 dosyaları kümesini ve bir BUILD dosyasını içeren bir dizindir (ve alt dizinleri). Paket, kendi BUILD dosyasını içerenler hariç olmak üzere tüm alt dizinleri de içerir. Paket adı, BUILD dosyasının WORKSPACE ile ilişkili yoludur.

Dizinler aynı şekilde düzenlenmiş olsa da Bazel'in paket hiyerarşisinin, BUILD dosyasının bulunduğu Android uygulama dizininizin Java paket hiyerarşisinden kavramsal olarak farklı olduğunu unutmayın.

Bu eğitimdeki basit Android uygulaması için src/main/ kaynak dosyaları tek bir Bazel paketinden oluşur. Daha karmaşık bir projede iç içe yerleştirilmiş birçok paket olabilir.

android_library kuralı ekleme

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

Bu eğitimde, Bazel'e uygulama kaynak kodu ve kaynak dosyalarından Android kitaplığı modülü oluşturmasını söylemek için önce android_library kuralını kullanacaksınız. Ardından, Bazel'e Android uygulama paketinin nasıl oluşturulacağını 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 Oluşturma kuralı, Bazel'in kaynak dosyalarından bir kitaplık modülü oluşturmak için ihtiyaç duyduğu bilgileri belirten bir dizi özellik 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ı kullanarak kurala referans vereceksiniz.

android_binary kuralı ekleme

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ışına referans veriyor. Bu, Bazel bu kuralın çıkışını oluşturduğunda ilk olarak greeter_activity kitaplık kuralının çıkışının oluşturulup oluşturulmadığını ve güncel olup olmadığını kontrol ettiği anlamına gelir. Aksi takdirde Bazel, dosyayı oluşturur ve ardından uygulama paketi dosyasını oluşturmak için bu çıktıyı kullanır.

Ş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'e hedefi oluşturmasını söyler. Hedef, BUILD dosyasındaki bir derleme kuralının adı olarak belirtilir. Bu ad, çalışma alanınızın dizinine göre paket yoluyla birlikte kullanılır. Bu örnekte hedef app, paket yolu ise //src/main/'dir.

Komut satırındaki mevcut çalışma dizininize ve hedefin adına bağlı olarak bazen paket yolunu veya hedef adını atlayabileceğinizi unutmayın. Hedef etiketler ve yollar hakkında daha fazla bilgi için Etiketler başlıklı makaleyi inceleyin.

Bazel, örnek uygulamayı derlemeye başlar. Derleme işlemi sırasında çıktısı aşağıdaki gibi 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, hem ara hem de son derleme işlemlerinin çıktılarını kullanıcı başına, çalışma alanı başına bir dizi çıktı dizinine yerleştirir. Bu dizinler, proje dizininin üst düzeyindeki aşağıdaki konumlardan sembolik olarak bağlanır. WORKSPACE şunları ifade eder:

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

Bazel, android_binary kuralı kullanılarak oluşturulan Android .apk dosyasını bazel-bin/src/main dizininde saklar. Burada alt dizin adı src/main, 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 bazel mobile-install komutunu kullanarak uygulamayı 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 Debug Bridge'deki talimatları uygulayarak cihazınızı adb kullanacak şekilde ayarlamanız gerekir. Uygulamayı Android Studio'da bulunan Android emülatörüne de yükleyebilirsiniz. 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

Ardından, "Bazel Tutorial App"i bulup başlatın:

Bazel eğitim uygulaması

Şekil 2. Bazel eğitim uygulaması.

Tebrikler! İlk Bazel ile oluşturulmuş Android uygulamanızı yüklediniz.

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

Ayrıca, uygulamayı yükledikten hemen sonra başlatmak için --start_app işaretini de destekler.

Daha fazla bilgi

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

İyi inşa etmeler!