Address
:
[go:
up one dir
,
main page
]
Include Form
Remove Scripts
Accept Cookies
Show Images
Show Referer
Rotate13
Base64
Strip Meta
Strip Title
Session Cookies
More Web Proxy on the site http://driver.im/
Submit Search
Gradleでビルドするandroid NDKアプリ
•
Download as PPTX, PDF
•
11 likes
•
8,005 views
H
Hideyuki Kikuma
Follow
Gradleでビルドするandroid NDKアプリ
Read less
Read more
1 of 19
Download now
Download to read offline
More Related Content
Gradleでビルドするandroid NDKアプリ
1.
gradleでビルドする Android NDKアプリ
2.
About me Hideyuki Kikuma Android
engineer mixi,inc @hidey
3.
今日話すこと ● gradleでビルドしようとした時に困った話 ● それをなんとか解決した話 ●
今後のNDK周りの話
4.
NDK使ってますか?
5.
Android plugin for
Gradleの今 ● ちょっとしたものならこん な感じでOK ● AndroidStudioでブレイクポ イントも仕込める android { defaultConfig { ndk { moduleName "modulename" stl "gnustl_shared" abiFilters "armeabi-v7a", "x86" ldLibs "log" } } }
6.
Android.mkが必要なパターン LOCAL_LDLIBSを使ってる ソースファイルのディレクトリ構造ががが… Android.mkの中でマクロで色々切り替えしてる Android.mkが黒魔術過ぎて移行できない
7.
よくあるサンプル ndk-buildコマンドを 実行するタスクを作成 してJavaCompile実行 前に実行されるように する tasks.withType(JavaCompile) { compileTask -> compileTask.dependsOn
ndkBuild } task ndkBuild(type: Exec) { commandLine "${ndkHome}ndk- build" }
8.
困ったこと デバッグビルドが出来ない デバッグビルド時はNDK部分もデバッグオプ ションをつけてビルドしたい build type毎にndk-buildのオプションを変えた い!
9.
どうしたか 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 }
10.
何してんの? variant.nameで名前を取得 devFreeDebugのようなものが取れ る それを使ってタスクを作る commandLineでコマンド実行した いのでtypeはExecにしておく def variantName = variant.name.capitalize() task "nativeBuild${variantName}"(type: Exec)
{ }
11.
何してんの? 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) }
12.
ついでに flavorごとにも同じことができるよ うにしておく variant.productFlavors.each { productFlavor
-> def flavorOption = ndkFlavorConfigs.get(productFlavor. name) if (flavorOption != null) { options.addAll(flavorOption) } }
13.
dependsOn buildタスクで実行されるように既存 のタスクに依存を追加する compileJavaに追加してるが実際は 正しくbuildできればどこでもいい tasks.withType(JavaCompile) { compileTask -> if
(compileTask.name == "compile${variantName}Java") { compileTask.dependsOn "nativeBuild${variantName}" } }
14.
デバッグbuildしようと思ったら いつの間にかProductFravorsの仕様とかを調べ まくることに 目的に対しては正直オーバースペック
15.
build周りで困ったら ● gradleの公式ドキュメントを読む ● android
pluginのドキュメントを読む ● --dry-runで実際に実行されるtaskを調べる ● build/ 以下に出力されるファイルを眺めてみ る
16.
android-plugin 1.3? experimentalで実装が進んでいたndk用のDSL 周りが入ってきた 全部をexperimental-pluginに変える以外だとう まく使えなかった 誰か使えてる人いたら教えて下さい
17.
まとめ ● ProductFlavorsはめちゃめちゃ便利 ○ 用法用量は守って使いましょう ●
NDK部分もデバッグビルドしよう ● 今すぐ必要じゃないならplugin待ちもあり
18.
Q&A
19.
ご静聴ありがとうございました
Download