آموزش بازل: ساخت اپلیکیشن اندروید

این آموزش نحوه ساخت یک برنامه اندروید ساده با استفاده از Bazel را پوشش می دهد.

Bazel از ساخت برنامه های اندروید با استفاده از قوانین اندروید پشتیبانی می کند.

این آموزش برای کاربران ویندوز، macOS و لینوکس در نظر گرفته شده است و نیازی به تجربه در زمینه توسعه اپلیکیشن Bazel یا اندروید ندارد. در این آموزش نیازی به نوشتن کد اندروید ندارید.

چیزی که یاد خواهید گرفت

در این آموزش یاد می گیرید که چگونه:

  • با نصب بازل و اندروید استودیو و دانلود نمونه پروژه محیط خود را تنظیم کنید.
  • یک فضای کاری Bazel تنظیم کنید که حاوی کد منبع برنامه و یک فایل WORKSPACE است که سطح بالای فهرست فضای کاری را مشخص می کند.
  • فایل WORKSPACE را به‌روزرسانی کنید تا حاوی ارجاعاتی به وابستگی‌های خارجی مورد نیاز، مانند Android SDK باشد.
  • یک فایل BUILD ایجاد کنید.
  • برنامه را با Bazel بسازید.
  • برنامه را در شبیه ساز اندروید یا دستگاه فیزیکی اجرا و اجرا کنید.

قبل از اینکه شروع کنی

Bazel را نصب کنید

قبل از شروع آموزش، نرم افزار زیر را نصب کنید:

  • بازل. برای نصب، دستورالعمل نصب را دنبال کنید.
  • اندروید استودیو. برای نصب، مراحل دانلود Android Studio را دنبال کنید. برای دانلود SDK و پیکربندی محیط خود، جادوگر راه اندازی را اجرا کنید.
  • (اختیاری) Git. برای دانلود پروژه برنامه اندروید از git استفاده کنید.

نمونه پروژه را دریافت کنید

برای پروژه نمونه، از یک پروژه اصلی برنامه اندروید در مخزن نمونه های Bazel استفاده کنید .

این برنامه دارای یک دکمه است که با کلیک روی آن یک تبریک چاپ می کند:

Button greeting

شکل 1. تبریک دکمه برنامه اندروید.

مخزن را با git کلون کنید (یا فایل ZIP را مستقیما دانلود کنید ):

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

نمونه پروژه این آموزش در examples/android/tutorial است. برای بقیه آموزش، دستورات را در این دایرکتوری اجرا خواهید کرد.

فایل های منبع را بررسی کنید

به فایل های منبع برنامه نگاهی بیندازید.

.
├── 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

فایل ها و دایرکتوری های کلیدی عبارتند از:

نام محل
فایل های مانیفست اندروید src/main/AndroidManifest.xml و src/main/java/com/example/bazel/AndroidManifest.xml
فایل های منبع اندروید src/main/java/com/example/bazel/MainActivity.java و Greeter.java
دایرکتوری فایل منبع src/main/java/com/example/bazel/res/

ساخت با بازل

فضای کاری را تنظیم کنید

فضای کاری دایرکتوری است که حاوی فایل های منبع یک یا چند پروژه نرم افزاری است و یک فایل WORKSPACE در ریشه خود دارد.

فایل WORKSPACE ممکن است خالی باشد یا ممکن است حاوی ارجاعاتی به وابستگی های خارجی مورد نیاز برای ساخت پروژه شما باشد.

ابتدا دستور زیر را برای ایجاد یک فایل WORKSPACE خالی اجرا کنید:

سیستم عامل فرمان
لینوکس، macOS touch WORKSPACE
ویندوز (Command Prompt) type nul > WORKSPACE
ویندوز (PowerShell) New-Item WORKSPACE -ItemType file

در حال اجرا بازل

اکنون می توانید با دستور زیر بررسی کنید که آیا Bazel به درستی اجرا می شود:

bazel info workspace

اگر Bazel مسیر دایرکتوری فعلی را چاپ کند، شما خوب هستید! اگر فایل WORKSPACE وجود نداشته باشد، ممکن است یک پیام خطایی مانند:

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

