SlideShare ist ein Scribd-Unternehmen logo
1 von 19
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
ご静聴ありがとうございました

Weitere ähnliche Inhalte

Was ist angesagt?

Gws 20120521 gradle
Gws 20120521 gradleGws 20120521 gradle
Gws 20120521 gradle
Nobuhiro Sue
 
Legacy App Operator というパワーワードで Cloud Native 時代を乗り越えられないか考えてみた
Legacy App Operator というパワーワードで Cloud Native 時代を乗り越えられないか考えてみたLegacy App Operator というパワーワードで Cloud Native 時代を乗り越えられないか考えてみた
Legacy App Operator というパワーワードで Cloud Native 時代を乗り越えられないか考えてみた
Daiki Kawanuma
 

Was ist angesagt? (20)

Cocos2d-xの深層〜Cocos2d-x組み込みによるピュアAndroid/iOSアプリの外科手術的統合
Cocos2d-xの深層〜Cocos2d-x組み込みによるピュアAndroid/iOSアプリの外科手術的統合Cocos2d-xの深層〜Cocos2d-x組み込みによるピュアAndroid/iOSアプリの外科手術的統合
Cocos2d-xの深層〜Cocos2d-x組み込みによるピュアAndroid/iOSアプリの外科手術的統合
 
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
 
AOA2.0を実装してみた
AOA2.0を実装してみたAOA2.0を実装してみた
AOA2.0を実装してみた
 
Wasm blazor and wasi 2
Wasm blazor and wasi 2Wasm blazor and wasi 2
Wasm blazor and wasi 2
 
Android test tutorial
Android test tutorialAndroid test tutorial
Android test tutorial
 
Kinect kihonnoki
Kinect kihonnokiKinect kihonnoki
Kinect kihonnoki
 
GR-SAKURAのUSBホスト機能で遊ぼう
GR-SAKURAのUSBホスト機能で遊ぼうGR-SAKURAのUSBホスト機能で遊ぼう
GR-SAKURAのUSBホスト機能で遊ぼう
 
Gws 20120521 gradle
Gws 20120521 gradleGws 20120521 gradle
Gws 20120521 gradle
 
Java によるクラウドネイティブ の実現に向けて
Java によるクラウドネイティブ の実現に向けてJava によるクラウドネイティブ の実現に向けて
Java によるクラウドネイティブ の実現に向けて
 
実践! Argo cd & rollouts による canary release(cndt2021)
実践! Argo cd & rollouts による canary release(cndt2021) 実践! Argo cd & rollouts による canary release(cndt2021)
実践! Argo cd & rollouts による canary release(cndt2021)
 
Jjug ccc 2016_fall_blue_green_deployment
Jjug ccc 2016_fall_blue_green_deploymentJjug ccc 2016_fall_blue_green_deployment
Jjug ccc 2016_fall_blue_green_deployment
 
5分でわかる Capabilities と Privilege + KubeCon Recap
5分でわかる Capabilities と Privilege + KubeCon Recap5分でわかる Capabilities と Privilege + KubeCon Recap
5分でわかる Capabilities と Privilege + KubeCon Recap
 
SI現場のテスト自動化への挑戦〜フルコンテナ構成のCI/CD環境〜
SI現場のテスト自動化への挑戦〜フルコンテナ構成のCI/CD環境〜SI現場のテスト自動化への挑戦〜フルコンテナ構成のCI/CD環境〜
SI現場のテスト自動化への挑戦〜フルコンテナ構成のCI/CD環境〜
 
Karateによる UI Test Automation 革命
Karateによる UI Test Automation 革命Karateによる UI Test Automation 革命
Karateによる UI Test Automation 革命
 
Migration Guide from Java 8 to Java 11 #jjug
Migration Guide from Java 8 to Java 11 #jjugMigration Guide from Java 8 to Java 11 #jjug
Migration Guide from Java 8 to Java 11 #jjug
 
Dartでサーバレスサービス
DartでサーバレスサービスDartでサーバレスサービス
Dartでサーバレスサービス
 
Legacy App Operator というパワーワードで Cloud Native 時代を乗り越えられないか考えてみた
Legacy App Operator というパワーワードで Cloud Native 時代を乗り越えられないか考えてみたLegacy App Operator というパワーワードで Cloud Native 時代を乗り越えられないか考えてみた
Legacy App Operator というパワーワードで Cloud Native 時代を乗り越えられないか考えてみた
 
