AndroidNDK のデバッグの切替

2,395 views
Skip to first unread message

太規

unread,
Nov 16, 2011, 2:06:00 AM11/16/11
to 日本Androidの会
最近Native Activityでアプリケーションの制作を行なっているのですが、
制作段階で使用していたログなどのデバッグ機能ををアップするときに手軽に消す方法が思いつかず、
以下のような方法でデバッグとリリース時のバージョンを分けています。

------------------------------------------------------------------------------------------------------------------------------------------------------

<AppDebug.h>
#define _APP_DEBUG_ true
#if _APP_DEBUG_
// デバッグ用の処理
#define LOGI(...)
{__android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__);}
#else
// リリース用の処理
#define LOGI(...)
#endif

------------------------------------------------------------------------------------------------------------------------------------------------------

上記のようにリリース版とデバッグ版を変えるたびに
「_APP_DEBUG_ の値を変えcygwinを使用しリビルドをやり直し、さらに、AndroidManifest.xmlの
android:debuggableの値を変える」
というような手順を踏んでいるため、大変手間に思えてなりません。

なにかもっと効率的にする方法はありませんでしょうか?
なにかご存知の方いましたら、何卒ご教授のほどよろしくお願いします。

Shigeo Mutoh

unread,
Nov 16, 2011, 11:15:01 PM11/16/11
to android-g...@googlegroups.com
tmhouseです。

Native Activityなどというものが、存在しているのを知らなかったので
少し調べてみました。さらに言うと、JNIさえ私は知りません。。
さらにさらに、Cをすっかり忘れてます。

だけども太規さんの気持ちはよく分かります。

_APP_DEBUG_をソースでdefineするのをやめて、コマンドライン
オプションで指定する方針はいかがでしょうか?
ccの-Dオプションを使うということです。

ndk-build -D_APP_DEBUG_=true
がうまく動けばいいのですが。

ただ、普通はmake時にdebugかreleaseかを指定して、その指定ごとに
何をするかはMakefileの中に書くのですが。。

一方、AndroidManifest.xmlの中は、普通のAndroidアプリであっても
ほぼ「手で直せ」式であるため、ある意味そういう設計思想です。
googleの中の人を呪うしかありません。
※なぜ、アプリ設計情報の中にそれを混ぜ込んだのかなあ。。

android:debuggable="true"
をdebug/releaseの指定により正しく置換して保管するshellを書くこと
は簡単でしょうが、私なら矛盾したケースはコンパイルを通さない
ようにすると思います。なぜなら、やっぱり「手で直せ」式という
設計思想に反すると、後で泣く予感がするからです。

以上、いまいち役にたたない情報でした。
どなたか実例を示されて下さるとよいのですが。。。

Hiroaki GOTO as GORRY

unread,
Nov 17, 2011, 12:22:08 AM11/17/11
to android-g...@googlegroups.com

後藤 浩昭(GORRY)です。

C/C++内のコードにおいては、assert()等で使う NDEBUG マクロが
そのまま利用できます。
NDEBUG は、リリースビルド時のみ定義されるマクロです。

NDK r6bの ./build/core/add-application.mk より抜粋。

--------
# set release/debug build flags. We always use the -g flag because
# we generate symbol versions of the binaries that are later stripped
# when they are copied to the final project's libs/<abi> directory.
#
ifeq ($(APP_OPTIM),debug)
APP_CFLAGS := -O0 -g $(APP_CFLAGS)
else
APP_CFLAGS := -O2 -DNDEBUG -g $(APP_CFLAGS)
endif
--------

In message <507ea6cf-4696-447d...@f3g2000pri.googlegroups.com>
"[android-group-japan: 15307] AndroidNDK のデバッグの切替"
"太規 <matsu...@gmail.com>" wrote:

> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
>


--
Hiroaki GOTO as "GORRY" : 後藤 浩昭
EMAIL: gorr...@gmail.com

kacodama

unread,
Nov 17, 2011, 2:10:55 AM11/17/11
to 日本Androidの会
C/C++では、デバッグ版とリリース版で最適化などのビルドオプションを変えてビルドするのは普通で、後藤さんの仰るNDEBUGを利用すればソース
コードを変更する手間は省けますが、

>cygwinを使用しリビルドをやり直し、さらに、AndroidManifest.xmlのandroid:debuggableの値を変える」

この部分はこれ以上は簡略化はできないでしょうね。。。

AndroidManifest.xmlのdebuggableは、デバッガーがプロセスにアタッチ出来るかという設定なだけで、ログの出力には関係な
いです。
私も最初はこれを知らず、Log.d()がdebuggable=falseに変えても出力され続けていたときに唖然としてしまいました。

やむを得ずアプリ全体でDEBUGフラグを持ち、わざわざif(DEBUG){ Log.d(...); }みたいに書いています。
javaにはマクロはないので仕方ないですが・・・



