BuckでのAndroidプロジェクトのビルドについて

概要

Facebook製ビルドツールBuckをインストールし、サンプルとして公開されているAndroidプロジェクトをビルドしてみます。

Buck?

BuckはFacebookが開発しているビルドツールです。

buckbuild.com

公式サイトではBuckの特徴が解説されています。ビルドが高速なのが売りなようです。

  • Speed up your builds.
    • Buck builds independent artifacts in parallel to take advantage of multiple cores on your machine. Further, it reduces incremental build times by keeping track of unchanged modules so that the minimal set of modules is rebuilt.
  • Add reproducibility to your builds
    • Buck only uses the declared inputs, which means everybody gets the same results.
  • Get correct incremental builds
    • Buck looks at the contents of your inputs, not their timestamps to figure out what needs to be built. As a result, incremental builds should always be correct, so there’s no need to perform a clean build.
  • Understand your dependencies
    • With buck query, you can better understand your dependencies and what is required to build your product.
  • Integrate with your IDE
    • With buck project, your project can be better understood by your IDE, making you and your team more productive.

Buckの開発はCopyrightを見る限り2013年から行われているようですね。「buck facebook」で検索すると以下のような記事がみつかります。

Buckのインストール

Getting Startedを参考に進めます。最初にPlatformに「Android」、Development OSに「macOS」を選択します。

f:id:horie1024:20170205142025p:plain

事前準備

Command Line ToolsJava Runtimeがインストールされていないならインストールしておきます。

  • Command Line Tools
xcode-select --install

Homebrewを使う場合以下のようにします。

brew update
brew tap caskroom/cask
brew install java

Buckのインストール

Homebrewでインストールします。

brew update
brew tap facebook/fb
brew install buck

インストールできました。

buck --version
buck version v2016.11.11.01

また、最新のコードを入手してローカルでビルドすることもできます。

brew update
brew tap facebook/fb
brew install --HEAD buck

ソースコードからのビルド

ソースコードからビルドする場合、Getting StartedのBuild from Sourceを参考にしてください。

BuckでAndroidプロジェクトをビルド

fbsamples/bucksamplesをcloneします。

git clone git@github.com:fbsamples/bucksamples.git
cd bucksamples/cross-platform-scale-2015-demo/

サンプルAndroidプロジェクトでキーとなるファイル

サンプルにはBuckでAndroidプロジェクトをビルドするために必要な全てのファイルが含まれています。プロジェクトのrootからみて

  • android/java/com/facebook/buck/demo/以下には必要なJavaファイルが含まれています。
  • android/BUCKはBuckのビルドに関するルールが書かれたファイルになります。コードに関する全てのビルドルールはこのファイルに記述します。ビルドルールには依存関係を含むことができ、サンプルでは他のビルドファイルへの依存を記述しています。
  • .buckconfigはBuckの設定ファイルです。プロジェクトのrootディレクトリに配置することでプロジェクト毎に異なる設定を有効にできます。

Androidプロジェクトのビルド

BuckでAndroidプロジェクトのビルドをビルドします。

buck build demo_app_android
[-] PROCESSING BUCK FILES...FINISHED 0.2s [100%] 🐳  New buck daemon
[-] DOWNLOADING... (0.00 B/S AVG, TOTAL: 0.00 B, 0 Artifacts)
[-] BUILDING...FINISHED 0.8s [100%] (1/1 JOBS, 0 UPDATED, 0 [0.0%] CACHE MISS)

ビルド成果物はbuck-out/ディレクトリに出力されます。

Androidプロジェクトのビルドと端末での実行

buck install --runでAPKをビルドし端末にインストールします。

buck install --run demo_app_android
Installing apk on 07fbdfee01298e26 (Nexus 5).
[-] PROCESSING BUCK FILES...FINISHED 0.0s 🐇
[-] DOWNLOADING... (0.00 B/S AVG, TOTAL: 0.00 B, 0 Artifacts)
[-] BUILDING...FINISHED 0.0s [100%] (1/1 JOBS, 0 UPDATED, 0 [0.0%] CACHE MISS)
[+] INSTALLING...1.7s
Successfully ran install apk //android:demo-app on 1 device(s)
Starting activity com.facebook.buck.demo/.App...
Successfully ran start activity on 1 device(s)