Introduction to Spock
Introduction to SpockIntroduction to Spock
Introduction to Spock
 
GitLab Prometheus
GitLab PrometheusGitLab Prometheus
GitLab Prometheus
 
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
 

Andere mochten auch

20150207 dots ラクスルの開発体制
20150207 dots ラクスルの開発体制20150207 dots ラクスルの開発体制
20150207 dots ラクスルの開発体制
Raksul Inc.
 
React Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigi
React Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigiReact Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigi
React Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigi
Yukiya Nakagawa
 

Andere mochten auch (20)

20150207 dots ラクスルの開発体制
20150207 dots ラクスルの開発体制20150207 dots ラクスルの開発体制
20150207 dots ラクスルの開発体制
 
20150207 何故scalaを選んだのか
20150207 何故scalaを選んだのか20150207 何故scalaを選んだのか
20150207 何故scalaを選んだのか
 
Leak canaryで メモリリーク調査
Leak canaryで メモリリーク調査Leak canaryで メモリリーク調査
Leak canaryで メモリリーク調査
 
Treasure Data and OSS
Treasure Data and OSSTreasure Data and OSS
Treasure Data and OSS
 
Android組込み開発基礎コース Armadillo-440編
Android組込み開発基礎コース Armadillo-440編Android組込み開発基礎コース Armadillo-440編
Android組込み開発基礎コース Armadillo-440編
 
SPEEDA/NewsPicksを支える価値を生み出す技術の選定手法
SPEEDA/NewsPicksを支える価値を生み出す技術の選定手法SPEEDA/NewsPicksを支える価値を生み出す技術の選定手法
SPEEDA/NewsPicksを支える価値を生み出す技術の選定手法
 
Android gradle 从入门到gg 1
Android gradle 从入门到gg 1Android gradle 从入门到gg 1
Android gradle 从入门到gg 1
 
Android gradle 从入门到gg 0
Android gradle 从入门到gg 0Android gradle 从入门到gg 0
Android gradle 从入门到gg 0
 
Androidオールスターズ2016 yanzm
Androidオールスターズ2016 yanzmAndroidオールスターズ2016 yanzm
Androidオールスターズ2016 yanzm
 
会員数180万人のマッチングサービスpairsの 急成長を支える技術基盤 ディレクターズカット版
会員数180万人のマッチングサービスpairsの 急成長を支える技術基盤 ディレクターズカット版会員数180万人のマッチングサービスpairsの 急成長を支える技術基盤 ディレクターズカット版
会員数180万人のマッチングサービスpairsの 急成長を支える技術基盤 ディレクターズカット版
 
なるべくコードを書かないAndroid開発
なるべくコードを書かないAndroid開発なるべくコードを書かないAndroid開発
なるべくコードを書かないAndroid開発
 
実践アニメーション
実践アニメーション実践アニメーション
実践アニメーション
 
Cocos2d-x 3.0を使ったゲーム “消滅都市” の開発事例
Cocos2d-x 3.0を使ったゲーム “消滅都市” の開発事例Cocos2d-x 3.0を使ったゲーム “消滅都市” の開発事例
Cocos2d-x 3.0を使ったゲーム “消滅都市” の開発事例
 
Android lint-srp-practice
Android lint-srp-practiceAndroid lint-srp-practice
Android lint-srp-practice
 
What is tested by pre-launch (security) reports?
What is tested by pre-launch (security) reports?What is tested by pre-launch (security) reports?
What is tested by pre-launch (security) reports?
 
全てSになる -RxJavaとLWSを持ち込む楽しさ-
全てSになる -RxJavaとLWSを持ち込む楽しさ-全てSになる -RxJavaとLWSを持ち込む楽しさ-
全てSになる -RxJavaとLWSを持ち込む楽しさ-
 
Androidアプリのストレージ戦略
Androidアプリのストレージ戦略Androidアプリのストレージ戦略
Androidアプリのストレージ戦略
 
minneにおけるテスト〜リリース〜リリース後にやっている事の紹介
minneにおけるテスト〜リリース〜リリース後にやっている事の紹介minneにおけるテスト〜リリース〜リリース後にやっている事の紹介
minneにおけるテスト〜リリース〜リリース後にやっている事の紹介
 
React Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigi
React Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigiReact Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigi
React Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigi
 