با Android SDK یکپارچه شوید

Bazel برای ساخت برنامه باید ابزارهای ساخت Android SDK را اجرا کند. این بدان معنی است که شما باید اطلاعاتی را به فایل WORKSPACE خود اضافه کنید تا بازل بداند کجا آنها را پیدا کند.

خط زیر را به فایل WORKSPACE خود اضافه کنید:

android_sdk_repository(name = "androidsdk")

این از Android SDK در مسیری که متغیر محیطی ANDROID_HOME به آن اشاره می کند استفاده می کند و به طور خودکار بالاترین سطح API و آخرین نسخه ابزارهای ساخت نصب شده در آن مکان را شناسایی می کند.

می توانید متغیر ANDROID_HOME را روی مکان Android SDK تنظیم کنید. با استفاده از Android Studio's SDK Manager مسیر SDK نصب شده را پیدا کنید. با فرض اینکه SDK در مکان های پیش فرض نصب شده است، می توانید از دستورات زیر برای تنظیم متغیر ANDROID_HOME استفاده کنید:

سیستم عامل فرمان
لینوکس export ANDROID_HOME=$HOME/Android/Sdk/
سیستم عامل مک export ANDROID_HOME=$HOME/Library/Android/sdk
ویندوز (Command Prompt) set ANDROID_HOME=%LOCALAPPDATA%\Android\Sdk
ویندوز (PowerShell) $env:ANDROID_HOME="$env:LOCALAPPDATA\Android\Sdk"

دستورات بالا متغیر را فقط برای جلسه پوسته فعلی تنظیم می کند. برای دائمی کردن آنها، دستورات زیر را اجرا کنید:

سیستم عامل فرمان
لینوکس echo "export ANDROID_HOME=$HOME/Android/Sdk/" >> ~/.bashrc
سیستم عامل مک echo "export ANDROID_HOME=$HOME/Library/Android/Sdk/" >> ~/.bashrc
ویندوز (Command Prompt) setx ANDROID_HOME "%LOCALAPPDATA%\Android\Sdk"
ویندوز (PowerShell) [System.Environment]::SetEnvironmentVariable('ANDROID_HOME', "$env:LOCALAPPDATA\Android\Sdk", [System.EnvironmentVariableTarget]::User)

همچنین می‌توانید به صراحت مسیر مطلق Android SDK، سطح API و نسخه ابزارهای ساخت را با گنجاندن ویژگی‌های path ، api_level و build_tools_version مشخص کنید. اگر api_level و build_tools_version مشخص نشده باشند، قانون android_sdk_repository از آخرین نسخه مربوطه موجود در SDK استفاده خواهد کرد. شما می توانید هر ترکیبی از این ویژگی ها را مشخص کنید، تا زمانی که در SDK وجود داشته باشند، به عنوان مثال:

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

در ویندوز، توجه داشته باشید که ویژگی path باید از مسیر mixed-style استفاده کند، یعنی یک مسیر ویندوز با اسلش های جلو:

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

اختیاری: اگر می‌خواهید کد بومی را در برنامه Android خود کامپایل کنید، باید Android NDK را دانلود کنید و با افزودن خط زیر به فایل WORKSPACE به Bazel بگویید آن را کجا پیدا کند:

android_ndk_repository(name = "androidndk")

مشابه android_sdk_repository ، مسیر Android NDK به طور پیش‌فرض از متغیر محیطی ANDROID_NDK_HOME استنباط می‌شود. مسیر را می‌توان به صراحت با یک ویژگی path در android_ndk_repository مشخص کرد.

برای اطلاعات بیشتر، استفاده از کیت توسعه اندروید بومی با Bazel را بخوانید.

api_level نسخه ای از API Android است که SDK و NDK آن را هدف قرار می دهند - به عنوان مثال، 23 برای Android 6.0 و 25 برای Android 7.1. اگر به صراحت تنظیم نشده باشد، api_level به طور پیش‌فرض روی بالاترین سطح API موجود برای android_sdk_repository و android_ndk_repository قرار می‌گیرد.

