این آموزش نحوه ساخت یک برنامه اندروید ساده با استفاده از 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 بیشتر را ببینید:
ساختمان مبارک!