[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
SlideShare a Scribd company logo
gradleでビルドする
Android NDKアプリ
About me
Hideyuki Kikuma
Android engineer
mixi,inc
@hidey
今日話すこと
● gradleでビルドしようとした時に困った話
● それをなんとか解決した話
● 今後のNDK周りの話
NDK使ってますか?
Android plugin for Gradleの今
● ちょっとしたものならこん
な感じでOK
● AndroidStudioでブレイクポ
イントも仕込める
android {
defaultConfig {
ndk {
moduleName "modulename"
stl "gnustl_shared"
abiFilters "armeabi-v7a", "x86"
ldLibs "log"
}
}
}
Android.mkが必要なパターン
LOCAL_LDLIBSを使ってる
ソースファイルのディレクトリ構造ががが…
Android.mkの中でマクロで色々切り替えしてる
Android.mkが黒魔術過ぎて移行できない
よくあるサンプル
ndk-buildコマンドを
実行するタスクを作成
してJavaCompile実行
前に実行されるように
する
tasks.withType(JavaCompile) {
compileTask ->
compileTask.dependsOn ndkBuild
}
task ndkBuild(type: Exec) {
commandLine "${ndkHome}ndk-
build"
}
困ったこと
デバッグビルドが出来ない
デバッグビルド時はNDK部分もデバッグオプ
ションをつけてビルドしたい
build type毎にndk-buildのオプションを変えた
い!
どうしたか
applicationVariants
を使って必要な
taskを作成
android.applicationVariants.all { variant ->
def variantName = variant.name.capitalize()
task "nativeBuild${variantName}"(type: Exec, description: "ndk
build task for ${variantName}") {
def options = [... ]
options.addAll(ndkBuildTypeConfigs.get(variant.buildType.name))
variant.productFlavors.each { productFlavor ->
options.addAll(ndkFlavorConfigs.get(productFlavor.name))
}
}
List buildCommand = ["${ndkDir}/ndk-build",]
buildCommand.addAll(options)
commandLine buildCommand
}
何してんの?
variant.nameで名前を取得
devFreeDebugのようなものが取れ
る
それを使ってタスクを作る
commandLineでコマンド実行した
いのでtypeはExecにしておく
def variantName =
variant.name.capitalize()
task
"nativeBuild${variantName}"(type:
Exec) {
}
何してんの?
buildTypeに対応するパラメータの
リストを定義しておく
それを取得してパラメータリストに
加える
これでreleaseとdebugに別々のパラ
メータを渡してbuildできるようにな
った
Map ndkBuildTypeConfigs = [
debug : ['_DEBUG=1', 'V=1'],
release: ['RELEASE=1'],
]
def typeOption =
ndkBuildTypeConfigs.get(variant.buil
dType.name)
if (typeOption != null) {
options.addAll(typeOption)
}
ついでに
flavorごとにも同じことができるよ
うにしておく variant.productFlavors.each
{ productFlavor ->
def flavorOption =
ndkFlavorConfigs.get(productFlavor.
name)
if (flavorOption != null) {
options.addAll(flavorOption)
}
}
dependsOn
buildタスクで実行されるように既存
のタスクに依存を追加する
compileJavaに追加してるが実際は
正しくbuildできればどこでもいい
tasks.withType(JavaCompile)
{ compileTask ->
if (compileTask.name ==
"compile${variantName}Java") {
compileTask.dependsOn
"nativeBuild${variantName}"
}
}
デバッグbuildしようと思ったら
いつの間にかProductFravorsの仕様とかを調べ
まくることに
目的に対しては正直オーバースペック
build周りで困ったら
● gradleの公式ドキュメントを読む
● android pluginのドキュメントを読む
● --dry-runで実際に実行されるtaskを調べる
● build/ 以下に出力されるファイルを眺めてみ
る
android-plugin 1.3?
experimentalで実装が進んでいたndk用のDSL
周りが入ってきた
全部をexperimental-pluginに変える以外だとう
まく使えなかった
誰か使えてる人いたら教えて下さい
まとめ
● ProductFlavorsはめちゃめちゃ便利
○ 用法用量は守って使いましょう
● NDK部分もデバッグビルドしよう
● 今すぐ必要じゃないならplugin待ちもあり
Q&A
ご静聴ありがとうございました

More Related Content

Gradleでビルドするandroid NDKアプリ