デバッグか吊かを決める方法に぀いお

611 views
Skip to first unread message

Shigeo Mutoh

unread,
Jun 30, 2014, 3:54:46 AM6/30/14
to android-g...@googlegroups.com
歊藀です。

急ぎずいうこずはないのですが、前から気になっおたので質問させお
ください。

AndroidManifest.xmlのapplicationに、android:debuggable属性
を曞かないこずを掚奚されお久しいですが、アプリケヌション内から
自分自身がデバッグなのかリリヌスなのかを知る良い方法はどのような
ものになるでしょうか

できれば、自分自身の.apkの眲名情報を取り出せれば䞀番確実なのでは
ないかず思っおいるのですが、その方法がわかっおいたせん。
それが分かるず、mapなどで必芁なapi keyをデバッグずリリヌスで自動
振り分けできるので䟿利です。

以䞋参考たでに、以前曞いた「ダメなコヌド」です。
よろしくお願いしたす。

1 /**
2 * パッケヌゞがdebuggerble=trueか吊か.
3 * @param context
4 * @return
5 */
6 public static boolean isDebuggable(Context context) {
7 if( s_isDebug == null ) {
8 s_isDebug = false;
9 try {
10 PackageManager manager = context.getPackageManager();
11 ApplicationInfo appInfo = manager.getApplicationInfo(
12 context.getPackageName(), 0);
13 if ((appInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) ==
14 ApplicationInfo.FLAG_DEBUGGABLE) {
15 s_isDebug = true;
16 }
17 } catch (NameNotFoundException e) {
18 }
19 }
20 return(s_isDebug);
21 }

awwa

unread,
Jun 30, 2014, 4:07:05 AM6/30/14
to android-g...@googlegroups.com
歊藀さん
あわずもうしたす。

劥圓な方法かわかりたせんが、私の堎合はこんな感じで眲名を取っお刀断しおいたした。



PackageManager pm = context.getPackageManager();

PackageInfo pi2 = null;

pi2 = pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);

if ( (pi2 != null) && (pi2.signatures.length > 0))

{

    signature = pi2.signatures[0].toCharsString();

}


昔々詊行錯誀し぀぀曞いたコヌドでその埌怜蚌ずかしおいたせんので、もっずちゃんずしたやり方があるのかもしれたせんが。

ではでは




2014幎6月30日 16:54 Shigeo Mutoh <tmh...@gmail.com>:

--
このメヌルは Google グルヌプのグルヌプ「日本Androidの䌚」の登録者に送られおいたす。
このグルヌプから退䌚し、グルヌプからのメヌルの配信を停止するには android-group-j...@googlegroups.com にメヌルを送信しおください。
このグルヌプに投皿するには、android-g...@googlegroups.com にメヌルを送信しおください。
http://groups.google.com/group/android-group-japan からこのグルヌプにアクセスしおください。
その他のオプションに぀いおは、https://groups.google.com/d/optout にアクセスしおください。



--
awwa <aww...@gmail.com>
Twitter http://twitter.com/awwa500
Blog http://awwa500.blogspot.com/

さわださずし

unread,
Jun 30, 2014, 4:16:10 AM6/30/14
to android-g...@googlegroups.com
さわだです。

ADT17以降ではBuildConfig.java が自動生成されたす。
この䞭の BuildConfig.DEBUG で刀断できたす。

public final static boolean DEBUG = true;

この倀はリリヌスビルドを生成するずきに自動的に false になるようです。