لازم نیست سطوح API را برای SDK و NDK روی یک مقدار تنظیم کنید. این صفحه حاوی نقشه‌ای از نسخه‌های Android تا سطوح API با پشتیبانی NDK است.

یک فایل BUILD ایجاد کنید

یک فایل BUILD رابطه بین مجموعه‌ای از خروجی‌های ساخت، مانند منابع Android کامپایل‌شده از aapt یا فایل‌های کلاس از javac و وابستگی‌های آنها را توضیح می‌دهد. این وابستگی ها ممکن است فایل های منبع (جاوا، C++) در فضای کاری شما یا سایر خروجی های ساخت باشند. فایل های BUILD به زبانی به نام Starlark نوشته می شوند.

فایل های BUILD بخشی از مفهومی در Bazel هستند که به عنوان سلسله مراتب بسته شناخته می شود. سلسله مراتب بسته یک ساختار منطقی است که ساختار دایرکتوری را در فضای کاری شما پوشش می دهد. هر بسته یک دایرکتوری (و زیر شاخه های آن) است که شامل مجموعه ای مرتبط از فایل های منبع و یک فایل BUILD است. این بسته همچنین شامل هر زیر شاخه ای است، به استثنای آنهایی که حاوی فایل BUILD خود هستند. نام بسته مسیر فایل BUILD نسبت به WORKSPACE است.

توجه داشته باشید که سلسله مراتب بسته Bazel از نظر مفهومی با سلسله مراتب بسته جاوا دایرکتوری برنامه Android شما که فایل BUILD در آن قرار دارد متفاوت است، اگرچه ممکن است فهرست ها به طور یکسان سازماندهی شوند.

برای برنامه ساده اندروید در این آموزش، فایل های منبع در src/main/ از یک بسته Bazel تشکیل شده است. یک پروژه پیچیده تر ممکن است بسته های تودرتو زیادی داشته باشد.

یک قانون android_library اضافه کنید

یک فایل BUILD شامل چندین نوع مختلف اعلان برای Bazel است. مهم‌ترین نوع، قانون ساخت است که به Bazel می‌گوید چگونه یک خروجی نرم‌افزار میانی یا نهایی را از مجموعه‌ای از فایل‌های منبع یا وابستگی‌های دیگر بسازد. Bazel دو قانون ساخت، android_library و android_binary ارائه می‌کند که می‌توانید از آن‌ها برای ساخت برنامه اندروید استفاده کنید.

برای این آموزش، ابتدا از قانون android_library استفاده می‌کنید تا به Bazel بگویید ماژول کتابخانه اندروید را از کد منبع برنامه و فایل‌های منبع بسازد. سپس از قانون android_binary استفاده می کنید تا به Bazel بگویید چگونه بسته برنامه اندروید را بسازد.

یک فایل BUILD جدید در دایرکتوری src/main/java/com/example/bazel ایجاد کنید و یک هدف جدید android_library را اعلام کنید:

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 شامل مجموعه‌ای از ویژگی‌ها است که اطلاعاتی را که Bazel برای ساخت ماژول کتابخانه از فایل‌های منبع نیاز دارد، مشخص می‌کند. همچنین توجه داشته باشید که نام قانون greeter_activity است. شما با استفاده از این نام به عنوان یک وابستگی در قانون android_binary به قانون ارجاع خواهید داد.

یک قانون android_binary اضافه کنید

قانون android_binary بسته برنامه Android (فایل .apk .) را برای برنامه شما می سازد.

یک فایل BUILD جدید در دایرکتوری src/main/ ایجاد کنید و یک هدف جدید android_binary را اعلام کنید:

src/main/BUILD :

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

در اینجا، ویژگی deps به خروجی قانون greeter_activity که به فایل BUILD در بالا اضافه کرده‌اید اشاره می‌کند. این بدان معناست که وقتی Bazel خروجی این قانون را می‌سازد، ابتدا بررسی می‌کند که آیا خروجی قانون کتابخانه greeter_activity ساخته شده و به‌روز است یا خیر. اگر نه، Bazel آن را می سازد و سپس از آن خروجی برای ساخت فایل بسته برنامه استفاده می کند.