On 11月17日, 午後2:22, gorry...@gmail.com (Hiroaki GOTO as "GORRY") wrote:
> 後藤 浩昭(GORRY)です。
>
> C/C++内のコードにおいては、assert()等で使う NDEBUG マクロが
> そのまま利用できます。
> NDEBUG は、リリースビルド時のみ定義されるマクロです。
>
> NDK r6bの ./build/core/add-application.mk より抜粋。
>
> --------
> # set release/debug build flags. We always use the -g flag because
> # we generate symbol versions of the binaries that are later stripped
> # when they are copied to the final project's libs/<abi> directory.
> #
> ifeq ($(APP_OPTIM),debug)
> APP_CFLAGS := -O0 -g $(APP_CFLAGS)
> else
> APP_CFLAGS := -O2 -DNDEBUG -g $(APP_CFLAGS)
> endif
> --------
>
> In message <507ea6cf-4696-447d-973d-4d5232887...@f3g2000pri.googlegroups.com>
> "[android-group-japan: 15307] AndroidNDK のデバッグの切替"
> EMAIL: gorry...@gmail.com

Kirita Kazuya

unread,
Nov 17, 2011, 8:21:02 PM11/17/11
to android-g...@googlegroups.com
はじめまして。Release/Debugとはちょっと違いますが、
製品版と体験版のビルドわけで似たような問題で悩みました。
結局、ant を使って製品版専用のプロジェクトフォルダを動的に生成する という方法で落ち着きました

基本的にデバッグ用のプロジェクトで作業を進め、製品版をビルドしたいときは以下の作業を ant にやらせます

前提条件:
myapp_debug というプロジェクトを使っていると仮定
Androidmanifest_release.xml というのを用意しておく

ant:
1) myapp_release フォルダを作成
2) myapp_debug/Androidmanifest_release.xml を myapp_release/ にコピーして
Androidmanifest.xml にリネーム
3) myapp_debug/ソースツリーから、製品版に必要なものだけを myapp_release/ にコピー

けっこう力技ですが、なにかのヒントになれば...

Hiroaki GOTO as GORRY

unread,
Nov 17, 2011, 11:37:06 PM11/17/11
to android-g...@googlegroups.com

後藤 浩昭(GORRY)です。

ビルド手順の簡略化については、Ant を使う方法があります。
build.xml に以下のように書き足します。

--------
<target name="ndk-debug">
<echo>build NDK debug</echo>
<exec executable="sh" failonerror="true">
<arg value="./ndk-debug.sh"/>
</exec>
</target>

<target name="ndk-release">
<echo>build NDK release</echo>
<exec executable="sh" failonerror="true">
<arg value="./ndk-release.sh"/>
</exec>
</target>
--------

これで、コマンドラインから

> ant ndk-debug
> ant ndk-release

でそれぞれ ndk-debug.sh / ndk-release.sh が実行できます。
それぞれのスクリプトにNDKのリリース/デバッグビルドを
行うようにしておけばよいでしょう。ここまでやっておけば、

> ant ndk-debug debug install
> ant ndk-release release install

で、「NDK部のビルド/Java部のビルド/APKの作成&署名/
端末へのインストール」までが1コマンドでできます。

同様に、AndroidManifest-debug.xml と AndroidManifest-release.xml を
作って、ビルド時にどちらかをAndroidManifest.xml へコピーするように
build.xml への target 記述で書いておけば、debuggable の修正も不要に
なるかと思います。


In message <0eca1707-c5dc-4e12...@v38g2000prh.googlegroups.com>
"[android-group-japan: 15319] Re: AndroidNDK のデバッグの切替"
"kacodama <le.s....@gmail.com>" wrote:

EMAIL: gorr...@gmail.com

Shigeo Mutoh

unread,
Nov 18, 2011, 12:00:20 AM11/18/11
to android-g...@googlegroups.com
tmhouseです。

なんと素晴らしい。antはそんなことができるのですね。

私はRelease版を作るときはいつもantを使ってます。
なぜなら、proguardのエラーを取りきるまでに何回もGUIで操作
するのは本当に忌々しい上、エラーの内容を知るにはコマンド
ラインからantを打った方がはるかに情報が豊富だからです。

あとはお好みですが、こんな感じで、

1 #!/bin/sh
2
3 ORGXML=AndroidManifest.xml
4 CPXML=AndroidManifest_copy.xml
5 /bin/cp -p $ORGXML $CPXML
6
7 sed 's/android:debuggable=\"true\"/android:debuggable=\"false\"/g' <
$CPXML > $ORGXML

shellを作ればrelease用のmanifestを作らないで済みますね。
あ、debug用はtrueとfalseを逆にしないとダメですが。

ikippe

unread,
Jan 7, 2012, 2:46:30 AM1/7/12
to 日本Androidの会
書き込みありがとうございます。
返事が遅くなり申し訳ありません。

