[Tutorial][Bazel] 211105 Android Bazel Hello World 예제
Bazel 도전기 네번째 시간으로 Bazle 프로젝트를 하나하나 같이 만들어보고 Bazel로 빌드하여 Hello World를 Android App형태로 띄워보는 것이 목표이다.
(1) 프로젝트 준비 - Workspace 만들기
(1-1) 우선 프로젝트 폴더를 만든다.
평소 Android 프로젝트를 만들던 폴더에 새로운 폴더를 만든다.
나는 폴더 명을 “bazel-android-hello-world”로 정했다.
(1-2) CMD로 만들어둔 폴더로 이동해서 WORKSPACE 파일을 만든다. 대소문자에 주의하자.
(1-3) CMD 창에 아래 명령어를 입력한다. 아래 이미지처럼 표시된다면 Bazel 프로젝트를 시작할 준비가 되었다는 뜻이다.
1
bazel info workspace
(2) Android Studio에서 프로젝트 열기
(2-1) Android Studio를 연다.
(2-2) File에서 Import Bazel Porject 버튼을 누른다.
(2-3) … 버튼을 눌러 Workspace 경로를 선택한다.
(2-4) 아까 WORKSPACE 파일을 만들어뒀던 디렉토리로 설정하고 OK 버튼을 누른다.
(2-5) 경로 설정이 완료되었다면 Next 버튼을 누른다.
(2-6) 프로젝트 생성 방법으로는 여러가지가 있지만 이번에는 제일 위에 있는 “Create from scratch”를 선택한다.
(2-7) Finish를 눌러 Bazel 프로젝트 Import를 마무리한다.
(3) WORKSPACE 파일 작성하기
(3-1) WORKSPACE는 간단히 말하면 Bazel의 빌드 규칙을 정하는 문서라고 할 수 있다.
WORKSPACE 파일을 메모장이나 워드패드 등 문서 수정이 가능한 툴로 연다.
(3-2) 빌드 규칙을 아래와 같이 작성하여 저장한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
android_sdk_repository(
name = "androidsdk",
path = "{Android Sdk 경로}",
)
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name = "rules_java",
sha256 = "220b87d8cfabd22d1c6d8e3cdb4249abd4c93dcc152e0667db061fb1b957ee68",
url = "https://github.com/bazelbuild/rules_java/releases/download/0.1.1/rules_java-0.1.1.tar.gz",
)
load("@rules_java//java:repositories.bzl", "rules_java_dependencies", "rules_java_toolchains")
rules_java_dependencies()
rules_java_toolchains()
(4) 프로젝트 구조 만들기
(4-1) WORKSPACE가 있는 폴더에 “app” 폴더를 생성한다.
(4-2) “app” 폴더 안에 “java” 폴더와 “res” 폴더를 생성한다.
(4-3) “java” 폴더 안에는 “com/example/helloworld” 경로를 생성한다.
(4-4) “res” 폴더 안에는 “layout” 폴더를 생성한다.
(5) 소스 코드 작성
(5-1) 아래 코드를 작성한 후 “app/java/com/example/helloworld” 경로 안에 “MainActivity.java”라는 이름으로 저장한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
package com.example.helloworld;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
(5-2) 아래 코드를 작성한 뒤 “app/res/layout” 경로 안에 “activity_main.xml”라는 이름으로 저장한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Hello World!" />
</FrameLayout>
(5-3) 아래 코드를 작성한 뒤 “app” 경로 안에 “AndroidManifest.xml”라는 이름으로 저장한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.helloworld">
<application android:label="Bazel Android Hello World">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-sdk
android:minSdkVersion="21"
android:targetSdkVersion="29" />
</manifest>
(6) BUILD 파일 작성
(6-1) 아래 코드를 작성한 뒤 “app” 경로 안에 “BUILD”라는 이름으로 저장한다. “BUILD” 파일은 빌드 시 타겟을 명시해주는 파일이다.
1
2
3
4
5
6
7
android_binary(
name = "app",
custom_package = "com.example.helloworld",
manifest = "AndroidManifest.xml",
srcs = ["java/com/example/helloworld/MainActivity.java"],
resource_files = glob(["res/**"]),
)
(7) 앱 빌드
(7-1) CMD 창으로 “bazel-android-hello-world” 디렉토리로 이동한다.
(7-2) 아래 명령어로 프로젝트를 빌드한다.
Mediapipe 설치하기를 통해 관련 패키지들을 설치해야 제대로 실행된다.
1
bazel build //app:app
(7-3) 이제 빌드 완료된 앱을 모바일 디바이스에서 실행시킬 차례이다.
아래 명렁어로 모바일 디바이스에 앱을 설치한다.
1
bazel mobile-install //app:app
(7-4) 설치가 완료되면 아래와 같이 모바일 디바이스에 app이 설치된 것을 확인할 수 있고 실행해보면 정상적으로 실행되는 것을 확인할 수 있다.