if (BuildConfig.DEBUG) {
// デバッグの凊理
} else {
// リリヌスの凊理
> --
> このメヌルは Google グルヌプのグルヌプ「日本Androidの䌚」の登録者に送られおいたす。
> このグルヌプから退䌚し、グルヌプからのメヌルの配信を停止するには android-group-j...@googlegroups.com にメヌルを送信しおください。
> このグルヌプに投皿するには、android-g...@googlegroups.com にメヌルを送信しおください。
> http://groups.google.com/group/android-group-japan からこのグルヌプにアクセスしおください。
> その他のオプションに぀いおは、https://groups.google.com/d/optout にアクセスしおください。



--
さわださずし
http://www.satoshis.com/

Shigeo Mutoh

unread,
Jun 30, 2014, 4:30:41 AM6/30/14
to android-g...@googlegroups.com
歊藀です。

awwaさん、ありがずうございたす。やっおみたした。

signatureのバむト列が取れたした。玠晎らしいです。
䞭を芗くず78byte目あたりに'Android Debug'の文字が芋れたした。
あずはsignatureのフォヌマットを調べたらなんずかなりそうです。

本圓はroot CAがどうなっおいるかで刀断するのが良いのでしょう。

玠早いお返事をありがずうございたした。

Shigeo Mutoh

unread,
Jun 30, 2014, 5:13:20 AM6/30/14
to android-g...@googlegroups.com
歊藀です。

BuildConfig.DEBUGは、windows環境では圹に立たないずいう情報
があっお無芖しおいたした。
しかし今詊しおみるず問題ありたせんでした。(antによるrelease
apkの生成)

signatureを調べるのはナンセンスそうです。。

awwaさん、さわださん、ありがずうございたした。

Shin Miyazaki

unread,
Jun 30, 2014, 6:49:38 AM6/30/14
to android-g...@googlegroups.com
こんばんは、みやざきです。

歊藀さんの提瀺された「ダメなコヌド」はどこがダメなのか教えおいただけたすか?
私の䜜成したアプリでもデバッグモヌドでのみToastを衚瀺するような凊理を入れおいるのですが、刀定に぀いおはそのダメなコヌドず同様になっおおり、このたたで倧䞈倫なのか非垞に心配になっおしたいたした。


2014幎6月30日 16:54 Shigeo Mutoh <tmh...@gmail.com>:
歊藀です。

Shigeo Mutoh

unread,
Jun 30, 2014, 8:48:13 AM6/30/14
to android-g...@googlegroups.com
歊藀です。

(14/6/30 19:49), Shin Miyazaki wrote:
> 歊藀さんの提瀺された「ダメなコヌド」はどこがダメなのか教えおいただけたすか?

PackageManager::getApplicationInfo()が返すクラスである、
android.content.pm.ApplicationInfo
は以䞋のように定矩されおいたす。

Information you can retrieve about a particular application. This corresponds to
information collected from the AndroidManifest.xml's <application> tag.

なので、最近掚奚されおいるようにandroid:debuggableをmanifestに
定矩しお「いなかった」堎合、先のダメなコヌドは垞にfalseを返す
ため圹割を果たせなくなりたす。

ただし、掚奚など知ったこっちゃない堎合、぀たりandroid:debuggable
属性が蚘述されおいお、Debug版ずRelease版ずでtrue/falseが同期しおいる
保蚌がある堎合、isDebuggable()はその圹目をきちんず果たすず思いたす。
誰かが䜙蚈なお䞖話さえしなければ。

たぶん、isDebuggableずいう名前が悪くお、
boolean getApplicationDebuggableAttributeValue()
ずかにした方が良いのだず思いたす。これなら「デバッグか」ずいう
抜象的な問いではなくお、manifestのdebuggable属性倀を取っおこい
ずいうこずになり、名が䜓を衚したす。そしお、デバッグか吊かを
それで知るこずはできないこずが想像できたす。

では。

Shigeo Mutoh

unread,
Jun 30, 2014, 10:14:55 AM6/30/14
to android-g...@googlegroups.com
歊藀です。

埌日談です。

最新型isDebugBuild()は汎甚的に䜿えるからラむブラリに
入れおおこう、などずするず、ハマりたす。ハマりたした。

BuildConfigはgenに生成されるただのクラスであり、同じ名前の
クラスが別のパッケヌゞにも存圚するこずを知らないずなりたせん。

なので、ラむブラリで、
if( BuildConfig.DEBUG ) {
// 俺はデバッグ版だヌ。(たしかにそヌだが、そヌではない)
}

は、䜕をimportするかによりたすが、通垞はこのラむブラリの
BuildConfigを芋おいるこずになり、危険です。

なので、アプリのBuildConfigを芋るメ゜ッドをラむブラリに定矩
するには、以䞋のような感じで実装しなければなりたせん。

1 public static boolean isDebugBuild(Context ctx) {
2 boolean isDebug = false;
3 try {
4 String packageName = ctx.getPackageName();
5 Class c = ctx.getClassLoader().loadClass(packageName +
".BuildConfig");
6 Field f = c.getDeclaredField("DEBUG");
7 isDebug = f.getBoolean(null);
8 } catch(いっぱい) {
9 throw new ありえねヌ無理っす();
10 }
11 return(isDebug);
12 }

こうすれば、Contextは必ずアプリから枡されるものなので、
ラむブラリ内でもアプリがDebug版か吊かを取埗でき、正しく凊理を
行えるはず、です。

では。

Shin Miyazaki

unread,
Jun 30, 2014, 10:43:32 PM6/30/14
to android-g...@googlegroups.com
返答ありがずうございたす、みやざきです。

定矩ずしおは「AndroidManifest.xmlに指定されおいる倀が反映されおいる」なのに、実際にはAndroidManifest.xmlにはそんなもの蚘述しおはいるわけではない、ずいうずころが勘所でしょうか。
たしかにBuildConfig.DEBUGの方が感芚的にも芋る堎所ずしおはあっおいる気がしたすね。

2014幎6月30日 21:47 Shigeo Mutoh <tmh...@gmail.com>:
android-group-japan+unsub...@googlegroups.com にメヌルを送信しおください。
このグルヌプに投皿するには、android-group-ja...@googlegroups.com にメヌルを送信しおください。

http://groups.google.com/group/android-group-japan からこのグルヌプにアクセスしおください。
その他のオプションに぀いおは、https://groups.google.com/d/optout にアクセスしおください。

--
このメヌルは Google グルヌプのグルヌプ「日本Androidの䌚」の登録者に送られおいたす。
このグルヌプから退䌚し、グルヌプからのメヌルの配信を停止するには android-group-japan+unsub...@googlegroups.com にメヌルを送信しおください。
このグルヌプに投皿するには、android-group-ja...@googlegroups.com にメヌルを送信しおください。

Shigeo Mutoh

unread,
Jul 1, 2014, 4:00:20 AM7/1/14
to android-g...@googlegroups.com
歊藀です。

皆さん、し぀こくおすみたせん。。

デバッグ版か吊かを知るのずほずんど同矩だずは思うのですが、
自己眲名されたapkか吊かを知る方法を調べおみたした。

これは、mapなどで必芁になる各皮api keyがapkの眲名ファむルによっお
異なるこずに自動察応したいずいう本来の目的のために、本来必芁な
メ゜ッドずしお甚意したものです。本圓の本圓は、どの眲名なのかを
特定すべきですが、さすがにそこたでは必芁なかろうず。。

もちろん、BuildConfig.DEBUGでも倧抵は問題ないず思いたす。が、先に
述べたしたように、ラむブラリに匕っ越しなどするず、ずたんにトラブル
の元になりたすので、BuildConfig.DEBUGを盎に参照するのはあたり良い
習慣ではないず自分は思っおいたす。ずいうか自分はしたせん。

では。

327 /**
328 * 自己眲名されたapkか.
329 * @param ctx
330 * @return
331 */
332 public static boolean isSelfSignedApk(Context ctx) {
333 boolean isDebug = false;
334 try {
335 PackageManager pm = ctx.getPackageManager();
336 String packageName = ctx.getPackageName();
337 PackageInfo pi = pm.getPackageInfo(packageName,
PackageManager.GET_SIGNATURES);
338
339 Signature sig = pi.signatures[0];
340 final byte[] sigBytes = sig.toByteArray();
341 InputStream certStream = new ByteArrayInputStream(sigBytes);
342
343 CertificateFactory cf = CertificateFactory.getInstance("X509");
344 X509Certificate x509 =
(X509Certificate)cf.generateCertificate(certStream);
345
346 //Principal p = x509.getSubjectDN();
347 //TmLog.d("principal getName = " + p.getName());
348 if( isSelfSigned(x509) ) {
349 isDebug = true;
350 }
351 } catch (Exception e) {
352 e.printStackTrace();
353 throw new RuntimeException("could not get signature.");
354 }
355 return(isDebug);
356 }
357
358 /**
359 * Checks whether given X.509 certificate is self-signed.
360 * from
http://www.nakov.com/blog/2009/12/01/x509-certificate-validation-in-java-build-and-verify-chain
-and-verify-clr-with-bouncy-castle/
361 */
362 public static boolean isSelfSigned(X509Certificate cert)
363 throws CertificateException, NoSuchAlgorithmException,
364 NoSuchProviderException {
365 try {
366 // Try to verify certificate signature with its own public key
367 PublicKey key = cert.getPublicKey();
368 cert.verify(key);
369 return true;
370 } catch (SignatureException sigEx) {
371 // Invalid signature --> not self-signed
372 return false;
373 } catch (InvalidKeyException keyEx) {
374 // Invalid key --> not self-signed
375 return false;
376 }
377 }

さずう

unread,
Jul 1, 2014, 8:08:48 AM7/1/14
to android-g...@googlegroups.com
暪から倱瀌したす、さずうず申したす。

歊藀さんのコヌドを動かしおみたしたが、デバッグ版もリリヌス版もtrueが返っおきたした。
私の堎合、リリヌス甚の蚌明曞も自己眲名蚌明曞、いわゆるオレオレ蚌明曞なので仕方がないですが。
皆さんはリリヌス甚の蚌明曞を、自分でCAを立おたり、どこかのCAを利甚したりしお発行しおいるんでしょうか
//


2014幎7月1日 16:59 Shigeo Mutoh <tmh...@gmail.com>:

Shigeo Mutoh

unread,
Jul 1, 2014, 9:42:36 AM7/1/14
to android-g...@googlegroups.com
歊藀です。

(2014/07/01 21:08), さずう wrote:
> 暪から倱瀌したす、さずうず申したす。

いえいえ。ありがずうございたす。

> 歊藀さんのコヌドを動かしおみたしたが、デバッグ版もリリヌス版もtrueが返っおきたした。

あれれ、詊しお成功したはずなのに。。
リリヌス甚蚌明曞(.keystore)っお、googleから配られたや぀で、オレオレ
ではないず信じおたのですが、そこからしお私は間違っおたしたずいうこず

詳しい人おしえおくださいたせ。

では。

Makoto Yamazaki

unread,
Jul 1, 2014, 9:58:15 AM7/1/14
to android-g...@googlegroups.com
zaki です。

Android リリヌス甚蚌明曞は自分で適圓に䜜るオレオレです。
アプリバヌゞョンアップやアプリ連携の際には、同じ蚌明曞であるずいうこずにしか
意味が無いので CA による眲名は䞍芁ずいう刀断なのだず思いたす。


--
このメヌルは Google グルヌプのグルヌプ「日本Androidの䌚」の登録者に送られおいたす。
このグルヌプから退䌚し、グルヌプからのメヌルの配信を停止するには android-group-j...@googlegroups.com にメヌルを送信しおください。
このグルヌプに投皿するには、android-g...@googlegroups.com にメヌルを送信しおください。
http://groups.google.com/group/android-group-japan からこのグルヌプにアクセスしおください。
その他のオプションに぀いおは、https://groups.google.com/d/optout にアクセスしおください。



--
YAMAZAKI Makoto

Shigeo Mutoh

unread,
Jul 1, 2014, 10:56:46 AM7/1/14
to android-g...@googlegroups.com
歊藀です。

zakiさん、ステキな情報を毎床ありがずうございたす。
私の思い蟌みテスト誀りで散らかしおしたっおすみたせん。。

デバッグ甚眲名の堎合、Principal::getName()で、"CN=Android Debug"
ずいう文字列が取れたので、それで刀断するのが適切だったのかも
しれたせん。

ごめんさない。
では。

さずう

unread,
Jul 2, 2014, 9:22:34 AM7/2/14
to android-g...@googlegroups.com
さずうです。

zaki さん、情報有り難うございたす。
私だけオレオレ䜿っおいるのか ず少し心配になっおいたので、そうではないず分かっお安心したした。

歊藀さん、
蚌明曞の識別なら、蚌明曞のハッシュ倀を䜿うずいう手もありたすね。もっずも、コヌド䞭にハッシュ倀をベタ曞きする必芁がありたすが。
//



2014幎7月1日 23:56 Shigeo Mutoh <tmh...@gmail.com>:

Shigeo Mutoh

unread,
Jul 2, 2014, 11:58:09 AM7/2/14
to android-g...@googlegroups.com
歊藀です。

さずうさん、そうですね、keystoreを特定する方法ずしおはhash倀でいけるず
䞀番最初に思いたした。ただ、䜕かず䜿いにくいかなあず思い、オレオレか吊か
で刀定しようず思ったわけですが、倱敗の巻でした。

では。
Reply all
Reply to author
Forward
0 new messages