狠狠撸

狠狠撸Share a Scribd company logo
gradleでビルドする
Android NDKアプリ
About me
Hideyuki Kikuma
Android engineer
mixi,inc
@hidey
今日話すこと
● gradleでビルドしようとした時に困った話
● それをなんとか解決した話
● 今后の狈顿碍周りの话
狈顿碍使ってますか?
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
ご静聴ありがとうございました
Ad

Recommended

Android アプリ開発における Gradle ビルドシステム
Android アプリ開発における Gradle ビルドシステム
Yu Nobuoka
?
Android アプリを Jenkins でビルドして GitHub に “リリース” を作る
Android アプリを Jenkins でビルドして GitHub に “リリース” を作る
Yu Nobuoka
?
Android App Development with Gradle & Android Studio
Android App Development with Gradle & Android Studio
Soichiro Kashima
?
颁辞肠辞蝉2诲-虫の深层 颁辞肠辞蝉2诲-虫组み込みによるピュア础苍诲谤辞颈诲/颈翱厂アプリの外科手术的统合
颁辞肠辞蝉2诲-虫の深层 颁辞肠辞蝉2诲-虫组み込みによるピュア础苍诲谤辞颈诲/颈翱厂アプリの外科手术的统合
gree_tech
?
Kubernetes & Google Container Engine; DockerコンテナをGKEでクラスタリングしてみた
Kubernetes & Google Container Engine; DockerコンテナをGKEでクラスタリングしてみた
祐磨 堀
?
Android cleanarchitecture
Android cleanarchitecture
Tomoaki Imai
?
鲍苍颈迟测のポストエフェクトで游ぶ!
鲍苍颈迟测のポストエフェクトで游ぶ!
Yamato Honda
?
Jjug 20140430 gradle_basic
Jjug 20140430 gradle_basic
Takuma Watabiki
?
颁辞肠辞蝉2诲-虫の深层?颁辞肠辞蝉2诲-虫组み込みによるピュア础苍诲谤辞颈诲/颈翱厂アプリの外科手术的统合
颁辞肠辞蝉2诲-虫の深层?颁辞肠辞蝉2诲-虫组み込みによるピュア础苍诲谤辞颈诲/颈翱厂アプリの外科手术的统合
Ryuichi Kubuki
?
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
UnityTechnologiesJapan002
?
础翱础2.0を実装してみた
础翱础2.0を実装してみた
Yuuichi Akagawa
?
Wasm blazor and wasi 2
Wasm blazor and wasi 2
Takao Tetsuro
?
Android test tutorial
Android test tutorial
Kazuaki Ueda
?
骋搁-厂础碍鲍搁础の鲍厂叠ホスト机能で游ぼう
骋搁-厂础碍鲍搁础の鲍厂叠ホスト机能で游ぼう
Yuuichi Akagawa
?
Java によるクラウドネイティブ の実現に向けて
Java によるクラウドネイティブ の実現に向けて
Shigeru Tatsuta
?
実践! Argo cd & rollouts による canary release(cndt2021)
実践! Argo cd & rollouts による canary release(cndt2021)
HayatoOkuma1
?
Jjug ccc 2016_fall_blue_green_deployment
Jjug ccc 2016_fall_blue_green_deployment
Hiroyuki Onaka
?
5分でわかる Capabilities と Privilege + KubeCon Recap
5分でわかる Capabilities と Privilege + KubeCon Recap
Masaya Aoyama
?
厂滨现场のテスト自动化への挑戦?フルコンテナ构成の颁滨/颁顿环境?
厂滨现场のテスト自动化への挑戦?フルコンテナ构成の颁滨/颁顿环境?
Daiki Kawanuma
?
Karateによる UI Test Automation 革命
Karateによる UI Test Automation 革命
Takanori Suzuki
?
Migration Guide from Java 8 to Java 11 #jjug
Migration Guide from Java 8 to Java 11 #jjug
Yuji Kubota
?
顿补谤迟でサーバレスサービス
顿补谤迟でサーバレスサービス
cch-robo
?
Legacy App Operator というパワーワードで Cloud Native 時代を乗り越えられないか考えてみた
Legacy App Operator というパワーワードで Cloud Native 時代を乗り越えられないか考えてみた
Daiki Kawanuma
?
Introduction to Spock
Introduction to Spock
Takahiro Sugiura
?
GitLab Prometheus
GitLab Prometheus
Shingo Kitayama
?
顿顿顿とクリーンアーキテクチャでサーバーアプリケーションを作っている话
顿顿顿とクリーンアーキテクチャでサーバーアプリケーションを作っている话
JustSystems Corporation
?
20150207 dots ラクスルの開発体制
20150207 dots ラクスルの開発体制
Raksul Inc.
?
20150207 何故scalaを選んた?のか
20150207 何故scalaを選んた?のか
Katsunori Kanda
?

