karetta.jp開発日記 

2012/01/11 10:38:00

Androidでホーム画面(Launcher)のパッケージ名を得る

String launcher = null;
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
PackageManager pm = context.getPackageManager();
ResolveInfo info = pm.resolveActivity(intent,
        PackageManager.MATCH_DEFAULT_ONLY);
if (info != null) {
    ActivityInfo a = info.activityInfo;
    if (a != null) {
        launcher = a.packageName;
        Log.d(TAG, "launcher="+launcher);
    }
}

2011/10/28 13:49:00

Android開発のセキュリティチェックポイント

  • それはWebアプリケーションでは実現できないのか?
  • 要求するパーミッションは適切か?
    • 安易にREAD_PHONE_STATEを要求していないか?
  • 端末固有情報に依存した設計になっていないか?
  • そのアプリケーションには広告が必要か?
  • 認証方式は適切か?
    • 端末固有情報で認証しようとしていないか?(←論外)
  • SQLインジェクションに耐えられるか?
  • 任意のJavaScriptをロードできるようになっていないか?
  • rootをとられてもデータを守れるのか?
  • ユーザーに無断で情報を送信していないか?
    • 利用許諾は適切か?
    • 送信の都度、許可画面を表示しているか?
  • 難読化したからといって安心していないか?
    • ProGuardの限界
      • 文字列は難読化できない
      • 既存API呼び出しは難読化できない
  • Android Marketにロックインされていないか?
    • LVL
    • アプリ内課金
    • リファラー追跡
    • (C2DM)
    • 代替手段はないのか?
  • 本当にプリインストールする必要があるのか?
    • ユーザーが削除できない
    • 一般アプリより権限が強い

2011/10/19 16:51:00

Androidで圧縮されたAndroidManifest.xmlをパーズする方法

Class clazz = Class.forName("android.content.res.AssetManager");
Object am = clazz.newInstance();
Method addAssetPath =
    am.getClass().getMethod(
            "addAssetPath",
            new Class[]{ String.class });
Object c = addAssetPath.invoke(am, publicSourceDir);//.apkのフルパス
if (c != null) {
    int cookie = Integer.parseInt(c.toString());
    Method openXmlResourceParser =
        am.getClass().getMethod(
                "openXmlResourceParser",
                new Class[]{ int.class, String.class });
    Object p =
        openXmlResourceParser.invoke(am, cookie, "AndroidManifest.xml");
    if (p instanceof XmlResourceParser) {
        XmlResourceParser parser = (XmlResourceParser)p;
        int type;
        String tagName = null;
        while ((type = parser.next()) != XmlResourceParser.END_DOCUMENT) {
            switch (type) {
            case XmlResourceParser.START_TAG:
                tagName = parser.getName();
                // 要素開始の処理
                break;
            case XmlResourceParser.END_TAG:
                tagName = parser.getName();
                // 要素終了の処理
                break;
            }
        }
    }
}

注:こんなことやらなくてもPackageManager経由でAndroidManifest.xmlに書いてある情報はとれます。AndroidManifest.xmlを直接読まなければ取得できない情報はreceiverぐらい。


2011/08/23 11:40:00

