این آموزش نحوه ساخت یک برنامه اندروید ساده با استفاده از Bazel را پوشش می دهد.
Bazel از ساخت برنامه های اندروید با استفاده از قوانین اندروید پشتیبانی می کند.
این آموزش برای کاربران ویندوز، macOS و لینوکس در نظر گرفته شده است و نیازی به تجربه در زمینه توسعه اپلیکیشن Bazel یا اندروید ندارد. در این آموزش نیازی به نوشتن کد اندروید ندارید.
چیزی که یاد خواهید گرفت
در این آموزش یاد می گیرید که چگونه:
- با نصب بازل و اندروید استودیو و دانلود نمونه پروژه محیط خود را تنظیم کنید.
- یک فضای کاری Bazel تنظیم کنید که حاوی کد منبع برنامه و یک فایل
WORKSPACEاست که سطح بالای فهرست فضای کاری را مشخص می کند. - فایل
WORKSPACEرا بهروزرسانی کنید تا حاوی ارجاعاتی به وابستگیهای خارجی مورد نیاز، مانند Android SDK باشد. - یک فایل
BUILDایجاد کنید. - برنامه را با Bazel بسازید.
- برنامه را در شبیه ساز اندروید یا دستگاه فیزیکی اجرا و اجرا کنید.
قبل از اینکه شروع کنی
Bazel را نصب کنید
قبل از شروع آموزش، نرم افزار زیر را نصب کنید:
- بازل. برای نصب، دستورالعمل نصب را دنبال کنید.
- اندروید استودیو. برای نصب، مراحل دانلود Android Studio را دنبال کنید. برای دانلود SDK و پیکربندی محیط خود، جادوگر راه اندازی را اجرا کنید.
- (اختیاری) Git. برای دانلود پروژه برنامه اندروید از
gitاستفاده کنید.
نمونه پروژه را دریافت کنید
برای پروژه نمونه، از یک پروژه اصلی برنامه اندروید در مخزن نمونه های Bazel استفاده کنید .
این برنامه دارای یک دکمه است که با کلیک روی آن یک تبریک چاپ می کند:

شکل 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" را پیدا کرده و راه اندازی کنید:

شکل 2. اپلیکیشن آموزش بازل.
تبریک می گویم! شما بهتازگی اولین برنامه اندرویدی ساختهشده بازل خود را نصب کردهاید.
توجه داشته باشید که دستور فرعی mobile-install همچنین از پرچم --incremental -- پشتیبانی میکند که میتواند تنها برای استقرار بخشهایی از برنامه که از آخرین استقرار تغییر کردهاند استفاده شود.
همچنین از پرچم --start_app پشتیبانی می کند تا برنامه بلافاصله پس از نصب آن را راه اندازی کند.
بیشتر خواندن
برای جزئیات بیشتر، این صفحات را ببینید:
- مسائل را در GitHub باز کنید
- اطلاعات بیشتر در مورد نصب موبایل
- ادغام وابستگی های خارجی مانند AppCompat، Guava و JUnit از مخازن Maven با استفاده از rules_jvm_external
- تست های Robolectric را با ادغام robolectric-bazel اجرا کنید.
- آزمایش برنامه خود با تست های ابزار دقیق اندروید
- ادغام کدهای C و C++ در برنامه اندروید خود با NDK
- نمونه پروژه های Bazel بیشتر را ببینید:
ساختمان مبارک!