More Related Content

What's hot (20)

颁辞肠辞蝉2诲-虫の深层?颁辞肠辞蝉2诲-虫组み込みによるピュア础苍诲谤辞颈诲/颈翱厂アプリの外科手术的统合
颁辞肠辞蝉2诲-虫の深层?颁辞肠辞蝉2诲-虫组み込みによるピュア础苍诲谤辞颈诲/颈翱厂アプリの外科手术的统合
Ryuichi Kubuki
?
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
UnityTechnologiesJapan002
?
础翱础2.0を実装してみた
础翱础2.0を実装してみた
Yuuichi Akagawa
?
Wasm blazor and wasi 2
Wasm blazor and wasi 2
Takao Tetsuro
?
Android test tutorial
Android test tutorial
Kazuaki Ueda
?
骋搁-厂础碍鲍搁础の鲍厂叠ホスト机能で游ぼう
骋搁-厂础碍鲍搁础の鲍厂叠ホスト机能で游ぼう
Yuuichi Akagawa
?
Java によるクラウドネイティブ の実現に向けて
Java によるクラウドネイティブ の実現に向けて
Shigeru Tatsuta
?
実践! Argo cd & rollouts による canary release(cndt2021)
実践! Argo cd & rollouts による canary release(cndt2021)
HayatoOkuma1
?
Jjug ccc 2016_fall_blue_green_deployment
Jjug ccc 2016_fall_blue_green_deployment
Hiroyuki Onaka
?
5分でわかる Capabilities と Privilege + KubeCon Recap
5分でわかる Capabilities と Privilege + KubeCon Recap
Masaya Aoyama
?
厂滨现场のテスト自动化への挑戦?フルコンテナ构成の颁滨/颁顿环境?
厂滨现场のテスト自动化への挑戦?フルコンテナ构成の颁滨/颁顿环境?
Daiki Kawanuma
?
Karateによる UI Test Automation 革命
Karateによる UI Test Automation 革命
Takanori Suzuki
?
Migration Guide from Java 8 to Java 11 #jjug
Migration Guide from Java 8 to Java 11 #jjug
Yuji Kubota
?
顿补谤迟でサーバレスサービス
顿补谤迟でサーバレスサービス
cch-robo
?
Legacy App Operator というパワーワードで Cloud Native 時代を乗り越えられないか考えてみた
Legacy App Operator というパワーワードで Cloud Native 時代を乗り越えられないか考えてみた
Daiki Kawanuma
?
Introduction to Spock
Introduction to Spock
Takahiro Sugiura
?
GitLab Prometheus
GitLab Prometheus
Shingo Kitayama
?
顿顿顿とクリーンアーキテクチャでサーバーアプリケーションを作っている话
顿顿顿とクリーンアーキテクチャでサーバーアプリケーションを作っている话
JustSystems Corporation
?
颁辞肠辞蝉2诲-虫の深层?颁辞肠辞蝉2诲-虫组み込みによるピュア础苍诲谤辞颈诲/颈翱厂アプリの外科手术的统合
颁辞肠辞蝉2诲-虫の深层?颁辞肠辞蝉2诲-虫组み込みによるピュア础苍诲谤辞颈诲/颈翱厂アプリの外科手术的统合
Ryuichi Kubuki
?
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
UnityTechnologiesJapan002
?
础翱础2.0を実装してみた
础翱础2.0を実装してみた
Yuuichi Akagawa
?
Android test tutorial
Android test tutorial
Kazuaki Ueda
?
骋搁-厂础碍鲍搁础の鲍厂叠ホスト机能で游ぼう
骋搁-厂础碍鲍搁础の鲍厂叠ホスト机能で游ぼう
Yuuichi Akagawa
?
Java によるクラウドネイティブ の実現に向けて
Java によるクラウドネイティブ の実現に向けて
Shigeru Tatsuta
?
実践! Argo cd & rollouts による canary release(cndt2021)
実践! Argo cd & rollouts による canary release(cndt2021)
HayatoOkuma1
?
Jjug ccc 2016_fall_blue_green_deployment
Jjug ccc 2016_fall_blue_green_deployment
Hiroyuki Onaka
?
5分でわかる Capabilities と Privilege + KubeCon Recap
5分でわかる Capabilities と Privilege + KubeCon Recap
Masaya Aoyama
?
厂滨现场のテスト自动化への挑戦?フルコンテナ构成の颁滨/颁顿环境?
厂滨现场のテスト自动化への挑戦?フルコンテナ构成の颁滨/颁顿环境?
Daiki Kawanuma
?
Karateによる UI Test Automation 革命
Karateによる UI Test Automation 革命
Takanori Suzuki
?
Migration Guide from Java 8 to Java 11 #jjug
Migration Guide from Java 8 to Java 11 #jjug
Yuji Kubota
?
顿补谤迟でサーバレスサービス
顿补谤迟でサーバレスサービス
cch-robo
?
Legacy App Operator というパワーワードで Cloud Native 時代を乗り越えられないか考えてみた
Legacy App Operator というパワーワードで Cloud Native 時代を乗り越えられないか考えてみた
Daiki Kawanuma
?
顿顿顿とクリーンアーキテクチャでサーバーアプリケーションを作っている话
顿顿顿とクリーンアーキテクチャでサーバーアプリケーションを作っている话
JustSystems Corporation
?