感想

  • サンプロプロジェクトだけだとAndroidプロジェクトのビルドについてあまり理解できない
  • Android用のビルドルールがいくつか用意されいているので見てみると良さそう
  • ビルドルールの書き方がBazelに似ている

次はokbuckAndroidプロジェクトをビルドしてみます。

参考

React NativeプロジェクトでFlowのよる型チェックが「Flow: Waitng for diagnostics」と表示され実行されない場合の対処方法

概要

React NativeのプロジェクトをReact Native CLIで新規作成し、Nuclideで開発を始めると以下のように「Flow: Waitng for diagnostics」と表示されFlowによる型チェックが実行されませんでした。

f:id:horie1024:20170202130724p:plain

この記事は型チェックが正常に動くまで行ったことのメモです。

続きを読む

s3からのファイルの取得

AWS SDKを使いs3からファイルを取得する方法についてメモ

require 'aws-sdk-core'

Aws.config[:region] = 'ap-northeast-1'
s3 = Aws::S3::Client.new(
    access_key_id:  ACCESS_KEY_ID,
    secret_access_key: SECRET_ACCESS_KEY
)

File.open('保存時のファイル名', 'w') do |file|
  s3.get_object({bucket: 'バケット名', key:'取得したいファイル名'}, target: file)
end

環境変数AWS_REGIONAWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYを定義している場合initializeは

s3 = Aws::S3::Client.new

でOK。

GoogleMapのMapFragmentを取得した際にNullPointerExceptionが発生する場合の対処方法

概要

以下のようなコードでGoogleMapを表示しようとしたところNullPointerExceptionが発生した。

GoogleMap googleMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
UiSettings uiSettings = googleMap.getUiSettings();
uiSettings.setZoomGesturesEnabled(true);
uiSettings.setScrollGesturesEnabled(true);
・
・
・

解決方法

OnMapReadyCallbackinterfaceを実装することで解決できた。

SupportMapFragment mapFragment = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map));
mapFragment.getMapAsync(new OnMapReadyCallback() {
    @Override
    public void onMapReady(GoogleMap googleMap) {
        UiSettings uiSettings = googleMap.getUiSettings();
        uiSettings.setZoomGesturesEnabled(true);
        uiSettings.setScrollGesturesEnabled(true);
        ・
        ・
        ・
    }
});

KotlinでAndroidアプリをビルドしてみる

最近Kotlinの話題を聞く事が多くなってきたので、Kotlinでプロジェクトを作成し、HelloWorldアプリをビルドするところまでやってみる。

公式サイトを見ながら環境を構築していく。

Kotlin Pluginのインストール

IntelliJ IDEA 15は最初からKotlin Pluginが入ってるらしい。バージョン15以前かAndroid Studioの場合、手動でKotlin Pluginをインストールする。

Androidプロジェクトの作成

AndroidプロジェクトでKotlinを使用するチュートリアルがあるので、それを見ながら進めてみる。

Getting started with Android and Kotlin

まず、通常のAndroidアプリと同様にプロジェクトを作成する。

f:id:horie1024:20151203011947p:plain

MainActivityを選択し、Find ActionをShortcutで開き Convert Java File to Kotlin Fileを実行する。ダイアログが表示されるが、cancelを取り敢えず選んだ。

f:id:horie1024:20151203012014p:plain

JavaのコードがKotlinのコードに変換された!

f:id:horie1024:20151203012108p:plain

見づらいので拡大。ラムダ式すばらしい。

f:id:horie1024:20151203012120p:plain

Kotlinの設定

プロジェクトにKotlinの設定を追加する。再びFind ActionをShortcutで開き Configure Kotlin in the projectを実行する。すると以下のダイアログが表示されるので、OKをクリックする。

f:id:horie1024:20151203012155p:plain

自動的にbuild.gradleが更新され、Kotlinの設定が追加されるので、Syncを実行しておく。

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'

android {…}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}
buildscript {
    ext.kotlin_version = '1.0.0-beta-2423'
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}
repositories {
    mavenCentral()
}

ビルド

通常のAndroid開発と同じようにビルドし、アプリを端末で立ち上げたが特に問題は無かった。

f:id:horie1024:20151203012233p:plain

まとめ

Kotlinでサンプルアプリを作成し、HelloWorldを表示するまでやってみたが、特につまづく事なくKotlinを導入できてとも良かった。少しづつKotlinでアプリを書いてみようと思う。

参考