Gingerbreadの.classpath

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
        <classpathentry kind="src" path="packages/apps/AccountsAndSyncSettings/src"/>
        <classpathentry kind="src" path="packages/apps/Bluetooth/src"/>
        <classpathentry kind="src" path="packages/apps/Browser/src"/>
        <classpathentry kind="src" path="packages/apps/Calendar/src"/>
        <classpathentry kind="src" path="packages/apps/Calculator/src"/>
        <classpathentry kind="src" path="packages/apps/Camera/src"/>
        <classpathentry kind="src" path="packages/apps/CertInstaller/src"/>
        <classpathentry kind="src" path="packages/apps/Contacts/src"/>
        <classpathentry kind="src" path="packages/apps/DeskClock/src"/>
        <classpathentry kind="src" path="packages/apps/Email/src"/>
        <classpathentry kind="src" path="packages/apps/HTMLViewer/src"/>
        <classpathentry kind="src" path="packages/apps/Launcher2/src"/>
        <classpathentry kind="src" path="packages/apps/Mms/src"/>
        <classpathentry kind="src" path="packages/apps/PackageInstaller/src"/>
        <classpathentry kind="src" path="packages/apps/Phone/src"/>
        <classpathentry kind="src" path="packages/apps/QuickSearchBox/src"/>
        <classpathentry kind="src" path="packages/apps/Settings/src"/>
        <classpathentry kind="src" path="packages/apps/SoundRecorder/src"/>
        <classpathentry kind="src" path="packages/apps/Stk/src"/>
        <classpathentry kind="src" path="packages/apps/Tag/src"/>
        <classpathentry kind="src" path="packages/apps/VoiceDialer/src"/>
        <classpathentry kind="src" path="packages/providers/CalendarProvider/src"/>
        <classpathentry kind="src" path="packages/providers/ContactsProvider/src"/>
        <classpathentry kind="src" path="packages/providers/DownloadProvider/src"/>
        <classpathentry kind="src" path="packages/providers/DrmProvider/src"/>
        <classpathentry kind="src" path="packages/providers/MediaProvider/src"/>
        <classpathentry kind="src" path="packages/providers/TelephonyProvider/src"/>
        <classpathentry kind="src" path="frameworks/base/awt"/>
        <classpathentry kind="src" path="frameworks/base/cmds/am/src"/>
        <classpathentry kind="src" path="frameworks/base/cmds/input/src"/>
        <classpathentry kind="src" path="frameworks/base/cmds/pm/src"/>
        <classpathentry kind="src" path="frameworks/base/cmds/svc/src"/>
        <classpathentry kind="src" path="frameworks/base/common/java"/>
        <classpathentry kind="src" path="frameworks/base/core/java"/>
        <classpathentry kind="src" path="frameworks/base/core/config/sdk"/>
        <classpathentry kind="src" path="frameworks/base/graphics/java"/>
        <classpathentry kind="src" path="frameworks/base/keystore/java"/>
        <classpathentry kind="src" path="frameworks/base/location/java"/>
        <classpathentry kind="src" path="frameworks/base/media/java"/>
        <classpathentry kind="src" path="frameworks/base/obex"/>
        <classpathentry kind="src" path="frameworks/base/opengl/java"/>
        <classpathentry kind="src" path="frameworks/base/packages/SettingsProvider/src"/>
        <classpathentry kind="src" path="frameworks/base/policy/src"/>
        <classpathentry kind="src" path="frameworks/base/sax/java"/>
        <classpathentry kind="src" path="frameworks/base/services/java"/>
        <classpathentry kind="src" path="frameworks/base/telephony/java"/>
        <classpathentry kind="src" path="frameworks/base/test-runner/src"/>
        <classpathentry kind="src" path="frameworks/base/voip/java"/>
        <classpathentry kind="src" path="frameworks/base/vpn/java"/>
        <classpathentry kind="src" path="frameworks/base/wifi/java"/>
        <classpathentry kind="src" path="development/samples/ApiDemos/src"/>
        <classpathentry kind="src" path="development/samples/ApiDemos/tests/src"/>
        <classpathentry kind="src" path="development/samples/Compass/src"/>
        <classpathentry kind="src" path="development/samples/HelloActivity/src"/>
        <classpathentry kind="src" path="development/samples/HelloActivity/tests/src"/>
        <classpathentry kind="src" path="development/samples/Home/src"/>
        <classpathentry kind="src" path="development/samples/LunarLander/src"/>
        <classpathentry kind="src" path="development/samples/LunarLander/tests/src"/>
        <classpathentry kind="src" path="development/samples/NotePad/src"/>
        <classpathentry kind="src" path="development/samples/NotePad/tests/src"/>
        <classpathentry kind="src" path="development/samples/RSSReader/src"/>
        <classpathentry kind="src" path="development/samples/SkeletonApp/src"/>
        <classpathentry kind="src" path="development/samples/SkeletonApp/tests/src"/>
        <classpathentry kind="src" path="development/samples/Snake/src"/>
        <classpathentry kind="src" path="development/samples/Snake/tests/src"/>
        <classpathentry kind="src" path="development/apps/Term/src"/>
        <classpathentry kind="src" path="libcore/dalvik/src/main/java"/>
        <classpathentry kind="src" path="libcore/icu/src/main/java"/>
        <classpathentry kind="src" path="libcore/json/src/main/java"/>
        <classpathentry kind="src" path="libcore/junit/src/main/java"/>
        <classpathentry kind="src" path="libcore/luni/src/main/java"/>
        <classpathentry kind="src" path="libcore/xml/src/main/java"/>
        <classpathentry kind="src" path="out/target/common/obj/APPS/ApiDemos_intermediates/src/src"/>
        <classpathentry kind="src" path="out/target/common/obj/APPS/Browser_intermediates/src/src"/>
        <classpathentry kind="src" path="out/target/common/obj/APPS/CalendarProvider_intermediates/src/src"/>
        <classpathentry kind="src" path="out/target/common/obj/APPS/ContactsProvider_intermediates/src/src"/>
        <classpathentry kind="src" path="out/target/common/obj/APPS/Email_intermediates/src/src"/>
        <classpathentry kind="src" path="out/target/common/obj/APPS/Music_intermediates/src/src"/>
        <classpathentry kind="src" path="out/target/common/obj/APPS/Phone_intermediates/src/src"/>
        <classpathentry kind="src" path="out/target/common/obj/APPS/QuickSearchBox_intermediates/src/src"/>
        <classpathentry kind="src" path="out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java"/>
        <classpathentry kind="src" path="out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/location/java"/>
        <classpathentry kind="src" path="out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/media/java"/>
        <classpathentry kind="src" path="out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/telephony/java"/>
        <classpathentry kind="src" path="out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/voip/java"/>
        <classpathentry kind="src" path="out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/vpn/java"/>
        <classpathentry kind="src" path="out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/wifi/java"/>
        <classpathentry kind="src" path="out/target/common/obj/JAVA_LIBRARIES/services_intermediates/src"/>
        <classpathentry kind="src" path="out/target/common/R"/>
        <classpathentry kind="src" path="external/tagsoup/src"/>
        <classpathentry kind="src" path="external/apache-http/src"/>
        <classpathentry kind="src" path="external/bouncycastle/src/main/java"/>
        <classpathentry kind="src" path="external/nist-sip/java"/>
        <classpathentry kind="lib" path="packages/apps/Calculator/arity-2.1.2.jar"/>
        <classpathentry kind="lib" path="out/target/common/obj/JAVA_LIBRARIES/core_intermediates/javalib.jar"/>
        <classpathentry kind="lib" path="out/target/common/obj/JAVA_LIBRARIES/android-common_intermediates/javalib.jar"/>
        <classpathentry kind="lib" path="out/target/common/obj/JAVA_LIBRARIES/guava_intermediates/javalib.jar"/>
        <classpathentry kind="output" path="out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates/classes"/>