> ndk-build -D_APP_DEBUG_=true
この方法ではできませんでした。
すべてfalse(恐らく未定義扱い)でした。

> 一方、AndroidManifest.xmlの中は、普通のAndroidアプリであっても
> ほぼ「手で直せ」式であるため、ある意味そういう設計思想です。
やはりそうなんですね。
今は、マニフェストの方はshellで置き換えれるように作りました。
今のところはこれで問題ないようなので…

ikippe

unread,
Jan 7, 2012, 2:49:38 AM1/7/12
to 日本Androidの会
書き込みありがとうございます。
返事が遅くなり申し訳ありません。

> C/C++内のコードにおいては、assert()等で使う NDEBUG マクロが
> そのまま利用できます。
> NDEBUG は、リリースビルド時のみ定義されるマクロです。
なるほどassertは盲点でした。
早速NDEBUG活用させて頂きます。
ありがとうございます。



On 2011年11月17日, 午後2:22, gorry...@gmail.com (Hiroaki GOTO as "GORRY")
wrote:
> 後藤 浩昭(GORRY)です。
>
> C/C++内のコードにおいては、assert()等で使う NDEBUG マクロが
> そのまま利用できます。
> NDEBUG は、リリースビルド時のみ定義されるマクロです。
>
> NDK r6bの ./build/core/add-application.mk より抜粋。
>
> --------
> # set release/debug build flags. We always use the -g flag because
> # we generate symbol versions of the binaries that are later stripped
> # when they are copied to the final project's libs/<abi> directory.
> #
> ifeq ($(APP_OPTIM),debug)
> APP_CFLAGS := -O0 -g $(APP_CFLAGS)
> else
> APP_CFLAGS := -O2 -DNDEBUG -g $(APP_CFLAGS)
> endif
> --------
>
> In message <507ea6cf-4696-447d-973d-4d5232887...@f3g2000pri.googlegroups.com>
> "[android-group-japan: 15307] AndroidNDK のデバッグの切替"
> EMAIL: gorry...@gmail.com

ikippe

unread,
Jan 7, 2012, 2:56:20 AM1/7/12
to 日本Androidの会
書き込みありがとうございます。
返事が遅くなり申し訳ありません。

> AndroidManifest.xmlのdebuggableは、デバッガーがプロセスにアタッチ出来るかという設定なだけで、ログの出力には関係な
> いです。
これは初耳です。
私も今からログ抑制用の処理を自分のアプリケーションに組み込もうと思います。
耳よりな情報をありがとうございます!

ikippe

unread,
Jan 7, 2012, 3:01:15 AM1/7/12
to 日本Androidの会
書き込みありがとうございます。
返事が遅くなり申し訳ありません。

> 1) myapp_release フォルダを作成
> 2) myapp_debug/Androidmanifest_release.xml を myapp_release/ にコピーして
> Androidmanifest.xml にリネーム
> 3) myapp_debug/ソースツリーから、製品版に必要なものだけを myapp_release/ にコピー
確かにかなりの力技ですね。
しかしantですか。
今まで存在は知っていましたが、特に気にしていませんでした。
なにか他にもやりようがありそうなので、少しantについて調べてみようと思います。
ありがとうございます。

ikippe

unread,
Jan 7, 2012, 3:04:15 AM1/7/12
to 日本Androidの会
書き込みありがとうございます。
返事が遅くなり申し訳ありません。

> ビルド手順の簡略化については、Ant を使う方法があります。
おぉー!!すごい!!
Antを使うと1コマンドですべてができるようになるんですね!!
まさに私が求めていたのはこれです!
早速やってみます。ありがとうございます。



On 2011年11月18日, 午後1:37, gorry...@gmail.com (Hiroaki GOTO as "GORRY")
wrote:
> 後藤 浩昭(GORRY)です。
>
> In message <0eca1707-c5dc-4e12-81ce-d1c98cef2...@v38g2000prh.googlegroups.com>
> "[android-group-japan: 15319] Re: AndroidNDK のデバッグの切替"

ikippe

unread,
Jan 7, 2012, 3:08:23 AM1/7/12
to 日本Androidの会
書き込みありがとうございます。
返事が遅くなり申し訳ありません。

> 私はRelease版を作るときはいつもantを使ってます。
> なぜなら、proguardのエラーを取りきるまでに何回もGUIで操作
> するのは本当に忌々しい上、エラーの内容を知るにはコマンド
> ラインからantを打った方がはるかに情報が豊富だからです。
antにはエラー内容を知る機能まであるんですか。すごいです!
具体的な設定方法まで記載して頂きありがとうございます。
早速試してみます。
> > In message<0eca1707-c5dc-4e12-81ce-d1c98cef2...@v38g2000prh.googlegroups.com>
> > "[android-group-japan: 15319] Re: AndroidNDK のデバッグの切替"
Reply all
Reply to author
Forward
0 new messages