حالا فایل را ذخیره کرده و ببندید.

اپلیکیشن را بسازید

سعی کنید برنامه را بسازید! دستور زیر را برای ساخت هدف android_binary اجرا کنید:

bazel build //src/main:app

دستور فرعی build به Bazel دستور می دهد تا هدف زیر را بسازد. هدف به عنوان نام یک قانون ساخت داخل یک فایل BUILD به همراه مسیر بسته نسبت به دایرکتوری فضای کاری شما مشخص می شود. برای این مثال، هدف app و مسیر بسته //src/main/ است.

توجه داشته باشید که بسته به فهرست کاری فعلی خود در خط فرمان و نام هدف، گاهی اوقات می توانید مسیر بسته یا نام هدف را حذف کنید. برای جزئیات بیشتر درباره برچسب‌ها و مسیرهای هدف، به برچسب‌ها مراجعه کنید.

Bazel شروع به ساختن برنامه نمونه می کند. در طول فرآیند ساخت، خروجی آن مشابه موارد زیر ظاهر می شود:

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

خروجی های ساخت را پیدا کنید

Bazel خروجی های عملیات ساخت میانی و نهایی را در مجموعه ای از فهرست های خروجی برای هر کاربر، هر فضای کاری قرار می دهد. این دایرکتوری ها از مکان های زیر در سطح بالای دایرکتوری پروژه، جایی که WORKSPACE است، به صورت نمادین پیوند داده شده اند:

  • bazel-bin فایل های اجرایی باینری و سایر خروجی های ساخت قابل اجرا را ذخیره می کند
  • bazel-genfiles فایل های منبع واسطه ای را که توسط قوانین Bazel تولید می شوند ذخیره می کند
  • bazel-out انواع دیگری از خروجی های ساخت را ذخیره می کند

Bazel فایل .apk Android تولید شده با استفاده از قانون android_binary را در دایرکتوری bazel-bin/src/main ذخیره می کند، جایی که نام زیر شاخه src/main از نام بسته Bazel مشتق شده است.

در یک خط فرمان، محتویات این فهرست را فهرست کنید و فایل app.apk را پیدا کنید:

سیستم عامل فرمان
لینوکس، macOS ls bazel-bin/src/main
ویندوز (Command Prompt) dir bazel-bin\src\main
ویندوز (PowerShell) ls bazel-bin\src\main

برنامه را اجرا کنید

اکنون می‌توانید با استفاده از دستور bazel mobile-install ، برنامه را از طریق خط فرمان روی دستگاه یا شبیه‌ساز اندروید متصل اجرا کنید. این دستور از Android Debug Bridge ( adb ) برای برقراری ارتباط با دستگاه استفاده می کند. قبل از استقرار باید دستگاه خود را طوری تنظیم کنید که از adb پیروی از دستورالعمل های موجود در Android Debug Bridge استفاده کند. همچنین می‌توانید برنامه را روی شبیه‌ساز اندروید موجود در Android Studio نصب کنید. قبل از اجرای دستور زیر مطمئن شوید که شبیه ساز در حال اجرا است.

زیر را وارد کنید:

bazel mobile-install //src/main:app

در مرحله بعد، "برنامه آموزشی Bazel" را پیدا کرده و راه اندازی کنید:

Bazel tutorial app

شکل 2. اپلیکیشن آموزش بازل.

تبریک می گویم! شما به‌تازگی اولین برنامه اندرویدی ساخته‌شده بازل خود را نصب کرده‌اید.

توجه داشته باشید که دستور فرعی mobile-install همچنین از پرچم --incremental -- پشتیبانی می‌کند که می‌تواند تنها برای استقرار بخش‌هایی از برنامه که از آخرین استقرار تغییر کرده‌اند استفاده شود.

همچنین از پرچم --start_app پشتیبانی می کند تا برنامه بلافاصله پس از نصب آن را راه اندازی کند.

بیشتر خواندن

برای جزئیات بیشتر، این صفحات را ببینید:

ساختمان مبارک!