</classpath>

2011/08/22 15:42:00

Androidで実行時にキャリアを取得する方法

これを読んでおかしいなあと思って調べてみた。

正解は下記。(なかのひとさんありがとう)

TelephonyManager tm =
        (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
String spn = tm.getSimOperatorName();

参考: 「設定」の「 端末の状態」と同じことをやってみあた。

package com.example.phone.info.test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class Main extends Activity {
    private static final String TAG = Main.class.getName();
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        try {
            Class telephonyProperties =
                Class.forName("com.android.internal.telephony.TelephonyProperties");
            Log.d(TAG, "onCreate: telephonyProperties="+telephonyProperties);

            Field[] fields = telephonyProperties.getFields();
            Log.d(TAG, "onCreate: fields="+fields);
            
            Class systemProperties =
                Class.forName("android.os.SystemProperties");
            Log.d(TAG, "onCreate: systemProperties="+systemProperties);
            
            Method get =
                systemProperties.getMethod("get", new Class[] { String.class });
            Log.d(TAG, "onCreate: get="+get);

            for (Field f: fields) {
                Object obj = f.get(null);
                Object result = get.invoke(systemProperties, new Object[] { obj });
                Log.d(TAG, "onCreate: obj="+obj+", result="+result);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

上記を実行した結果、こんなLogCatが得られた。

08-22 15:44:40.835: DEBUG/com.example.phone.info.test.Main(15121): onCreate: obj=gsm.sim.operator.alpha, result=NTT DoCoMo

実験結果: SystemProperties.get("gsm.sim.operator.alpha")

追試希望: auの場合、"cdma.sim.operator.alpha"になりはしないのか。だれか追試して。


About Me
えんどうやすゆき

12月2012年1月2月
1234567
891011121314
15161718192021
22232425262728
293031

Recent Articles
Androidでホーム...
Android開発の...
Androidで圧縮さ...
Gingerbread...
Androidで実行時...
セキュアAndroid...
Gingerbread...
Baseband Ve...

Archives
2012-01
2011-10
2011-08
2011-03
2010-09
2008-04
2008-01
2007-12
2007-11
2007-10
2007-09
2007-08
2007-07
2007-06
2007-05
2007-04
2007-03
2007-02
2007-01
2006-12
2006-11
2006-10
2006-09
2006-08
2006-07
2006-06
2006-05
2006-04
2006-03
2006-02
2006-01
2005-12
2005-11
2005-10

このサイトについて|ヘルプ|Q&A|個人情報保護|プライバシーポリシー|利用規約|コメント・トラックバック規約|削除規程|広告掲載
Copyright (c) 2005-2007 Time Intermedia Corporation