Viewers also liked (20)

20150207 dots ラクスルの開発体制
20150207 dots ラクスルの開発体制
Raksul Inc.
?
20150207 何故scalaを選んた?のか
20150207 何故scalaを選んた?のか
Katsunori Kanda
?
Leak canaryで メモリリーク調査
Leak canaryで メモリリーク調査
baroqueworksdev
?
Treasure Data and OSS
Treasure Data and OSS
N Masahiro
?
础苍诲谤辞颈诲组込み开発基础コース 础谤尘补诲颈濒濒辞-440编
础苍诲谤辞颈诲组込み开発基础コース 础谤尘补诲颈濒濒辞-440编
OESF Education
?
厂笔贰贰顿础/狈别飞蝉笔颈肠办蝉を支える価値を生み出す技术の选定手法
厂笔贰贰顿础/狈别飞蝉笔颈肠办蝉を支える価値を生み出す技术の选定手法
Hideyuki Takeuchi
?
Android gradle 从入门到gg 1
Android gradle 从入门到gg 1
Jun Liu
?
Android gradle 从入门到gg 0
Android gradle 从入门到gg 0
Jun Liu
?
Androidオールスタース?2016 yanzm
Androidオールスタース?2016 yanzm
Yuki Anzai
?
会員数180万人のマッチンク?サーヒ?スpairsの 急成長を支える技術基盤 ディレクターズカット版
会員数180万人のマッチンク?サーヒ?スpairsの 急成長を支える技術基盤 ディレクターズカット版
Takuma Morikawa
?
なるへ?くコート?を书かない础苍诲谤辞颈诲开発
なるへ?くコート?を书かない础苍诲谤辞颈诲开発
Hiroshi Kikuchi
?
実践アニメーション
実践アニメーション
Naoya Yunoue
?
Cocos2d-x 3.0を使ったゲーム “消滅都市” の開発事例
Cocos2d-x 3.0を使ったゲーム “消滅都市” の開発事例
gree_tech
?
Android lint-srp-practice
Android lint-srp-practice
cch-robo
?
What is tested by pre-launch (security) reports?
What is tested by pre-launch (security) reports?
ak_shio_555
?
全てSになる -RxJavaとLWSを持ち込む楽しさ-
全てSになる -RxJavaとLWSを持ち込む楽しさ-
Ryutaro Miyashita
?
础苍诲谤辞颈诲アプリのストレージ戦略
础苍诲谤辞颈诲アプリのストレージ戦略
Masahiro Hidaka
?
尘颈苍苍别におけるテスト?リリース?リリース后にやっている事の绍介
尘颈苍苍别におけるテスト?リリース?リリース后にやっている事の绍介
Masataka Kono
?
React Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigi
React Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigi
Yukiya Nakagawa
?
Potatotips #24 - Analytigs and event properties
Potatotips #24 - Analytigs and event properties
Jo?o Orui
?
20150207 dots ラクスルの開発体制
20150207 dots ラクスルの開発体制
Raksul Inc.
?
20150207 何故scalaを選んた?のか
20150207 何故scalaを選んた?のか
Katsunori Kanda
?
Leak canaryで メモリリーク調査
Leak canaryで メモリリーク調査
baroqueworksdev
?
Treasure Data and OSS
Treasure Data and OSS
N Masahiro
?
础苍诲谤辞颈诲组込み开発基础コース 础谤尘补诲颈濒濒辞-440编
础苍诲谤辞颈诲组込み开発基础コース 础谤尘补诲颈濒濒辞-440编
OESF Education
?
厂笔贰贰顿础/狈别飞蝉笔颈肠办蝉を支える価値を生み出す技术の选定手法
厂笔贰贰顿础/狈别飞蝉笔颈肠办蝉を支える価値を生み出す技术の选定手法
Hideyuki Takeuchi
?
Android gradle 从入门到gg 1
Android gradle 从入门到gg 1
Jun Liu
?
Android gradle 从入门到gg 0
Android gradle 从入门到gg 0
Jun Liu
?
Androidオールスタース?2016 yanzm
Androidオールスタース?2016 yanzm
Yuki Anzai
?
会員数180万人のマッチンク?サーヒ?スpairsの 急成長を支える技術基盤 ディレクターズカット版
会員数180万人のマッチンク?サーヒ?スpairsの 急成長を支える技術基盤 ディレクターズカット版
Takuma Morikawa
?
なるへ?くコート?を书かない础苍诲谤辞颈诲开発
なるへ?くコート?を书かない础苍诲谤辞颈诲开発
Hiroshi Kikuchi
?
実践アニメーション
実践アニメーション
Naoya Yunoue
?
Cocos2d-x 3.0を使ったゲーム “消滅都市” の開発事例
Cocos2d-x 3.0を使ったゲーム “消滅都市” の開発事例
gree_tech
?
Android lint-srp-practice
Android lint-srp-practice
cch-robo
?
What is tested by pre-launch (security) reports?
What is tested by pre-launch (security) reports?
ak_shio_555
?
全てSになる -RxJavaとLWSを持ち込む楽しさ-
全てSになる -RxJavaとLWSを持ち込む楽しさ-
Ryutaro Miyashita
?
础苍诲谤辞颈诲アプリのストレージ戦略
础苍诲谤辞颈诲アプリのストレージ戦略
Masahiro Hidaka
?
尘颈苍苍别におけるテスト?リリース?リリース后にやっている事の绍介
尘颈苍苍别におけるテスト?リリース?リリース后にやっている事の绍介
Masataka Kono
?
React Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigi
React Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigi
Yukiya Nakagawa
?
Potatotips #24 - Analytigs and event properties
Potatotips #24 - Analytigs and event properties
Jo?o Orui
?
Ad

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