サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
大谷翔平
blog.kmckk.com
2011年06月21日 Androidでkeyイベントを発生させるinputコマンドをサクサクにする 以下のページでAndroidのinputコマンドが紹介されていました。 adbを使って端末にキーイベントを送る - TechBooster このコマンドを詳しく見てみます。 inputコマンドの使い方 コンソールかadbのshellから単にinputと打ってみます。 # input usage: input [text|keyevent] input text <string> input keyevent <event_code> このinputコマンドを使うと任意のキーイベントをコマンドラインから発行することができます。 実際のキーイベントのコードはandroid.view.KeyEvent.javaに定義されています。 便利そうなものをピックアップすると public static
2023年12月06日 GNU ldとLLVM lldのロケーションカウンタの扱いの違い 従来は Linux や Apple などのリッチ OS のアプリ向けというイメージだった LLVM の高速リンカ lld ですが、LLVM 17 で GNU ld との互換性がほぼ完璧になり、AArch64/ARM/RISC-V のベアメタルツールチェーンでも GNU ld を置き換えできることが確認できました。そこで弊社の SOLID もリンクの高速化や Clang での LTO などを期待して lld 対応を進めているのですが、その時に 1 点だけ非常にわかりにくい非互換性に悩まされたのでメモしておきます。 続きを読む kmckk at 20:24│コメント(0)│LLVM|若槻 2023年10月26日 MSYS2のバグ?(Bad address) 業務でシェルスクリプトを書いていて、非常に不可解
2011年03月03日 AndroidでのJavaプログラムの起動やZygoteまわりのメモ 以前調べたことをもう一度掘り起こしてみました。 Zygoteの簡単な説明 Androidではアプリケーションや多くのその他のプログラムはJavaで記述されています。これらのプログラムはDalvikVMの上で動きます。 それらのJavaのプログラムを起動するたびにDalvikVMを起動するのではなく、Zygoteと呼ばれるDalvikVMの大元のプロセスに要求を出すと、そのプロセスがforkシステムコールを使って自分自身のコピーの子プロセスを生成し、その子プロセスで指定されたJavaのプログラムを実行するようになっています。 Zygoteは通常必要となる全てのダイナミックリンクライブラリとJavaのクラスライブラリをロードした状態で待機しています。子プロセスはそれをコピーした状態から開始されるので起
2010年08月26日 AndroidのNDKツールを使ってrubyをビルドして動かす 前回の知識を使ってNDKのツールで先日リリースされたruby-1.9.2をビルドしてAndroid上で動かしてみました。 (2011.7.21) アップデート記事を書きました。 RubyをAndroid用にビルドする 開発環境にはUbuntu 9.04 (x86_64)を使っています。 準備 ruby 1.9.2をクロスビルドするためには、そのホストでruby 1.9.2がインストールされている必要があります。(ビルド中に実行されるrubyスクリプトが1.9.2用になっているため。) $ tar xvf ruby-1.9.2-p0.tar.bz2 $ mkdir obj $ cd obj $ ../ruby-1.9.2-p0.android/configure $ make $ sudo make in
2011年02月22日 Androidのデバッグダンプからソース上の問題発生箇所を調べる方法 今回もAndroidのアプリケーション開発者でなくて、ポーティングなどでシステム部分の問題を追いかける人が知っておくとよい話です。(English version of this page) 実機でいろいろいじくって動かしていると、いつまでもandroidの起動アニメーションのままになって立ち上がってこなくなってしまうことがあります。このときにシリアルのコンソールからlogcatを見てみると、以下のようにあるプロセスが例外を起こして落ちてしまっていたりします。 ログのこの部分はdebuggerdが出しています。(debuggerdのしくみは以前に紹介しました。) I/DEBUG ( 3037): *** *** *** *** *** *** *** *** *** *** *** *** ***
2010年12月09日 Androidのinit Androidで一番最初に起動するユーザープロセスであるinitについて調べたのでそのメモ。 (注:この記事はAndroid 2.2のソースコードに関するもの。) /init initはルートディレクトリの直下に置かれている。すなわち、/init 通常のLinuxではinitは /sbin/init Linuxカーネルはデフォルトの設定では最初のプロセスを /sbin/init /etc/init /bin/init /bin/sh の順に探しにいく。(kernelのinit/main.c init_post参照) このため、Androidを起動するときにはカーネルのブートパラメータに "init=/init" を追加して明示的にinitのパスを指定しなければならない。それを忘れると "No init found. Try passing
2011年12月05日 Android 4.0で利用されているLLVM Android4.0(Ice Cream Sandwich)のソースコードを見て、RenderScriptにLLVMの技術が使われているのがわかりました。(正確には3.xからですが、ソースが公開されていなかったので詳細を確認できませんでした。) 技術的な興味で少し調べたのでここにメモを残します。 Android RenderScript on LLVM この資料から図を拝借して。 ホスト側で .rsファイルから.bc(bitcode: LLVMの中間言語フォーマット)にコンパイルするとともに、関数の呼び出しのためのラッパーメソッドや変数のgetter/setterメソッドのJavaソースコードが自動生成される。このためJavaとRenderscript間でのやりとりは簡単。JNIは不要。 ターゲット側で (図中ではJa
2013年02月08日 Makefileの依存関係の記述を自動化する簡単な方法 ビルドにmakeコマンドを使うときにはMakefileにファイルの依存関係を書いておく必要があります。 しかし、開発の途中でインクルードするヘッダファイルが増えてくると、これらの依存関係を手作業で記述するのは面倒です。(そして、これをサボったことでハマることもよくあることです。:) ここでは、gccの機能を使ってこれを自動化する方法を紹介します。 gccのプリプロセッサで依存関係を自動生成する gccでコンパイルするときに -MD というオプションをつけると、コンパイルとともに拡張子が.dのファイルが作成されます。これはMakefileと同じ書式でそのファイルの依存関係が記述されています。 詳しくはgccのマニュアルを参照してください。 http://gcc.gnu.org/onlinedocs/gcc-4.7
2010年02月25日 QEMUのもうひとつの使い方: ユーザーモードエミュレーションとbinfmtとchrootの組み合わせ QEMUの上でDebianなどが動いていると、apt-get で簡単にコンパイラなどもインストールすることができます。しかし、そこで実際にビルドを行うととんでもなく時間がかかります。一晩かけても終わらないこともあります。 QEMUには今まで紹介してきたような、システム全体をエミュレートするものの他に、Linuxのユーザーモードのみをエミュレートするものがあります。今回はユーザーモードエミュレーションを紹介します。 ユーザーモードエミュレーションを利用することでビルドにかかる時間を1/10に短縮することができました。 rootstockに隠された技 前回Ubuntuのインストールの時にルートファイルシステムを構築するのにrootstockというコマンドを使いました。
2009年08月17日 UNIX v6 を x86 マルチプロセッサシステムに移植した xv6 MIT の教育システムは本当にすごいですね。 xv6 という、MIT の OS の講義のために、UNIX v6 を ANSI C で書き直して、x86 マルチプロセッサシステムに移植したものが存在することを、ひらさんの twitter で知りました。 wikipedia がよくまとまっています。Lions 本のように、読みやすくソースコードが編集された PDF へのリンクもあります。OS のソースコード全部で、たったの 75 ページと、非常にコンパクト。 http://en.wikipedia.org/wiki/Xv6 他にも MIT は、初級計算機科学の講義のために書かれた SICP (日本語訳 : 計算機プログラムの構造と解釈)などでも非常に有名です。(こちらは Scheme でプログラムが
2009年12月21日 ARM Linux の移植 新しいターゲットボードに ARM Linux を移植するとき、何をすれば良いのか、各ファイルにはどのような役割があるのか、なかなかわかりにくいと思います。 自分の経験を元に、以下にまとめてみます。内容は無保証です。 ROM 化の部分は扱いません。make vmlinux できるところまでです。とりあえず vmlinux (圧縮前の ELF 形式) さえできれば、PARTNER から直接実行できます。 > l /path/to/vmlinux,/offs=xxxxxxxx # ロードしたい DRAM 物理アドレス位置へのオフセットを指定 > _pc=xxxxxxxx # pc をロードした位置に合わせてセット。 > _r1=xxxx # machine number を正しくセットしておかないとブートできません。 > g # 実行 (それ以
2011年12月21日 Android 4.0でZygoteを起動せずに最小構成で動かす Androidのinit.rcでは複数のserviceをまとめて扱うclassを定義することができます。この機能は以前からあったのですが、使われていませんでした。 Android 4.0ではinit.rcを少し修正することで、ZygoteなどAndroidのframeworkのserviceが起動する前の、最小限の構成までで止めることができます。 最小構成で動かす 通常状態でのプロセスは以下のものが動いています。 $ ps USER PID PPID VSIZE RSS WCHAN PC NAME root 1 0 332 196 ffffffff 00000000 S /init ... (kernel threadは省略) ... root 41 1 328 180 ffffffff 000000
2010年05月26日 AndroidのFroyoのJITについて 先日サンフランシスコで開催されたGoogle I/OのキーノートでAndroid2.2(コードネーム:Froyo)でJITコンパイラが搭載されることが発表されました。そしてJITに関するセッションもありました。私はサンフランシスコに行ったわけではありませんが、現地からUSTREAM中継してくれた方がいたおかげでセッションのスライドを見ることができました。また、そのセッションのGoogle Waveにも有用な情報が載っています。それらから情報を拾ってまとめてみました。 いつコンパイルするか?何をコンパイルするか? 通常のJITコンパイラはメソッド単位でコンパイルを行いますが、それ以外の方法としては、メソッドの一部のみをコンパイルする方法があります。後者を"Trace granularity JIT"と呼んでいます。 後者はイ
2011年01月27日 Androidのキー入力イベント処理のメモ Androidでキー入力があったときに、それはどういう経路を伝わるのか? 電源キーを長押しするとシャットダウンのメニューが表示されるが、これはどこでやっている? このあたりのことを調べるためにソースコードを追いかけたときのメモです。Androidのフレームワークの中の話で、アプリケーションからは見えない部分です。 Android 2.2のソースを見ました。2.3では少し変わっているようです。 カーネルからキーインプットイベントを得るところ frameworks/base/libs/ui/EventHub.cpp システムコール inotify_add_watch を使って /dev/input以下をまとめて監視しています。 キー入力は /dev/input/event0 で タッチパネルは /dev/input/event
2010年09月09日 ARM Debian/Ubuntuの上でAndroidを動かす 先日のCELFテクニカルジャンボリーでは、ARMのUbuntuの上でAndroidを動かすデモを行いました。 これを応用することで、既存のユーザーモードデバイスドライバやそれに付随するデーモンプロセスを無変更のままでAndroidと共存させることができます。 その続報です。 Android側からSDメモリカードが使えるようになりました。 既存のLinux環境の上でまるごとのAndroidを動かす方法 前回のスライドのおさらいです。 そのボード上にAndroidをポーティングする。NFSrootにするとよい。 その時使ったAndroid用にpatchをあてたカーネルを使って既存のLinuxを動かす。 既存のLinuxのユーザーランドに /androidというディレクトリを作って、そこにandroidのユー
2010年12月28日 Androidのrepo syncのTips Androidのソースコードをダウンロードするにはrepo sync を行いますが、 これには相当時間がかかります。 その時間を節約するためのちょっとしたTipsを紹介します。 (English version of this page) 既存のリポジトリからコピーすることでダウンロード量を減らす もし既存のソース(例えばandroid-2.2_r1.1)をダウンロードしていたならば、そのリポジトリを利用することでダウンロードする量を減らすことができます。 $ mkdir android-2.3.1_r1 $ cd android-2.3.1_r1/ $ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-2.3.1_r1
2010年08月17日 AndroidのJavaアプリからスタックトレースをログに出す簡単な方法 AndroidのJavaアプリからログを出すには android.util.Logクラスを使います。 実はスタックトレースを出すためのメソッドもあるのですが、あまり知られていないようなのでここで紹介します。 Logクラスのstatic methodのLog.e, Log.w, Log.i, Log.d, Log.vは2つの引数(String tag, String msg)の他に3つの引数(String tag, String msg, Throwable tr)のものがあります。引数3個のほうはtrのスタックトレースを一緒にログに出してくれます。 私は別件のためにソースを見ていて見つけました。android.util.Logクラスのソースは $ANDROID_TOP/frameworks/b
2013年03月07日 U-Bootのデバッグ 先日のKMCセミナーでU-Bootの話をしました。その中から一部をピックアップして紹介します。 U-Bootのブートシーケンス まずは古典的でシンプルなブートシーケンスです。電源投入するとCPUはNORフラッシュ上のU-Bootを実行します。U-BootはDRAMなど必要なハードウェアの初期化を行った後に、なんらかの方法でLinuxカーネルをDRAM上にロードし、制御を移します。Linuxカーネルをロードする元としては、NORフラッシュや、NANDフラッシュ、SDカード、あるいはtftp等のプロトコルでネットワーク経由でロードしたりします。 U-Bootのデバッグを行うには、まずはこの方法で試すのがよいでしょう。KZM-A9-GTボードにはこれが可能なようにNORフラッシュメモリを搭載しています。 最近のブートシーケンスはもっと複雑になってい
2011年03月17日 AndroidのBinderによるプロセス間のメソッド呼び出し(メモ) Androidのシステムでは同時にたくさんのプロセスでJava言語で書かれたプログラムがDalvikVMによって動いています。intentを発行して別のプロセスで処理を実行できることがAndroidでのプログラミングの大きな強みです。 このようなプロセスをまたがったメソッド呼び出しは下位レベルではBinderという技術が使われているのですが、私はいままでそれがぼんやりとしか理解できていませんでした。 ソースコードを無理やり追いかけたら、わかりかけてきたのでメモを残します。 Androidのアプリケーションプログラムから別のアプリケーションを起動するにはIntentを発行すればよいのですが、それには android.app.Activity#startActivity メソッドを使用します。 その
2011年04月21日 Androidのブートアニメーション Androidをパワーオンリセットをするたびに目にするブートアニメーションですが、実はよくわかっていませんでした。これはいつだれがスタートして、いつだれがストップするのでしょうか? ブートアニメーションのソースコード frameworks/base/cmds/bootanimation これを見るとANDROIDの文字のアニメーションはOpenGL ESで書かれていることがわかります。 また、/data/local か /system/media にbootanimation.zip というファイルがある場合はそれをムービーとして再生するようになっています。Nexus Oneの場合はそうなっていました。(そのファイルを取ってきてKZM-A9-Dualに入れたらNexus Oneと同じブートアニメーションになりました。) boot
2010年06月29日 Android2.2(Froyo)のダウンロードとビルド 6/24にAndroid2.2(Froyo)のソースが公開されました。さっそくビルドしてみたので、その方法を簡単に紹介します。 準備 Android2.1がビルドできた環境を用意してください。ここではその説明は省略。 私はx86_64のUbuntu 9.04を使っています。 ダウンロード froyoのブランチを明示してrepo init します。 $ mkdir android-froyo $ cd android-froyo/ $ repo init -u git://android.git.kernel.org/platform/manifest.git -b froyo $ repo sync 私がやったときには74分かかりました。 2010.7.7追記 androidのソースリポジトリにfroyo-r
2011年04月12日 Androidのプロセス間のメソッド呼び出し(図解) 先日4月9日に開催された横浜 Android プラットフォーム部の第7回勉強会でAndroidのプロセス間のメソッド呼び出しの話をしました。 その発表資料を貼っておきます。 Android ipm 20110409 View more presentations from Tetsuyuki Kobayashi 参考になるページ 横浜 Android プラットフォーム部の第3回勉強会 Android SDK WG 第1回 セッション(2008.10.25) 関連するページ AndroidのBinderによるプロセス間のメソッド呼び出し(メモ) AndroidのBinderによるプロセス間のメソッド呼び出し(メモ2:AIDL) AndroidのBinderによるプロセス間のメソッド呼び出し(メモ3:Binder T
2011年04月07日 AndroidのLooperとHandlerの実装 今回はAndroidのLooperとHandlerの話。 LooperはActivityのメインスレッドでも使われています。それはstacktraceを見るとわかります。(こちら) スレッド間のメッセージの受け渡しに使われています。こちらのページがわかりやすいです。 今回はこの実装を見ていきます。 JavaDocに載っているLooperとHandlerの使い方の例です。 class LooperThread extends Thread { public Handler mHandler; public void run() { Looper.prepare(); mHandler = new Handler() { public void handleMessage(Message msg) { // proce
2010年09月30日 Android on UbuntuでUbuntu側からAndroidのアプリを起動する 9/28に開催されたCELFのBoFでプレゼンとデモをさせていただきました。 このデモの中で使ったAndroid on UbuntuでUbuntu側からAndroidのアプリを起動するためのスクリプトを紹介します。 まずはその時の説明資料です。今回はビデオはありません。 Android On Ubuntu for developerView more presentations from Tetsuyuki Kobayashi. Androidでコマンドラインからintentを発行してアプリを起動するのにamというコマンドが使えます。 それの中身は以下の通り。たった数行のshellスクリプトでした。 /system/bin/am # Script to start "am" on
2010年09月02日 Androidで他のARM Linuxのバイナリを動かす 前回はAndroid用にrubyをビルドする方法を紹介しましたが、実はビルドしなくても済む方法もあります。今回はそれを紹介します。 実はARM Ubuntu 10.04の実行ファイルのバイナリをAndroidにコピーしたらそのまま動きました。ただし必要なファイルを全てコピーする必要があります。 (ARM Ubuntu 10.04はarmv7用に最適化されています。今回AndroidはKZM-CA9-01ボードで動かしています。) bashをコピーして動かす Ubuntuの/bin/bashはダイナミックリンクされています。このファイルを起動するためには以下のダイナミックリンクライブラリが必要です。 ARMのUbuntuで以下を実行します。 user@arm-lucid:~$ ldd /bin/bash lib
2011年04月19日 AndroidのSystemServerの起動シーケンス(メモ) SystemServerが起動して各種のサービスが起動するまでのシーケンスをメモしました。 (参照したソースはandroid-2.3.3_r1) (English version of this page) initからapp_processを起動。 init.rc service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server socket zygote stream 666 onrestart write /sys/android_power/request_state wake onrestart write /sys/power/state on onrestart resta
2009年07月03日 素朴な C (pre K&R C) のお話 1969 年に Bell Lab の Kenneth L. Thompson と Dennis M. Ritchie がプロトタイプを作成した時から数えて、今年は UNIX 40 周年の節目だそうです。UNIX の 1/4 世紀という本がありますが、あと10 年したら UNIX の半世紀ですね。 ちょっと昔の話をしたいと思います。35 年近く前の C の話です。(もちろん私は 20 代なので、まだ生まれてません。)1975 年、UNIX v6 がリリースされました (後の BSD UNIX につながる版です)。この版は pre K&R C という、現代の C (C99) から見ると非常に素朴な C で実装されています。 Dennis M. Ritchie, "C Reference Manual" (1975) http:
2011年05月31日 Androidのファイルシステム Android端末でのファイルシステムの構成を調べました。 典型的なAndroidのファイルシステム rootはinitrdのramdiskになっています。 その下にsystem, data, cache にフラッシュメモリのパーティションがマウントされます。 rootとsystemはread onlyでマウントされていて、data, cacheはread/writeでマウントされます。 rootの下には/dev, /proc, /sys 等もマウントされます。これらは通常のLinuxと同じです。 KZM-A9-Dualボードに移植するときには、これらのディレクトリツリーをまるごとNFSやSDに置くようにしています。また、実験のために全てread/write可能な状態でマウントします。 Nexus One $ df df Files
2010年08月24日 AndroidのNDKのツールを使って実行ファイルをビルドする簡単な方法 AndroidのNDKはJavaからJNIを経由して呼び出すダイナミックリンクライブラリを作るためのツールですが、ここに含まれるコンパイラとインクルードヘッダ、ライブラリを使って普通にmainから始まる実行ファイルをビルドすることもできます。ここではその簡単な方法を紹介します。 Makefileの記述 Makefile NDK_TOPにはNDKをインストールしたディレクトリを指定します。 NDK_TOP=/path/to/your/android-ndk-r4b CC = $(NDK_TOP)/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/arm-eabi-gcc LIBS = -llog TARGET_ARCH_CFLAGS = -march=arm
次のページ
このページを最初にブックマークしてみませんか?
『KMC Staff Blog』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く