Potatotips #24 - Analytigs and event properties
Potatotips #24 - Analytigs and event propertiesPotatotips #24 - Analytigs and event properties
Potatotips #24 - Analytigs and event properties
 

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

Groovy base gradle_20130309
Groovy base gradle_20130309Groovy base gradle_20130309
Groovy base gradle_20130309
Nobuhiro Sue
 

Ähnlich wie Gradleでビルドするandroid NDKアプリ (20)

Cocos2dx 8hour
Cocos2dx 8hourCocos2dx 8hour
Cocos2dx 8hour
 
[db tech showcase Tokyo 2017] E35: 12台でやってみた!DWHソフトウェアアプライアンス Db2 Warehouse ~...
[db tech showcase Tokyo 2017] E35: 12台でやってみた!DWHソフトウェアアプライアンス Db2 Warehouse ~...[db tech showcase Tokyo 2017] E35: 12台でやってみた!DWHソフトウェアアプライアンス Db2 Warehouse ~...
[db tech showcase Tokyo 2017] E35: 12台でやってみた!DWHソフトウェアアプライアンス Db2 Warehouse ~...
 
Groovy base gradle_20130309
Groovy base gradle_20130309Groovy base gradle_20130309
Groovy base gradle_20130309
 
AndroidStudioはじめました ~Gradle編~
AndroidStudioはじめました ~Gradle編~AndroidStudioはじめました ~Gradle編~
AndroidStudioはじめました ~Gradle編~
 
Gradle再入門.pptx
Gradle再入門.pptxGradle再入門.pptx
Gradle再入門.pptx
 
Android studio で行ってみよう!!
Android studio で行ってみよう!!Android studio で行ってみよう!!
Android studio で行ってみよう!!
 
AndroidでActiveRecordライクにDBを使う
AndroidでActiveRecordライクにDBを使うAndroidでActiveRecordライクにDBを使う
AndroidでActiveRecordライクにDBを使う
 
Aiming study#6pdf
Aiming study#6pdfAiming study#6pdf
Aiming study#6pdf
 
BazelでビルドしたアプリをGCPにデプロイしようとしてハマった話
BazelでビルドしたアプリをGCPにデプロイしようとしてハマった話BazelでビルドしたアプリをGCPにデプロイしようとしてハマった話
BazelでビルドしたアプリをGCPにデプロイしようとしてハマった話
 
Spring in-summer-gradle-hands on-withanswers
Spring in-summer-gradle-hands on-withanswersSpring in-summer-gradle-hands on-withanswers
Spring in-summer-gradle-hands on-withanswers
 
ASP.NET Core のお気に入りの機能たち (docker向け)
ASP.NET Core のお気に入りの機能たち (docker向け)ASP.NET Core のお気に入りの機能たち (docker向け)
ASP.NET Core のお気に入りの機能たち (docker向け)
 
node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成
 
mago3D, Innovation with 3D by adding Z-axis in your browser!
mago3D, Innovation with 3D by adding Z-axis in your browser!mago3D, Innovation with 3D by adding Z-axis in your browser!
mago3D, Innovation with 3D by adding Z-axis in your browser!
 
【日本語版】Styler: Our Journey to GCP
【日本語版】Styler: Our Journey to GCP【日本語版】Styler: Our Journey to GCP
【日本語版】Styler: Our Journey to GCP
 
【ヒカ☆ラボ】 dely株式会社 梅森 翔氏 登壇資料 20171121
【ヒカ☆ラボ】 dely株式会社 梅森 翔氏 登壇資料 20171121【ヒカ☆ラボ】 dely株式会社 梅森 翔氏 登壇資料 20171121
【ヒカ☆ラボ】 dely株式会社 梅森 翔氏 登壇資料 20171121
 
Media Renewal LT
Media Renewal LTMedia Renewal LT
Media Renewal LT
 
Gradleスクリプトを読み解く
Gradleスクリプトを読み解くGradleスクリプトを読み解く
Gradleスクリプトを読み解く
 
Android Studio 2.2の紹介@Google I/O 2016東京報告会
Android Studio 2.2の紹介@Google I/O 2016東京報告会Android Studio 2.2の紹介@Google I/O 2016東京報告会
Android Studio 2.2の紹介@Google I/O 2016東京報告会
 
kernel/vm@okinawa 2014
kernel/vm@okinawa 2014kernel/vm@okinawa 2014
kernel/vm@okinawa 2014
 
Python におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころPython におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころ
 

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