Bazel Eğitimi: Android Uygulaması Oluşturma

7.3 · 7.2 · 7.1 · 7.0 · 6.5

Not: Android uygulamaları oluşturmak için Bazel'in kullanımıyla ilgili bilinen sınırlamalar vardır. Bilinen sorunların listesini görmek için GitHub'daki 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 kullanılarak basit bir Android uygulamasının nasıl oluşturulacağı açıklanmaktadır.

Bazel, Android kurallarını kullanarak Android uygulamaları oluşturmayı 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 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 ve çalışma alanı dizininin üst düzeyini tanımlayan bir WORKSPACE dosyası içeren bir Bazel çalışma alanı oluşturun.
  • WORKSPACE dosyasını, Android SDK'sı gibi gerekli harici bağımlılıklara referanslar içerecek şekilde güncelleyin.
  • BUILD dosyası oluşturun.
  • Uygulamayı Bazel ile derleyin.
  • Uygulamayı bir Android emülatöründe veya fiziksel cihazda dağıtıp çalıştırın.

Başlamadan önce

Bazel'i yükleme

Eğitime 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 deposunda temel bir Android uygulama projesi kullanın.

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

Düğme karşılama mesajı

Şekil 1. Android uygulama düğmesi 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 adresindedir. 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 derlemek için gereken dış bağımlılıklara 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 çalışıp çalışmadığını şu komutla kontrol edebilirsiniz:

bazel info workspace

Bazel, mevcut dizinin yolunu yazdıysa hazırsınız demektir. WORKSPACE dosyası mevcut değilse aşağıdaki gibi bir hata mesajı görebilirsiniz:

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

Android SDK ile entegrasyon

Bazel'in uygulamayı derlemek için Android SDK derleme araçlarını çalıştırması gerekir. Bu nedenle, Bazel'in bu bilgileri 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 durumda, ANDROID_HOME ortam değişkeninin referans verdiği yoldaki Android SDK'sı kullanılır ve bu konumda yüklü olan derleme araçlarının en yüksek API düzeyi ve en son sürümü otomatik olarak algılanır.

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ği varsayılarak 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. Bu ayarları 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)

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'daki ilgili en son sürümü kullanır. SDK'da bulundukları 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'ta path özelliğinin karma stilli yolu (yani, ters eğik çizgi içeren bir Windows yolu) kullanması gerektiğini unutmayın:

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

İsteğe bağlı: Android uygulamanıza yerel kod derlemek istiyorsanız Android NDK'yı da indirmeniz ve WORKSPACE dosyanıza aşağıdaki satırı ekleyerek Bazel'e nerede bulacağını söylemeniz gerekir:

android_ndk_repository(name = "androidndk")

android_sdk_repository özelliğine benzer şekilde, Android NDK'nın yolu da varsayılan olarak ANDROID_NDK_HOME ortam değişkeninden tahmin edilir. Yol, android_ndk_repository üzerinde path özelliğiyle 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 (ör. Android 6.0 için 23 ve Android 7.1 için 25). Açıkça ayarlanmazsa api_level, android_sdk_repository ve android_ndk_repository için kullanılabilen en yüksek API düzeyine varsayılan olarak ayarlanır.

API düzeylerinin SDK ve NDK için aynı değere ayarlanması gerekmez. Bu sayfada, Android sürümlerinden NDK tarafından desteklenen API düzeylerine giden bir harita yer alır.

BUILD dosyası oluşturma

BUILD dosyası, bir derleme çıkışı kümesi (ör. aapt kaynağından derlenmiş Android kaynakları veya javac ürününden derlenen sınıf dosyaları) ve bunların bağımlılıkları arasındaki ilişkiyi açıklar. Bu bağımlılar, çalışma alanınızdaki kaynak dosyalar (Java, C++) veya diğer derleme çıkış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ın üzerini kaplayan mantıksal bir yapıdır. Her paket, ilgili kaynak dosya kümesi ve bir BUILD dosyası içeren bir dizindir (ve alt dizinleridir). Paket, kendi BUILD dosyasını içerenler hariç tüm alt dizinleri de içerir. Paket adı, WORKSPACE'a göre BUILD dosyasının yoludur.

Bazel'in paket hiyerarşisinin, BUILD dosyasının bulunduğu Android uygulama dizininizin Java paket hiyerarşisindeki kavramsal olarak farklı olduğunu unutmayın. Ancak dizinler aynı şekilde düzenlenmiş olabilir.

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

android_library kuralı ekleme

BUILD dosyası, Bazel için birkaç farklı türde beyan içerir. En önemli tür, Bazel'e bir kaynak dosya grubu veya diğer bağımlılıklardan nasıl bir ara veya nihai yazılım çıkışı oluşturulacağı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 kodundan ve kaynak dosyalarından Android kitaplık modülü oluşturmasını söylemek için önce android_library kuralını kullanacaksınız. Ardından, Bazel'e Android uygulama paketini nasıl oluşturacağı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 derleme kuralı, Bazel'in kaynak dosyalardan 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 bu adı bağımlı olarak kullanarak kurala referans verirsiniz.

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 tanımlayın:

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 verir. Yani Bazel, bu kuralın çıkışını oluştururken önce greeter_activity kitaplık kuralı çıktısının oluşturulup oluşturulmadığını ve güncel olup olmadığını kontrol eder. Aksi takdirde Bazel, derlemeyi yapar ve ardından uygulama paketi dosyasını derlemek için bu çıktıyı kullanır.

Ardından dosyayı kaydedip kapatın.

Uygulamayı oluşturma

Uygulamayı derlemeyi 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 aşağıdaki hedefi derlemesini söyler. Hedef, BUILD dosyasındaki bir derleme kuralının adı olarak belirtilir. Bu adla birlikte, çalışma alanı dizininize göre paket yolu da belirtilir. Bu örnekte hedef app, paket yolu ise //src/main/'dur.

Komut satırındaki mevcut çalışma dizininize ve hedefin adına bağlı olarak bazen paket yolunu veya hedef adını çıkarabileceğ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, çı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 çıkışlarını bulma

Bazel hem ara hem de son derleme işlemlerinin çıkışlarını, kullanıcı ve çalışma alanı başına çıktı dizini grubuna yerleştirir. Bu dizinler, proje dizininin en üst düzeyindeki aşağıdaki konumlardan birbirine bağlıdır. Burada WORKSPACE bulunur:

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

Bazel, android_binary kuralı kullanılarak oluşturulan Android .apk dosyasını bazel-bin/src/main dizininde saklar. Bu dizindeki 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 Hata Ayıklama Köprüsü'ndeki talimatları uygulayarak cihazınızı adb kullanacak şekilde ayarlamanız gerekir. Uygulamayı Android Studio'ya dahil olan Android emülatörüne de yükleyebilirsiniz. Aşağıdaki komutu çalıştırmadan önce emülatörün çalıştığından emin olun.

Aşağıdakileri girin:

bazel mobile-install //src/main:app

Daha sonra, "Bazel Eğitim Uygulaması"nı 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, 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, uygulamayı yüklendikten hemen sonra başlatmak için --start_app işaretini de destekler.

Daha fazla bilgi

Daha fazla bilgi için şu sayfalara göz atın:

İyi çalışmalar.