• Save
Android組込み開発基礎コース Armadillo-440編
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Android組込み開発基礎コース Armadillo-440編

on

  • 2,756 views

OESF公認 ...

OESF公認
Android組込み開発基礎コース Armadillo-440編
公式トレーニングテキスト(日本語)

Contributed by:
【作成】株式会社OKIソフトウェア
    株式会社リーディング・エッジ社
    
【ご注意】
本テキストは、Creative Commons License BY-NC-SA 4.0のもとで提供されます。OESF会員またはコンソーシアムメンバーでない場合、本編の改変の有無にかかわらず、いかなる形態でも商用目的での利用は禁止されています。

Statistics

Views

Total Views
2,756
Views on SlideShare
2,421
Embed Views
335

Actions

Likes
4
Downloads
0
Comments
0

3 Embeds 335

http://oesf-edu.com 239
http://www.slideee.com 77
http://s.deeeki.com 19

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

CC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Android組込み開発基礎コース Armadillo-440編 Presentation Transcript

  • 1. 20130317改変 Android組込み開発 基礎コース Armadillo-440 編 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-0
  • 2. テキストのご利用に関して ・ 本コースのテキストは、 Creative Commons License BY-NC-SA 4.0に基づいて提供されています。改変の有無にかかわらず、商用 目的での利用は禁止されています。 ・ 本教育プログラムは、その中で提供される教材全てを含め、OESF からのいかなる保証もなしに提供されます。OESFは、本コースの内 容またはコースの詳細な情報を使用することに起因して、または 誤って使用することに起因して何らかの障害や法的な行為が生じて も、いかなる責任も負いません。 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-1 1
  • 3. トレーニングの目的 • LinuxとAndroidの違いを理解します • LinuxとAndroidの起動手順の違いを理解します • 組込みLinuxとAndroidの開発環境を構築できるよ うになります • Androidのビルドおよび実機での動作方法を理解 します • 実機のデバッグ方法を理解します • 演習を通してプラットフォーム開発を体験します This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-2 2
  • 4. 受講するに当たって必要なスキル • OSの概念を理解している事 • Java言語またはC/C++言語の開発経験がある事 – 基本的なJavaやC/C++の言語仕様について理解があれば 問題ありません • Linuxのコマンド操作経験がある事 – 演習では実際にLinuxコマンドを操作して移植作業を実 施します • Eclipseを使用した経験がある事 – Androidのアプリケーション開発はEclipseを使用しま す This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-3 3
  • 5. 目次 1章. Linux概要 2章. Android概要 3章.ターゲットのボード 4章.実機でAndroidを動かす(実習) 5章.デバイスの組み込み 6章. NDK/JNI概要 7章. シリアルデバイスアプリケーション作成(実 習) This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-4 4
  • 6. 第1章 Linux概要 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-5
  • 7. 1章の概要 • • • • • • Linuxとは ルートファイルシステム 起動シーケンス Initの概要 組み込み向けOS 組み込みLinux This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-6 6
  • 8. Linuxとは?      1998年~ オープンソースで完全フリーで世界中で最もよく使われている GPLライセンス(ソースコードの公開義務) UNIX*1のクローンなのでUNIXの一部資産が流用可能 リーナス・トーバルズ氏が開発/公開したOS :カーネルのみの提供( kernel.org)  Linus中心の強固な管理体制と安定性の確保  主なLinuxシステム(ブートローダーやfsも含む)のディストリビューシ ョン  Debian系:パッケージ管理はdeb形式  Debian GNU Linux、Ubuntu: とが理念 コミュニティベース、100%フリーであるこ  RedHat系:パッケージ管理はRPM形式  Fedora、VineLinux : RedHatLinux後継のコミュニティによる実験 要素が強い *1 : UNIXは現在BSD系UNIXとして存続(FreeBSD,NetBSD) This material is Linux(商用)  RedHat Enterpriselicensed under the Creative Commons License BY-NC-SA 4.0. 0-7 7
  • 9. Debian系Linuxの起動シーケンス Power ON or Reboot initrd 起動に必要なドライバが格納さ れている一時的なルートファイ ルシステム(初期RAMディス ク) /etc/initt ab BIOS ブートデバイスの専用ブロック読み出し ブートロー ダ Boot カーネル メモリに展開 基本設定 ・ネットワーク ・キーボード ・デバイス初期化 デーモンの起動 (rcスクリプト経 login:hogetaro 由) ini t シェル password: $ login LILO/GRUBなど 起動パラメータの設定 CPU初期化 ハードウェアのチェック ドライバ読みこみ 起動用ファイル(init) が ある領域のマウント initは以下のいずれかの場所にある /sbin/init, /etc/init, /bin/init, /bin/sh This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-8 8
  • 10. Debian系Linuxのinitが行う設定 • initが行う各種設定はinittabに記載されている情報 を元に行う # デフォルトランレベル3 init デーモン 1 デーモン 2 id:3:initdefault: # ブート時の処理(システム初期化スクリプト) si::systeminit:/etc/init.d/rcS #各ランレベル用のrcスクリプトを実行し、その終了を待 つ 10:0:wait:/etc/init.d/rc 0 11:1:wait:/etc/init.d/rc 1 デーモン 12:2:wait:/etc/init.d/rc 2 3 13:3:wait:/etc/init.d/rc 3 14:4:wait:/etc/init.d/rc 4 15:5:wait:/etc/init.d/rc 5 16:6:wait:/etc/init.d/rc 6 # 1度だけ実行される処理(/sbin/update実行) ud::once:/sbin/update # 端末制御(ランレベル2~5で/sbin/mingetty実行) # 終了されると再実行 1:2345:respawn:/sbin/mingetty tty1 : # ランレベル5の時のログイン処理(/ etc/X11/prefdmを 実行) 0-9 # 終了されると再実行 This material is licensed under the Creative Commons License BY-NC-SA 4.0. /etc/initt ab 9
  • 11. Debian系Linux の inittabの書式 initdefa ult アクションの種 類 システム起動完了時に入るべきランレ ベル /etc/init.d/rcSがやること ∟/etc/default/rcSを実行 ∟/etc/rcS.d内のスクリプト全てを実行 • • • • • • ホスト名の設定 クロックの設定 キーマップの設定 言語とフォントの設定 ハードディスクの検査と修復 ハードディスクのマウント respawn プロセスが終了したらすぐに再起動す る ondemand respawnと同じだがオンデマンドラン レベルが指定された場合のみ実行する wait プロセスが終了するまで待機してラン レベルになったときだけ実行する once 指定ランレベルになったときだけ一度 だけ実行する ランレベルと動作モー ド 0 Halt off 何もしない 1 boot システム起動中に実行する シングルユーザモ ード bootwait システム起動中に実行し、プロセスが 終了するまで待機 2 3 4 マルチユーザモー ド (text) sysinit システム起動中に実行する( boot,bootwaitより先に実行される) 5 マルチユーザ(X) 6 reboot ctrlaltd el SIGINTを受け取ったときに実行する Commons License BY-NC-SA 4.0. This material is licensed under the Creative 0-10 10
  • 12. Debian系Linux の ルートファイルシステム root / bin boot dev etc lib mnt(media) opt proc home/root sbin sys tmp usr var コマンド類 起動ファイル デバイスファイル 設定ファイル ライブラリ、カーネルモジュール マウントポイント 追加アプリケーション カーネル情報(cpu、process、メモリ情報の参照 ユーザのホームディレクトリ システム管理コマンド(shtdown、mountなど) システムレポジトリ 一時ファイル 各種ユーザプログラム 可変データ(ログ、キャッシュ、スプーラなど) This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-11 11
  • 13. 組込み機器向けOSの条件 • 少ない資源(メモリ)で動作可 能 • リアルタイムオペレーティング システム This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-12 12
  • 14. 従来の組込み向けOS OS名 VxWorks WindowsCE T-kernel T-kernel Extension Windows Phone7 iOS Symbian OS 提供 開発環境 主な用途 価格 対応PF ウィンドリバー Eclipse 組込み機器全般 有償 ソースコードは 別途購入 マイクロソフト Windows CE Toolkit for Visual C++/Visual BASIC (Visual Studio) 組込み機器全般 有償 Closed Source ARM他 多数 組込み機器全般 無償/有償 Open Source (ただし独自の ライセンス) ARM SH M32 Visual Studio WindowsPhone専用 プロプライエタ リ EULA形式の契約 書が必要 ARM Apple XCodeIDE iPhone/ iPad専用 プロプライエタ リ EULA形式の契約 書が必要 ARM Nokia Carbide C++ (Eclipse) MOAP,S60,UIQ3 携帯電話/スマー トフォン SDKは有償版と 無償版がある OpenSource 0-13 ARM T-Engineフォーラ ム MicroSoft Eclipse for PMC T-Kernel This material is licensed under the Creative Commons License BY-NC-SA 4.0. ARM他 多数 13
  • 15. 組込み向けLinux OS名 MontaVista Linux 提供 米モンタビスタソフトウ ェア 主な用途 携帯電話向け 価格 対応PF 有償 x86、 PowerPCMIPS など Wind River Linux Wind River 組込み機器全般 有償 x86、 PowerPC、 MIPS、 Tizen Linux Foundation/LiMo Tizen Association 組込み機器全般 無償 オープンソース ARM Intel(X86) AxLinux アックス 組込み機器全般 有償 ARM、OMAP SHなど 組込み機器全般 オープンソース ソフトウェアコン ポーネント:提供 各社ライセンスに よる ARM他 多数 スマートフォン タブレット 無償 オープンソース ARM Lineo uLinux リネオ ソリューション ズ株式会社 Android Google & OHA 無償 ARM オープンソース OMAPなど Tizen Association・・・docomo, intel, orange, Panasonic, SAMSUNG, NEC, Sprint, HUAWEI, vodafoneなどが参加 Embedded Master OESF 組込み機器全般 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-14 14
  • 16. 組込みLinuxの特徴 • Linuxカーネルに少数のフリーソフトウェアを組み合わせ たもの • 組込みCPUアーキテクチャのサポート • ARM、MIPS、X86など • RAMや二次記憶装置などの容量が小さい • 2MB以下のメモリで起動可能 • 組込み機器のアプリケーションや対象ハードウェアに必要 な機能に特化 • MMUユニット※のないCPUでも動作可能(CONFIG_MMU=n) • シングルプロセッサに最適化可能(CONFIG_SMP=n) • NANDの直接使用(JFFS2、UBIFS) • ファイルシステム • マウント速度が速い(YAFFS2など) • 読み出し専用(romfs) This material is licensed under the Creative Commons License BY-NC-SA 4.0. ※MMU:メモリ管理ユニット 0-15 15
  • 17. 組込みLinuxのリアルタイム性能 •ソフトリアルタイム (CONFIG_PREEMPT) •ハードリアルタイム (CONFIG_PREEMPT_RT patch set) •他のカーネルとの組み合わせでリアルタイム性を向上 •RTAI (Adeos+Linux) •RTLinux (Realtime executive+Linux) •Linux on ITRON (ITRON+Linux) •T-Linux (T-Engine+Linux) •L4-Linux (L4+Linux) •Litron (TOPPERS/JSPカーネル+Linux) •Wind River Real-Time Core for Linux (Real-Time Core+Linux) 参考:http://monoist.atmarkit.co.jp/mn/articles/0501/12/news113. This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-16 16
  • 18. 組込みLinuxの開発環境 •一般的なツール •Eclipse C/C++ Development Tooling (CDT) :EclipseでのCやC++の開発 に必須 •Target Management (RSE) •Linux Tools Project :プロファイラや動的解析などの機能を統合 •Tools for mobile Linux (TmL) •EGit :バージョン管理システムの一つ、Gitの統合 •Mylyn :バグトラッカの統合 •特定のOSに特化したEclipseプラグイン •Moblin Eclipse Plug-in •Android Development Tools (ADT) •その他の開発環境 •Qemu:エミュレータ •distcc、icecc:分散コンパイル用コンパイラ •専用の商用製品など This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-17 17
  • 19. 組込みLinuxに関わる団体 • Linux Foundation (CE Linux Forumを吸収) • Linuxオペレーティングシステムの普及をサポートする非営利のコンソー シアム • 旧CE Linux Forumが開催する定期的な無料イベント開催 • 日本テクニカルジャンボリー http://tree.celinuxforum.org/CelfPubWiki/JapanTechnicalJamboreeGuidance • LiMo Foundation • Linuxを使った携帯電話のアプリケーション環境の標準化団体 • モトローラ、NEC、パナソニック、サムスン電子、NTTドコモ、ボーダ フォンなど • Open Handset Alliance (OHA) • Googleとともに携帯向けAndroidの開発推進を行うアライアンス • Open Embedded Software Foundation (OESF) • 組み込み機器向けAndroidに関わる企業間の協力を目的とした一般社団法 人 • Linaro • ARMのチップベンダである参加企業の各SoCに最適化されたツール、カー ネル、ミドルウェアを提供することなどを目的とした非営利団体 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-18 18
  • 20. メモ マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-19
  • 21. 第2章 Android概要 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-20
  • 22. 2章の概要 • Androidとは – 主な機能、歴史 • • • • Androidアプリケーションの動作環境 Androidのアーキテクチャ アプリケーション開発環境 プラットフォーム開発環境 – ソースコード – ルートファイルシステム – Androidの起動処理 • エミュレータ This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-21
  • 23. Androidとは Androidとは GoogleとOHAが提供する携帯端末用プラットフォームである 主に携帯電話、タブレットなどのプラットフォームとして利用されている 現在では、携帯電話、タブレット問わずさまざまなハードウェアにAndroidは搭 載されている マスタ タイトルの書式設定 AndroidはOS AndroidはLinuxカーネルをベースにしたオープンソースなOSであるため多くのハ ードウェアメーカーからプラットフォームとして採用されている Androidのライセンス 主にApache2.0ライセンスなので複写・修正・再配布が自由 カーネルなどの一部はGPLライセンス This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-22
  • 24. ハンドセット、タブレット以外の Android ノートPC MediaController 腕時計型 マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-23
  • 25. Android組込みハードウェア マスタ タイトルの書式設定 2-24
  • 26. Androidの主な機能 【プラットフォーム全般】 ブラウザによるWebサイトの閲覧 →ベースはオープンソースWebKitエンジン 2D、3Dグラフィック →カスタム2Dグラフィックライブラリ、 OpenGL/ES 軽量データベース →構造化されたデータ領域のためのSQLite搭載 一般的なオーディオ、ビデオと静止画フォーマットをサポート →MPEG4、H.264、MP3、AAC、AMR、JPG、PNG、GIF、WebM Dalvik VM(ダルビック バーチャルマシン) →JavaVMよりもモバイル端末などの低メモリ環境に最適化 Bluetooth、EDGE、3G、WiFi、カメラ、GPS、コンパス、加速度計 【開発】 リッチな開発環境(Eclipse、DDMSなど)と端末エミュレータ 豊富で整ったアプリケーションフレームワークと拡張の自由 →コンポーネントの再利用と置き換えが可能 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-25 25
  • 27. 豊富なインタフェース Androidのインタフェース NFC タッチパネル 各種センサ トラックボール カメラ GPS GPS ソフトキーボード/ハードキーボード NFC(Near Field Communication) Bluetooth Bluetooth マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. タッチパネル 0-26
  • 28. Androidの歴史 年月 できごと 2003年10月 Android社発足 2005年 8月 GoogleがAndroid社を買収 2007年11月 Open Handset Alliance (OHA)が発足 Android SDK 1.0 リリース 2008年10月 世界初のAndroid搭載スマートフォン 発売 「T-Mobile G1」 2009年 4月 Android SDK 1.5r1 リリース 2009年 5月 Android SDK 1.5r2 リリース 2009年 月 7 NTTドコモより、日本国内初のAndroid携帯 「HT-03A」発 売 Android SDK 1.5r3 発表 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-27 27
  • 29. Androidの歴史 年月 できごと 2009年 9月 Android SDK 1.6 発表 2009年10月 Android SDK 2.0 発表 2010年 1月 Android SDK 2.1 発表 2010年 5月 Android SDK 2.2 発表 2010年 12月 Android SDK 2.3 発表 2011年 2月 Android SDK 3.0 発表 2011年 5月 Android SDK 3.1 発表 2011年 7 月 Android SDK 3.2 発表 2011年 10月 2011年 12月 Android SDK 4.0 Android SDK 4.0.3 2012年 6月 Android SDK 4.1! 2012年 11月 スマートフォン向け タブレット向 け Android SDK 4.2 スマートフォン向け と タブレット向けの融 合 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-28 28
  • 30. プラットフォーム Androidのバージョン一覧 1.5 2.3 Cupcake Gingerbread Donuts HoneyComb 2.0–2.1 4.0 Eclair Ice Cream Sandwich 2.2 4.1-4.2 Froyo Jelly Bean マスタ タイトルの書式設定 3.0–3.2 1.6 2-29
  • 31. Androidのバージョン 2.x系 2.x系の新機能 Version コードネーム APIレベル リリース 新機能 2.0/2.1 Eclair 5, 6, 7 2009/10/26 (2.0) 2009/12/3 (2.0.1) 2010/1/12 (2.1) • マルチタッチ • LiveWallPaper • Bluetooth マスタ タイトルの書式設定 2.2 Froyo 8 2010/5/21 • Dalvik VM にJITコンパイラを搭載 (2〜5倍高速化) • クラウドとデバイスの連携API (C2DM) • テザリング対応 • Adobe Flash対応 • インストール済アプリの自動更 新 2.3 Gingerbread 9, 10 2010/12/6 • • • • • • ゲームのための改良 並列GC(目標3ms以下の停止) NFC(近距離無線通信)対応 複数のカメラを扱えるAPIの追加 SIPの標準サポート バッテリー管理機能の向上 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-30
  • 32. Androidのバージョン 3.x系 3.xの新機能 Version コードネー ム APIレベル リリース 新機能 3.0 Honeycomb 11 2011/2/22 • 大型ディスプレイに最適化 • タブレット専用となった • マルチコアプロセッサのサポート 3.1 Honeycomb 12 2011/5/10 • • • • 3.2 Honeycomb 13 2011/7/15 • 広範囲なタブレット向けの最適化 • SDカードに対してのメディア同期 • スクリーンサポートの拡張 マスタ タイトルの書式設定 ユーザーインターフェースの改善 オープンアクセサリAPI USBホストAPI マウス、ゲームパッド、ジョイス ティックからの入力 • ホームスクリーンウィジェットのサ イズ変更 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-31
  • 33. Androidのバージョン 4.x系 4.xの新機能 Version コードネー ム APIレベル リリース 新機能 4.0 Ice Cream Sandwich 14, 15 2011/10/08 • • • • • • • • • 4.1 Jelly Bean 16 2012/06/27 • • • • • • • ハンドセットとタブレットのUIの統合 Android Beam WiFi Direct Bluetooth Health Device Profile Notificationの向上 ロック画面で、カメラと音楽の操作 ランチャーのアプリ管理の改善 画像や動画のエフェクト 正確なカメラの測光、顔認識 マスタ タイトルの書式設定 Systrace アクセシビリティの拡張 双方向テキスト対応 Unicode 6.0 の絵文字対応 Notificationの拡張 リサイズ可能なアプリウィジェット ライトアウト・フルスクリーンモードへ の遷移API • Remoteable View の追加 • デバイスの追加と除去の検知 • Android Beam の改善 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-32
  • 34. Androidのバージョン 4.x系 4.xの新機能 Version コードネーム APIレベル リリース 新機能 • マルチアカウント • クイック設定 • フォトギャラリーのアップデート。360 度撮影。 • ジェスチャ文字入力 • Miracast ワイヤレスディスプレイ • Google Play 以外からインストールするア プリにもマルウェアスキャン マスタ タイトルの書式設定 4.2 Jelly Bean 17 2012/11/13 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-33
  • 35. Androidのアーキテクチャ アプリケーション Home Contacts Phone Browser 自作アプリ ・・ ・ アプリケーションフレームワーク アクティビティ マネージャ ウィンドウ マネージャ コンテンツ プロバイダ ビューシステム 通知マネージャ パッケージ マネージャ 電話 マネージャ リソース マネージャ 位置 マネージャ XMPP サービス ライブラリ 自作 フレームワーク Androidランタイム サーフェス マネージャ メディア フレームワーク SQLite コアライブラリ OpenGL | ES FreeType WebKit Dalvik 仮想マシン SGL SSL Libc 自作ライブラリ HARDWARE ABSTRACTION LAYER Graphics Audio Camera Radio(RIL) WiFi ディスプレイ ドライバ Bluetooth ドライバ カメラドライバ フラッシュメモリ ドライバ バインダ(IPC) ドライバ キーパッド ドライバ USBドライバ WiFiドライバ オーディオ ドライバ 電源管理 ・・・ Linuxカーネル 2.6 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 自作ドライバ 0-34 34
  • 36. カーネルとネイティブライブラリ • Linuxカーネル2.6がベース ベースに) – – – – (ただし4.0以降のカーネルはほぼ3.1 Android用変更パッチ(電源管理、Binder、WakeLockなど) ハードウェアのドライバ類 システムデーモン GPLライセンス • HAL (Hardware Abstraction Layer) – Linuxのハードウェアドライバを抽象化しデバイスIO的な役割を果たす – Androidのユーザランドとカーネルをライセンス的に分離 • ライブラリ – Bionic libc • Unix系libcよりも高速でコンパクト(pthreadの実装) • BSDライセンス – C/C++で記述されたライブラリ • OpenGL/ES、SQLite、Webkitなど This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-35 35
  • 37. Androidランタイム •コアライブラリ •Android用のJavaのコアライブラリで基本的なJava APIを提供 •J2SEをベースにしているので開発用ホストPCにJDKが入っていればアプリケー ションの開発が可能 •未サポートであるJ2SEのAPIもあるので注意 •Dalvik仮想マシン(Dalvik VM) •メモリの少ない環境でも複数のアプリケーションを同時実行できるように設計 •すべてのアプリケーションはDalvik VMのインスタンスとなって独自のプロセス として動作 •JavaVM(スタックベース) ≠ DalvikVM(レジスタベース) •Apache2.0 •アプリケーションのビルド時にdxツールがclassから.dexファイルに変換 (.dex≒.class/2) •Dalvik VMにおける実行ファイルはdexファイル Java VM .class .jar 異なる Dalvik VM .dex This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-36 36
  • 38. アプリケーション層 • アプリケーションフレームワーク – Androidアプリケーション作成のための拡張可能なJavaのコンポーネ ント類 項目 説明 アクティビティマネー ジャ アプリケーションのライフサイクルや画面の共通バックスタックを管理 ウィンドウマネージャ ウィンドウの配置や外観を管理するシステムソフトウェア コンテンツプロバイダ パッケージ間(異なるアプリケーション間)でデータ共有を行う手段を提 供する ビューシステム UIの制御 通知マネージャ メッセージの到着、時間、アラームなどのイベント通知(ステータスバー やトーストなど) パッケージマネージャ アプリのインストール、更新、削除などを管理 電話マネージャ 電話の状態や通話機能を管理 リソースマネージャ アプリで使用するリソースの管理 位置マネージャ GPSデバイスによる位置情報取得や更新などを実現、管理 XMPPサービス XMPP(IMのメッセージ交換やログイン状況の通知用通信プロトコル)の サービスを管理 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-37 37
  • 39. アプリケーション層 • アプリケーション – Google製標準アプリケーション • アラーム時計、Bluetooth、ブラウザ、電卓、カメラ、コンタ クトリスト、 検索ボックス、電子メールクライアント、ギャラリー、3Dギャ ラリー、 インスタントメッセージ、ランチャー、音楽再生、 パッケージインストーラ、電話、システム設定、音声レコー ダ、 スピーチレコーダー・・・など – 独自アプリケーションはこのレイヤに該当する This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-38 38
  • 40. アプリケーション開発の手法 アプリケーション アプリケーション アプリケーション アプリケーション アプリケーションフレームワーク JNI JNI JNI dalvikVM ライブラリ 自前のライブラリ Webkit OpenGLES OpenGLES OpenGLES ・・・ HAL Graphics Audio Camera Radio(RIL) WiFi ・・・ BIONIC Libc othread Libm Linker ・・・ Linuxカーネル 2.6 デバイスドライバ This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-39 39
  • 41. アプリケーション開発環境 項目 必要な環境 OS Windows XP, Windows Vista(32 / 64 bit) Mac OS X 10.5.8以降(x86のみ) Linux(Ubuntu Hardy Herson、Lucid Lynx にてテス ト済) Java JDK Android開発ツール 統合開発環境 JDK 6 Android SDK 3.7(Indigo) 以降 Android Development Tools(ADT) Plug-in テキストベース 開発環境 Apache Ant(Windows版は1.7, Mac/Linux版は1.6.5以 降) *必要なマシンスペックは http://developer.android.com/intl/ja/sdk/requireme This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-40 40
  • 42. プラットフォーム開発環境 項目 必要な環境(共通) スペック CPU:2G以上、 メモリ:2G以上 ハードディスク空き容量:80G以上(プラットフォームひとつあたり20G ) ネットワーク常時接続 ソースコード入手先 項目 Android Open Source Project (AOSP) Froyo(2.2)より古いAndroidのソースコード取得やビルドに必要な環境 ホストOS 必要なツール 項目 ホストOS 必要なツール Mac OS X 10.5.8以降(x86のみ) 32bit_Linux(Ubuntu 8.04 以上)(64bitLinuxの場合は下表参照) Python 2.6 - 2.7、 git1.7以上、 GNU Make 3.81 -- 3.82、JDK5 git-core, gnupg, flex, bison, gperf, libsdl-dev, libesd0-dev, libwxgtk2.6-dev, build-essential, zip, curl, libncurses5-dev, zlib1g-dev, valgrind, libreadline5-dev, repo Gingerbread(2.3)以上のAndroidのソースコード取得やビルドに必要な環 境 64bit_Linux(Ubuntu 10.04 以上) Python 2.6 - 2.7、 git1.7以上、GNU Make 3.81 -- 3.82、 JDK6 git-core gnupg flex bison gperf build-essential zip curl zlib1gdev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32readline5-dev lib32zdev This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-41 41
  • 43. 組込み開発とは 組込み機器のプラットフォーム開発はネイティブ言語で開発(gcc)を行う 【必要な作業】 1. ホストPCにてクロス開発環境構築 – 2. 3. ホストPCにてカーネル作成 ターゲットボードに移植 – 4. 5. ターゲットボードのチップのアーキテクトに適用したクロスコンパイル環境で あること (ARM, x86, ・・・) (必要であれば)デバイスドライバ作成、組み込み ホストPCにてユーザランド作成 ターゲットボードのメモリに書き込み、起動、評価 【ターゲットボードに最低限必要なインタフェース】 – – – ネットワークポート(LANなど) シリアルポート(RS232Cなど) JTAG (ICE接続などに使用) This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-42 42
  • 44. Androidのクロス開発環境 Ubuntu 追加パッケージ ホストPC (X86) Ubuntu on VMWarePlayer ターゲットボード (ARM) Armadillo-440 LAN or シリアル AOSP ボードベンダなど ソースコード取得 編集 コンパイル カーネルイメージ作成 ユーザランドのルートファイルシステム作成 実機へ転送 デバッグ *1 : コンパイラ(gcc)、プリプロセッサ & リンカ & アセンブラ(bin-utility)、 Cライブラリ、ダイナミックローダ などビルドに必要なツール一式 *2 : Linuxカーネル、ユーザランドのソースコード *3 : ボードに搭載しているハードウェアに依存するドライバやAndroidとの差異を吸収するパッチ ブートローダーなど This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-43 43
  • 45. 本実習で使用するホストPC構成 ゲストOS Ubuntu ver. 10.04.LTS 32_bit x86版 VMWarePlayer ver.4.04 ホストPC WindowsXP SP3 or 7 (32_bit x86マシン) VMWare Player入手先サイト 下記サイトからメジャーバージョン4.0、マイナーバージョン4.04を選択し、 「VMware Player for Windows 32-bit and 64-bit」をダウンロードします https://my.vmware.com/jp/web/vmware/free#desktop_end_user_computing/vmware_player/4_0|P LAYER-406|product_downloads Ubuntu 10.0.4LTS入手先サイト Ubuntu 10.0.4LTS CDイメージ(iso) はサポート期間が終了してしまったため、下記 サイトから 「PC (Intel x86) alternate install CD」をダウンロードします。 http://releases.ubuntu.com/lucid/ This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-44 44
  • 46. Ubuntu on VMWarePlayer インストールウィ ザードに 必要な項目を入力し てインストール開始 ディスクトップ にVMWarePlayer のショートカッ トができるので ダブルクリック This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-45
  • 47. Ubuntu on VMWarePlayer ディスク容量…80G ネットワーク…NAT メモリ…最低2G以上割り当てる This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-46 46
  • 48. Ubuntu on VMWarePlayer Ubuntuのisoイメージをダウンロードした場所 「ISOイメージ ファイルを使用 する」にチェッ クをいれて 参照ボタン押下 「OperationSystem not found」 と表示されて止まったらEnterキーを押下 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-47 47
  • 49. Ubuntu on VMWarePlayer インストール ウィザードに 必要な項目を 入力してイン ストール開始 インストール が完了すると 再起動を促さ れるので再起 動をする This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-48 48
  • 50. Ubuntu on VMWarePlayer 初回インストール時はアップデートマネージャにてセキュリティ アップデートをする *社内ネットワークなどproxyの関係で失敗する場合はproxyの設定を正しく行ってからリ トライしてください 0-49 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 49
  • 51. 本実習のクロス開発環境の構築 ホストPCがUbuntu ver.10.0.4LTS (32_bit x86版)の場合 必要なツールのインストール $ sudo apt-get install git-core gnupg flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev $ sudo apt-get install valgrind $ sudo apt-get install libreadline5-dev JDK5のインストール Oracleのサイトからlinnux用のバイナリをダウンロードします( jdk-1_5_0_22-linuxi586.bin) http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archivedownloads-javase5-419410.html#jdk-1.5.0_22-oth-JPR $ chmod a+x jdk-1_5_0_22-linux-i586.bin $ ./jdk-1_5_0_22-linux-i586.bin $ mv jdk1.5.0_22 java-5-oracle $ sudo mkdir /usr/lib/jvm $ sudo mv java-5-oracle /usr/lib/jvm This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-50 50
  • 52. 本実習のクロス開発環境の構築 JDK5のインストール(続き) 下記の/update-java-0.5bツールを実行後ダイアログが表示されるので 「/usr/jvm/java-5-oracle」を選択して「OK」すれば完了 $ wget http://webupd8.googlecode.com/files/update-java-0.5b $ chmod +x update-java-0.5b $ sudo ./update-java-0.5b repoのインストール $ mkdir ~/bin $ curl http://android.git.kernel.org/repo >~/bin/repo $ chmod a+x ~/bin/repo ※export PATH=$PATH:~/bin を .bashrc へ追記 ホストPCがUbuntu 10.0.4 (64bit x86版)の場合:http://source.android.com/source/downlo 0-51 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 51
  • 53. android open source project (AOSP) http://source.android.com/ Androidのソースコードはgitプロジェクト単位(リポジトリ)にTree構 造となっている コミッターは個々のリポジトリをフォークして変更を加え、本Treeにコ ミットしている AOSPのkernel以外の全リポジトリは https://android.googlesource.com/platform/manifest 0-52 This material is licensed under the Creative Commons License BY-NC-SA 4.0. で管理されている 52
  • 54. Android のバージョン対応表 Androidの指定バージョンのソース コードを取得する場合はAOSPの BuildNumbersで記載されている Code nameまたはTagを指定する Code name Version API level (no code name) 1.0 API level 1 (no code name) 1.1 API level 2 Cupcake 1.5 API level 3, NDK 1 Donut 1.6 API level 4, NDK 2 Eclair 2.0 API level 5 DMD64 android-1.6_r1.5 latest Donut version Eclair 2.0.1 API level 6 EPF21B android-2.1_r2.1p2 latest Eclair version Eclair 2.1 API level 7, NDK 3 FRK76C android-2.2.3_r2 latest Froyo version Froyo 2.2.x API level 8, NDK 4 GWK74 android-2.3.7_r1 Gingerbread 2.3 - 2.3.2 API level 9, NDK 5 latest Gingerbread version, Nexus S 4G ITL41D android-4.0.1_r1 Gingerbread 2.3.3 - 2.3.7 API level 10 earliest IceCreamSandwich version, Galaxy Nexus Honeycomb 3.0 API level 11 ITL41D android-4.0.1_r1.1 Galaxy Nexus Honeycomb 3.1 API level 12, NDK 6 ITL41F android-4.0.1_r1.2 Galaxy Nexus ICL53F android-4.0.2_r1 Galaxy Nexus Honeycomb 3.2.x API level 13 IceCreamSandwich 4.0.1 - 4.0.2 IceCreamSandwich 4.0.3 Build Tag IML74K android-4.0.3_r1 API level 14, NDK IML77 7 This material is licensed under the Creative Commons License BY-NC-SA 4.0. API level 15 Notes Nexus S latest IceCreamSandwich 0-53 version 53
  • 55. Androidのソースコード管理 (Git) • Gitとは – 分散型バージョン管理システム – 複数リポジトリ間での変更履歴のやり取りが可能 – Linux kernelのソースコード管理に利用されている 【gitサーバにあるリポジトリのコピー】 $ git clone https://android.googlesource.com/platform/manifest + project path 例1:フレームワーク関連の最新のソースコードを取得する場合 $ git clone https://android.googlesource.com/platform/frameworks/base.git 例2:フレームワーク関連のFroyoのソースコードを取得する場合 $ git clone https://android.googlesource.com/platform/frameworks/base.git –b android-2.2.3_r2 または clone https://android.googlesource.com/platform/frameworks/base.git –b froyo $ git This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-54 54
  • 56. Androidのソースコード管理 (repo) • repoとは – Gitの複数リポジトリを一括で管理するためのツール 【gitサーバにあるkernel以外のすべての標準プロジェクトを 一括で取得】 $ repo init -u https://android.googlesource.com/platform/manifest project path $ repo sync + $ repo init -u https://android.googlesource.com/platform/manifest 例1:最新のソースコードを一括取得するためのリポジトリの作成する場合 $ repo init -u https://android.googlesource.com/platform/manifest –b android例2:Froyoのソースコードを一括取得するためのリポジトリの作成する場合 2.2.2_r1 または init -u https://android.googlesource.com/platform/manifest $ repo This material is licensed under the Creative Commons License BY-NC-SA 4.0. –b froyo 0-55 55
  • 57. AOSPのソースコード取得 android-2.2.2_r1のタグのついたAndroid2.2(Froyo)のコードを取得するには $ mkdir mydroid $ cd mydroid $ repo init -u https://android.googlesource.com/platform/manifest –b android2.2.2_r1 $ repo sync 上記 repo init コマンドでレポジトリの初期化を行うと.repoディレクトリが生成 $ ls .repo msnifst.xml@ manifests/ manifests.git/ repo/ manifest.xml@ (-> manifests/default.xml) にはrepo が管理する対象のプロジェ クトが定義 manifest.xml にないプロジェクトの追加またはmanifest.xml からプロジェクトを外す場合 local_manifest.xml を作成することによってカスタム設定が可能 <?xml version=“1.0”encoding=“UTF-8”?> <manifest> 削除 <remove-project name=“platform/frameworks/base” /> <project path=“frameworks/base” name=“platform/frameworks/base” revision=“android- 追加 2.2.3_r1”/> </manifest> パス名 プロジェクト名 指定のタグ名(任意) This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-56 56
  • 58. repo sync 後のソースコードツリー mydroid/ bionic/ bootable/ build/ cts/ dalvik/ development/ external/ frameworks/ hardware/ packages/ prebuild/ system/bluetooth system/core system/extras Android用に開発されたCライブラリ ブートローダーリファレンスコード ビルドシステム テストスイート 仮想マシンDalvik 開発ツール、SDK、サンプルコード AOSP以外の外部オープンソースプロジェクト Androidアプリケーションフレームワーク ハードウェアライブラリとRadio Interface 標準的なAndroidアプリケーションとサービス ビルドに必要な各種バイナリファイル Bluetoothツール 最小限の実行環境 低級なデバック、テストツール This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-57 57
  • 59. ソースコード詳細(packages) • packages -> アプリケーションレイヤ – apps : Android標準搭載アプリケーションのソース コード – inputmethods : 入力用メソッドのソースコードが格 納 – providers : Android標準搭載サービスのソースコー ド – experimental : 製品には入らないテストツール – wallpapers : ライブ壁紙のソースコード This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-58 58
  • 60. ソースコード詳細 (packages/frameworks) • frameworks -> フレームワークレイヤ – base • Androidフレームワークのソースコードと各種サービスのソー スコード • base/core : Androidランタイムのコアライブラリ • base/libs : 外部プロジェクトのライブラリ – opt : googleや絵文字のライブラリソースコード – policies : mid、phoneの構成情報 • dalvik -> Androidランタイム – Dalvik仮想マシン本体の関連クラスライブラリ This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-59 59
  • 61. ソースコード詳細(bionic/external) • external -> ライブラリレイヤ – 外部プロジェクトのライブラリ • bionic -> ライブラリレイヤ – BSDライセンス – POSIX標準Cライブラリのすべての機能は実装してい ない – 未サポート機能 • • • • • C++例外 pthreadキャンセル pthread_coreのinitメソッドからスローされたC++例外 pthread_coreのfork()するinitメソッド ロケールとワイルドキャラクタ(UnicodeライブラリICUで代 替) This material is licensed under the Creative Commons License BY-NC-SA 4.0. • ユーザアカウント関連のメソッド(getpwdなど) 0-60 60
  • 62. ソースコード詳細(hardware) • hardware -> HAL – broadcom : Broadcomの無線ドライバ – libhardware :外部モジュールで構成されたデバイスドラ イバ制御用ラッパーライブラリ (外部モジュールの配置場所は/system/libs/hw配下) – libhardware_legacy : スタティックリンクされる定義で 構成されたデバイスドライバ制御用ラッパーライブラリ (WiFi、バイブレーション、電源、GPSなど) – msm7k : QualcommのMSM7K関連 – qcom : QualcommのGPSドライバ – ril : Radio Interface Layer テレフォニーサービスのベースバンドIF – ti : TIの無線ドライバ This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-61 61
  • 63. ソースコード詳細(system) •system –Initなどの基本的なプロセスのコードやシステム ファイルなど –bluetooth : bluetoothのソースコード –core : 必要最小限の実行環境、基本的なコマンド 類 –extras : デバッグ、テストツールが格納 –netd : ネットワーク設定制御用デーモン –vold : ボリュームデーモン、各種メディアのマウ ント –wlan : TIの無線関連のソースコード This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-62 62
  • 64. ソースコード詳細(開発環境関連) • build – ビルドシステム(Makefile、スクリプトなど)を格納 – Androidソースコードのルートでmakeするとbuild/core/main.mkからmake開始 • prebuild – 各ターゲット用、ホストOS用のビルドツールのバイナリファイル(クロスコンパイ ラ) • device – 機器に関するbuild関連の情報(Makefile)、CPUやボードに依存するソフト(スク リプト)やドライバなど • ndk – Native Development Kit関連のソフト、gdbなどのツール • sdk – Android SDKで使用されるエミュレータソフトやライブラリ • bootable – bootloader : ブートローダーのソースコードが格納 • bootloader/legacy/usbloader/main.cがブートローダーのスタート関数 – diskinstaller : x86系PCにAndroidをインストールする際に使用 – recovery : Android system recovery utilityのソースコードが格納 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-63 63
  • 65. ソースコード詳細(開発環境関連) • cts – 互換性テストスイーツ、デバイスの互換性をテストするためのツ ール など – Android認証テスト – Android Marketなどを使用できるようにするにはGoogleの認証が必要 – CTSが通らなければAndroid端末として認証されない(かなり厳格) This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-64 64
  • 66. Androidのエミュレータと実機 プラットフォームが入れ替わるだけで実はエミュレータと実機は同じ ARMのエミュレートをしているのはQEMUエンジン Javaプログラム Dalvik VM Javaプログラム Dalvik VM Linux ARM版 Linux ARM版 ARM仮想マシン (QEMU) PC ARM実機マシン Androidエミュレータ Android実機マシン This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-65 65
  • 67. Androidの起動シーケンス Power ON or Reboot BootROM /init.rc 基本設定 ・ネットワーク ・キーボード ・デバイス初期 化 サービスの起動 ブートローダ Boot カーネル メモリに展開 /in it ブートデバイスの専用ブロック読み出し U-Boot or Hermit 起動パラメータの設定 CPU初期化 ハードウェアのチェック, ドライバの読みこみ 起動用ファイルがある領域の マウント kernelの起動パラメータ設定時 必ずinit=/initを指定すること Home画面 デフォルトの設定ではカーネルは /sbin/init、/etc/init、/bin/init、 /bin/sh にinitを探しにいくので正常に起動でき 0-66 ない This material is licensed under the Creative Commons License BY-NC-SA 4.0. 66
  • 68. Android カーネルの起動パラメータ 本実習で使用するArmadillo-440はブートローダにhermitを使用します カーネルの起動パラメータを設定するためには、開発PCとArmadillo-440を RS232Cで接続後、hermitプロンプトからsetenvコマンドで以下のように設 定します hermit>setenv␣console=ttymxc1␣root=/dev/mmcblk0p2␣init=/init␣noinitrd␣ rootwait パラメータ 説明 console=ttymxc1 カーネルコンソールはデバイスttymxc1を使用 noinitrd initrd(初期RAMディスク)を使用しない root=/dev/mmcblk0p2 MMC(SDカード)の2番目のパーティションをルートファイルシ ステムとする rw Read/Writeでルートファイルシステムをマウント rootdelay=1 ルートファイルシステムをマウントする前に指定秒間待機 rootwait ルートファイルシステムがアクセス可能になるまで待機 nfsroot nfsrootNFSを使用する場合に、ルートファイルシステムの場所 やNFSオプションを指示 init=/init initの実行ファイルはルート直下にあるinitを使用 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-67 67
  • 69. Androidのinit init /system/core/init/init.c int main(int argc, char **argv) { ブート処理 /dev、/proc、/sysをマウン ト /init.rc をパースして実行 - action_list作成 - service_list作成 起動時に一度だけ実行される /init.<hardware名>.rc をパースして実行 - action_list作成 - service_list作成 for(;;){ デーモン処理 システムが動作している限 り 繰り返し実行される } } ファイルディスクリプ タの 監視 This material is licensed under the Creative Commons License BY-NC-SA 4.0. device_fd property_fd signal_fd keychord_fd 0-68 68
  • 70. Androidのinit • initの起点 – /system/core/init/init.c の main関数 • init.rc – Android Init Languageで書かれた起動用スクリプト – Action、Command、Service、Optionで構成 – /system/core/init/readme.txt で説明 ACTION部 on <target> <command> <command> : SERVICE部 service <name> <path> [argument]* <option> <option> : This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-69 69
  • 71. Androidのinit(デーモン処理) • ファイルディスクリプタ – device_fd • カーネルからデバイスの状態変化通知を受けて/dev以下のデバ イスの生成と削除を行う。 • 生成するデバイスファイルのmode、uid、gidはdevices.cの構 造体かinit.rcのdeviceコマンドで指定可能 – property_fd • システムプロパティの書き込み処理 – signal_recv_fd • 子プロセスが終了したときにsignalを発生するのでそれを受け て後処理を行う – keychord_fd • あらかじめ登録した複数のキーの入力組み合わせを監視しそれ に対応するserviceを起動する This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-70 70
  • 72. Androidのルートファイルシステム data root / キャッシュ、追加パッケージなど格納ディレクト (R/W) dev デバイスファイル格納ディレクトリ proc Linux設定ファイル格納ディレクトリ sys システムファイル格納ディレクトリ sbin adbd実行ファイル格納ディレクトリ system 次頁参照 init 起動処理実行ファイル init.armadillo440.rc initが実行するターゲットボード固有 起動用シェルスクリプト init.rc initが実行するAndroid固有起動用シェルスクリ default.prop Androidデフォルトプロパティ init.goldfish.rc エミュレータ起動用シェルスクリプト initlogo.rle 起動時のロゴの画像ファイル (RGB888のRAW形式をRLE形式に変換した画像 ) This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-71 71
  • 73. Androidのルートファイルシステム app /system/ bin etc fonts framework lib usr xbin build.prop プリインストールのアプリケーション ファイル(.apk) 各種一般的なLinuxコマンド 設定用シェルスクリプトなど フォントファイル(.ttf) javaのandroidのライブラリ(.jar) ネイティブライブラリ(.so) キー設定ファイルなど root用のコマンドなど Androidデフォルトプロパティ This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-72
  • 74. 1章と2章のまとめと次回予告 以上で一般的なLinuxの概要とAndroidの概要に ついて学びました 次章からは本実習で使用するターゲットボードの 理解とAndroidを動作させる方法について学びます This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-73
  • 75. メモ This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-74
  • 76. 第3章 ターゲットのボード This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-75
  • 77. 3章の概要 • • • • • 代表的なターゲットボード Armadillo-500fxの構造 Armadillo-500fxのメモリ構成 Armadillo-440の構造 Armadillo-440のメモリ構成 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-76
  • 78. 各種ターゲットボード ボード名 CPU メモリ 画面 通信 I/F ストレー ジ カメラ オーディオ Armadillo-440 液晶モデル開発 セット Freescale i.MX257 400MHz (ARM9) 32MB (FLASH NOR) 128MB (LPDDR SDRAM) 4.3イ ンチタ ッチパ ネル Eth×1 シリアル、 USB microSD - オーディオ入 出力 Armadillo-500fx 液晶モデル開発 セット Freescale i.MX31 532MHz (ARM11) 32MB(FLASH NOR) 128MB(DDR SDRAM) 1G(USBSSD) 5.7イ ンチタ ッチパ ネル Eth×1 シリアル、 USB、操作ボ タン SD/MMC+mic roSD - オーディオ入 出力 Armadillo-800EVA 評価キット ルネサス [R-Mobile A1] 800MHz 2コア ARM Cortex-A9 512MB (DDR SDRAM) 8G(eMMC) 5イン チタッ チパネ ル (静電 式) Eth×1 WLAN シリアル USB HOST/OTG HDMI SD/MMC+mic roSD CMOSカメ ラモジュ ール オーディオ入 出力 BeagleBoard TI OMAP3530 600MHz (ARM11) 256MB NAND DDR2 RAM - - シリアル、 USB SD/MMC - オーディオ入 出力 BeagleBoard-xM TI DM3730 1.0GHz (ARM Cortex-A8) 512MB NAND DDR2 RAM - Eth×1 シリアル、 USB microSD 拡張端子 オーディオ入 出力 PandaBoard TI OMAP4430 1GHz 2コア ARM Cortex-A9 1GB DDR2 RAM - Eth×1 BT2.1+EDR WLAN シリアル USB HOST/OTG HDMI、DIV-D SD/MMC 拡張端子 オーディオ入 出力 PandaBoard-ES TI OMAP4460 1.2GHz 2コア ARM Cortex-A9 1GB DDR2 RAM - Eth×1 BT2.1+EDR WLAN シリアル USB HOST/OTG HDMI、DIV-D SD/MMC 拡張端子 オーディオ入 出力 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-77
  • 79. ターゲットボード ボード名 提供元 購入先 価格 Armadillo-440 液晶モデル開発セット アットマークテクノ社 アットマークテクノ社 128,000(税込) Armadillo-500fx液晶モデル開発セッ ト アットマークテクノ社 アットマークテクノ社 63,000(税込) Armadillo-800EVA評価セット アットマークテクノ社 アットマークテクノ社 99,750(税込) BeagleBoard TI/Digi-Key Beagleboard.org Digi-Key $125 BeagleBoard-xM TI/Digi-Key Beagleboard.org Digi-Key $149 PandaBoard Pandaboard.org Digi-Key 14,061(送料 ・消費税・関税 込) PandaBoard-ES Pandaboard.org Digi-Key 15,136(送料 ・消費税・関税 込) This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-78
  • 80. Armadillo440 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-79
  • 81. Armadillo440 プロセッサ CPUコア Freescale i.MX257 (MCIMX257) ARM926EJ-S CPUコアクロック 400MHz BUSクロック 133MHz メモリ 128MB (LPDDR) 32MB (NOR) USB USB2.0×2(High Speed/FullSpeed) タッチパネルインタ ーフェースボード 抵抗膜式タッチスクリーンコントロ ーラー SD シリアルポート microSDスロット RS232C、 オーディオ I2S I/F、デジタルオーディオCODEC 画像出力 18bit LCD I/F、DATA IMAGE社製LCD インターフェース EthernetFXボード LAN (10BASE-T/100BASE-TX ) This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-80
  • 82. Armadillo440-通常Linux 開発用PC カーネルの起動パラメータ [armadillo] hermit> clearenv [armadillo] hermit> setenv [armadillo] hermit> boot シリアル通信ソフ ト NOR Flashメモリ(32M) linux-440.bin.gz をRAMにロードして実行 bootloader ブートローダ領域(Hermit) kernel Linuxカーネル領域 userland Linuxユーザランド領域 linux-romfs440をマウント 各プロセスの実行 config Linuxカーネルパラメータ保存領域 通常Linuxが起動 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-81 81
  • 83. 参 考 Armadillo440-Androidデバッグ時 (NFSブート) 開発用PC カーネルの起動パラメータ [armadillo] hermit> setenv␣console=ttymxc0,␣115200␣root=/dev/nfs␣rw␣nfsroot=192.16 8.1.10:/home/mydoroid/out/target/product/genelic/root␣init=/i nit␣ip=102.168.1.11␣noinitrd [armadillo] hermit> boot NOR Flashメモリ(32M) linux-440android.bin.gzをRAMに ロードして実行 シリアル通信ソ フト Androidユーザランド android-rootfs 192.168.1.1 0 bootloader ブートローダ領域(Hermit) Android対応kernel Linuxカーネル領域 linux-440-android.bin userland Linuxユーザランド領域 config Linuxカーネルパラメータ保存領域 NFSルートマウント root=/dev/nfs マウント 各プロセスの実行 Androidが起動 LAN接続 192.168.1.11 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-82
  • 84. Armadillo440-Androidデバッグ時 (microSDブート) 開発用PC カーネルの起動パラメータ [armadillo] hermit> setenv␣console=ttymxc1␣root=/dev/mmcblk0p2␣init=/init␣noinitr d␣rootwait [armadillo] hermit> boot シリアル通信ソフ ト NOR Flashメモリ(32M) linux-440-android.bin.gz をRAMにロードして実行 組み込み済み bootloader ブートローダ領域(Hermit) Android対応kernel ルートマウント root=/dev/mmcblk0p2 マウント 各プロセスの実行 Linuxカーネル領域 linux-440-android.bin userland /dev/mmcblk0 microSD Android /dev/mmcblk0p2 rootfs Linuxユーザランド領域 config Androidが起動 Linuxカーネルパラメータ保存領域 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-83
  • 85. Armadillo440-Android 製品イメージ 開発用PC カーネルの起動パラメータ [armadillo] hermit> clearenv [armadillo] hermit> boot シリアル通信ソフ ト NOR Flashメモリ(32M) linux-440-android.bin.gz をRAMにロードして実行 組み込み済み bootloader ブートローダ領域(Hermit) Android対応kernel Linuxカーネル領域 linux-440-android.bin Androidのルートをマウント 各プロセスの実行 Androidが起動 /dev/mmcblk0 /dev/mmcblk0p1 マウント Android /system(RO) Androidルート Root(RO) config microSD /dev/mmcblk0p2 マウント Android /dara(RW) Linuxカーネルパラメータ保存領域 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-84
  • 86. メモ This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-85
  • 87. 第4章 実機でAndroidを動かす This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-86 86
  • 88. 4章の概要 • • • • • • • • • 目指すシステム Androidソースコード取得 Androidカーネルイメージ作成 Androidユーザランドのファイルシステム作成 Androidユーザランドのファイルシステム構成 Armadillo-440の標準Linuxとネットワーク設定 Android起動用microSDの準備とAndroidカーネルの準備 Android起動 デバッグ環境の構築 – – – – Android SDK のインストール ネットワーク設定 ddms adbコマンドとadb shellコマンド This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-87 87
  • 89. 本章で目指すシステム Armadillo-440に搭載させたmicroSD内のEM3で起動 する /dev/mmcblk0 microSD Android rootfs /dev/mmcblk0p2 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-88 88
  • 90. Linuxコマンドの復習 ●UbuntuのターミナルのシェルではTabキーでディレクトリ名やファイル名の補完ができま す ●ホームディレクトリについて 本実習の開発環境におけるユーザ(aj741327)のホームディレクトリは以下のディレクトリ です /home/aj741327 ●Linuxではホームディレクトリのことを【 ~/ 】で簡略化して表現することができます。 <使用例> ホームディレクトリにあるworkというディレクトリに移動したい場合 cd /home/aj741327/work cd ~/work 同じ ●ワイルドカード「*」 Aというディレクトリ内にあるすべてのjavaのソースファイルをまとめて指定したいときな ど「*」を利用して 以下のように指定できます A/*.java This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-89
  • 91. Linuxコマンドの復習 pwd 現在のディレクトリパスを表示 cd ディレクトリ間移動 cd ../ 一つ前のディレクトリに移動 ls –la カレントディレクトリのファイルを 一覧表示 -l : ファイルの詳細も示す -a : .ファイル(隠しファイル)も表示 cp A B ファイルのコピー A:コピー元ファイル名 B:コピー先ファイル名 mv A B ファイルの移動、ファイル名の変更 A:元ファイルファイル名 B;移動先ファイル名 rm A ファイル、ディレクトリの削除 -r –R :ディレクトリ内の削除 -f :警告メッセージを表示しない -d:ディレクトリごと削除(スーパーユーザのみ) mkdir A ディレクトリの生成 -p:指定したディレクトリをサブディレクトリごと 作成する。ツリー状のディレクトリも作成可能 chmod モード A パーミッションの変更 Aというファイルをモードで指定したパーミッショ ンに変更 モード:777(全ユーザにrwxの権限)やa+x(全ユ ーザに実行権限) chown usr01 A chown usr01:g1 A ファイル所有者の変更 Aの所有者をuser01に変更 Aの所有者をuser01、所属グループg1に変更 -R :ディレクトリとその中野ファイルの所有者を 変更 fdisk パーティションの作成、削除、変更 mkfs ファイルシステムの作成(フォー マット) -t fstype 作成するファイル・システムを指定する This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-90
  • 92. Linuxコマンドの復習 mount A B ファイルシステムのマウント AをBにマウントする umount B ファイルシステムのアンマウント Bをアンマウントする ps 実行中プロセスの情報表示 top プロセスの稼動状況などのリアルタイム 表示 env 環境変数の表示 export 環境変数の設定 exit 現在のユーザのログアウト reboot システムの再起動 sudo 別ユーザでコマンド実行 cat テキストファイルの内容を閲覧、ファイ ルの連結 less ファイルの内容をページ単位で表示 gzip A gzファイルに圧縮 Aを圧縮する -d:圧縮ファイルを展開する tar オプ ション A.tar (/A) アーカイブの作成、展開やtarファイル の圧縮、解凍 tar cvf A.tar /A:/Aディレクトリ以下をA.tarという名前で アーカイブする tar xvf A.tar:A.tarというアーカイブをすべて展開する( 処理経過表示) ftp コンピュータ間のファイルの送受信 ftp 192.168.1.11 ping コンピュータ間の接続状態のテスト ping 192.168.1.11 export <環境変数名>=<パス> This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-91
  • 93. EM3とは EM(EmbeddedMaster)とはOESFのディストリビューション ワー キンググループを中心に仕様策定、構築、公開をしている 組込み機器向けのAndroidのディストリビューションのシリー ズです http://www.oesf.jp/ Androidのフレームワークに準拠 し、AndroidのAPIとの互換性を保 ちつつ、情報家電等の組込みシス テムで共通に必要となる、 各種 機能を拡張しております。また、 開発に際してはOESFで選定した ハードウェアプラットホームを ターゲットとしています This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-92
  • 94. Embedded Master 開発者サイト AOSPと同様にEMにも開発者のためのサイト (http://developer.oesf.biz/em/developer/)があります。 各バージョンのリリース情報やソースコードの取得方法、 ターゲットボードでの動作のさせ方など、詳しい開発情報が 得られます。 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-93
  • 95. Embedded Master バージョン バージョ ン コード 説明 5 Fig TBD 4 EggPlant Andrid 4.0がベース 詳細は近日にアナウンス予定 Durian Andrid 2.2がベース OPBのバージョンアップ、 グラフ・チャートAPI、OSGi拡張機能 2 Cinnamon Andrid 2.0がベース 拡張ビルド環境(OESF Platform Builder: OPB) マーケットプレイスSDKの提供 1 Blue Berry 3 シンボル EMの初代バージョン。Android1.6がベース 高解像度スクリーンのサポート This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-94
  • 96. EM3ソースコードの取得 Armadillo440用のカー ネルコードの取得方法 の説明リンク サポートしているカーネルの機能 Core: Android^(TM) 2.2_r1.3 wpa_supplicant(version 0.5.11) OESF boot screen Usb keyboard supported ALSA sound supported ・ALSA-library(version 1.0.23) ・ALSA-Utility(version 1.0.23) ・ビルド環境のセットアッ プ (OBPを使用する場合はEclipseの pluginであるCDTをインストールす る必要があるが今回は使用しない) ・EM3 for ARMのソース コードの取得方法 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-95 95
  • 97. EM3ソースコードの取得 [host_pc~] [host_pc~] [host_pc~] [host_pc~] [host_pc~] > > > > > cd␣~work mkdir␣v2_armadillo440-training export␣ANDROID=~/work/v2_armadillo440-training cd␣$ANDROID git␣clone␣git://github.com/OESF/Embedded-Master- ARM.git : Resolving deltas: 100% (136625/136625), done. Checking out files: 100% (257515/257515), done. : [host_pc~] > cd␣Embedded-Master-ARM/ [host_pc~] > ls core i5 メモリ 1.5G ubuntu on vmware 90分くらい Makefile build development frameworks linaro packages sdk bionic cts device hardware ndk pms system bootable dalvik external kernel opb prebuilt vendor タグで正確にEM3を取得するにはgit clone終了後以下を実行 [host_pc~] > cd␣Embedded-Master-ARM [host_pc~] > git␣checkout␣-b␣EM3␣refs/tags/EmbeddedMaster-3.1.0 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-96 96
  • 98. Androidのユーザランドのビルド core i5 メモリ 1.5G ubuntu on vmware 120分くらい // Androidユーザランドのビルド [host_pc~] > cd␣$ANDROID/Embedded-Master-ARM/ [host_pc~] > echo␣"TARGET_PRODUCT:=armadillo440"␣>␣buildspec.mk [host_pc~] > make␣-j2 2012年5月23日現在ビルドエラーが発生します。 packages/apps配下の下記フォルダを削除することでビルドエラーの発生を回避できま OesfAndroidSystemMonitor OesfNaviCoopAppCarIcon OesfNaviCoopAppPoiDest OesfNaviCoop_PluginNavi_CoopAppRoute OesfSystemMonitorExample OesfMonitorLogGraphicView OesfNaviCoopAppDispArea OesfNaviCoop_PluginNavi_CoopAppDisplay OesfNaviCoop_PluginNavi_CoopAppStatus This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-97 97
  • 99. 実 習 ユーザランドのファイルシステム作成 カンペ⇒01_ユーザランドのファイルシステム作 成.txt [host_pc~] > cd␣$ANDROID [host_pc~] > mkdir␣-p␣android-root ・・・① [host_pc~] > cd␣$ANDROID/Embedded-Master-ARM/out/target/product/armadillo440 [host_pc~] > cp␣-Rdpf␣root/*␣$ANDROID/android-root ・・・② [host_pc~] > cp␣-Rdpf␣system/* $ANDROID/android-root/system/ ・・・③ [host_pc~] [host_pc~] [host_pc~] [host_pc~] [host_pc~] > > > > > cd␣$ANDROID/android-root sudo␣chown␣-R␣root.root␣. ・・・④ sudo␣chmod␣777␣-R␣system/usr/keychars ・・・⑤ sudo␣chmod␣777␣-R␣system/usr/keylayout ・・・⑤ sudo␣chmod␣777␣system/etc/dhcpcd/dhcpcd-run-hooks ・・・⑤ ①v2_armadillo440-trainingフォルダ直下に「android-root」というフォルダを作成 ②$ANDROID/Embedded-Master-ARM/out/target/product/armadillo440/root/以下のすべてのファイルや フォルダを「android-root」フォルダにコピー ③$ANDROID/Embedded-Master-ARM/out/target/product/armadillo440/system/以下のすべてのファイル やフォルダを「android-root/system」フォルダにコピー ④「android-root」フォルダにroot権限を付与 ⑤system/usr/keychars、system/usr/keylayout(ハードキーのバインド設定ファイル類)と system/etc/dhcpd//dhcpcd-run-hooksに実行権限を付与する This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-98 98
  • 100. 実 習 固定IPアドレスの設定について Androidのネットワーク設定は移植先のターゲットボードのルートファイル システムにあるハードウェア専用の起動スクリプトinit.<hardware名>.rc で設定されている Armadillo440の場合 → $ANDROID/androidroot/init.armadillo440.rc : on boot コメントをはずす setprop ro.sf.lcd_density 120 sudo gedit init.armadillo440.rc setprop ro.radio.use-ppp no setprop ro.radio.noril yes setprop status.battery.state Slow#LAN service lan-setup setprop status.battery.level 5 setprop status.battery.level_raw /system/etc/init.armadillo440.sh 50 setprop status.battery.level_scale 9 oneshot setprop net.eth0.dns1 8.8.8.8 setprop net.dns1 8.8.8.8 symlink /dev/snd/dsp /dev/eac このシェルスクリ chmod 0666 /dev/snd/dsp write /sys/class/backlight/pwm-backlight/brightness プトも確認(次 255 ページ) #LAN ##service lan-setup /system/etc/init.armadillo440.sh ## oneshot This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-99 99
  • 101. 実 習 固定IPアドレス設定 カンペ⇒02_固定IPアドレス設 定.txt //Androidのネットワーク設定ファイルに固定IPアドレスを設定しておく [host_pc~] > cd␣$ANDROID/android-root [host_pc~] > cd␣system/etc [host_pc~] > sudo␣gedit␣init.armadillo440.sh gedit起動、編集 #!/system/bin/sh netcfg eth0 up netcfg eth0 dhcp #!/system/bin/sh ifconfig␣eth0␣192.168.1.11 保存してgedit終了 //実行権限をつける [host_pc~] > sudo␣chmod␣a+x init.armadillo440.sh This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-100 100
  • 102. 実 習 Androidファイルシステムの完成 カンペ⇒03_ファイルシステムの完 成.txt //Androidユーザランドのファイルシステムをアーカイブにする [host_pc~] > cd␣$ANDROID/android-root [host_pc~] > tar␣cvzf␣$ANDROID/rootfs_a_training.tar.gz . [host_pc~] > cd␣$ANDROID [host_pc~] > ls [host_pc~] > rootfs_a_training.tar.gz␣android-root␣EmbeddedMaster-ARM ユーザランドのファイルシステム This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-101 101
  • 103. Androidのユーザランドの ファイルシステム構成(/) data root / キャッシュ、追加パッケージなど格納ディレクト (R/W)(空) dev デバイスファイル格納ディレクトリ(空) proc Linux設定ファイル格納ディレクトリ(空) sys システムファイル格納ディレクトリ(空) sbin adbd実行ファイル格納ディレクトリ system 次頁参照 init 起動処理実行ファイル init.armadillo440.rc initが実行するターゲットボード固有 起動用シェルスクリプト init.rc initが実行するAndroid固有起動用シェルスクリプ default.prop Androidデフォルトプロパティ init.goldfish.rc エミュレータ起動用シェルスクリプト initlogo.rle 起動時のロゴの画像ファイル (RGB888のRAW形式の画像 ) 空のディレクトリはAndroid起動時にカーネルやinitによって自動作成されます This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-102 102
  • 104. Androidのユーザランドの ファイルシステム構成(/system/) app /system/ bin etc fonts framework lib usr xbin build.prop プリインストールのアプリケーション ファイル(.apk) 各種一般的なLinuxコマンド 設定用シェルスクリプトなど フォントファイル(.ttf) javaのandroidのライブラリ(.jar) ネイティブライブラリ(.so) キー設定ファイルなど root用のコマンドなど Androidデフォルトプロパティ This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-103 103
  • 105. 実 習 Androidカーネルの作成 カンペ⇒04_カーネルの作成.txt [host_pc~] > cd␣$ANDROID/Embedded-Master-ARM/kernel/armadillo440 [host_pc~] > make␣ARCH=arm␣CROSS_COMPILE=$ANDROID/Embedded-MasterARM/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi␣armadillo400_android_defconfig ・・・① [host_pc~] > make␣ARCH=arm␣CROSS_COMPILE=$ANDROID/Embedded-MasterARM/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi- ・・・② //カーネルのイメージファイル作成 [host_pc~] > gzip␣-c␣arch/arm/boot/Image␣>␣linux_training.bin.gz ①カーネルのコンフィギュレーションファイル (armadillo400_android_defconfig)に記載してある設 定を.configに適用 ②arm-eabi-というクロスコンパイラでカーネルをコンパ イル ③イメージファイルをgzipで圧縮 Androidのカーネルイメー ジ ※①②は実習時間短縮のためすでに実行済みなのでオブ ジェクトファイルなどはできています。 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-104 104
  • 106. Linuxカーネルのコンパイルオプション設定 ■Linuxカーネルのコンパイルオプション設定とは ①ある機能をコンパイル「する/しない」の設定 →カーネルのオプション設定項目は膨大 ②機能をコンパイルする上でどんな形でコンパイルするかの設定 →機能を静的にカーネルのバイナリに組み込むか →機能をモジュールとしてコンパイルするのか ■コンパイル設定方法 ・GUI設定ツールを使用して設定を行う →$make menuconfig ・設定用ファイルを用意してmakeコマンドで設定を行う →$make <ターゲットのハード名>_<*>_defconfig ■設定内容はmenuconfig終了後「.config」ファイルに収めら This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-105 105
  • 107. KconfigとMakefile ■Linuxカーネルのコンパイルオプション設定で設定できる オプション名は「Kconfig」というファイルで設定されてい ます ■ハードウェアのドライバのソースコードが収まっている ディレクトリには必ず「Kconfig」と「Makefile」が存在し ます ■新しいハードウェアを追加するたびにこのKconfigファイ ルにオプション名を追加し、Makefileにはそのオプション に関係のあるソースコード(オブジェクトファイル)の依 存関係の設定を行います This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-106 106
  • 108. KconfigとMakefile 具体例を見てみましょう。 USBメモリの機能を追加するためのパラメータ(オプション名)とそれに関連するドライバ のソースコードを探す方法です。 USBメモリはストレージ設備(USB Mass Storage)なのでdrivers/usb/storage/ディレク トリ内のKconfigを見てみます。 config USB_STORAGE_DATAFAB bool "Datafab Compact Flash Reader support (EXPERIMENTAL)" depends on USB_STORAGE && EXPERIMENTAL help Support for certain Datafab CompactFlash readers. Datafab has a web page at <http://www.datafabusa.com/>. ⇒Datafab社製の製品でコンパクトフラッシュリーダーに関連 する機器 config USB_STORAGE_SDDR55 bool "SanDisk SDDR-55 SmartMedia support (EXPERIMENTAL)" depends on USB_STORAGE && EXPERIMENTAL help Say Y here to include additional code to support the Sandisk SDDR-55 SmartMedia reader in the USB Mass Storage driver. ⇒SanDisk社製の製品でスマートメディアカードに関連する機 器 config USB_STORAGE ←USBメモリの機能のオプション tristate "USB Mass Storage support" 名 depends on USB && SCSI ---help--Say Y here if you want to connect USB mass storage devices to your computer's USB port. This is the driver you need for USB floppy drives, USB hard disks, USB tape drives, USB CD-ROMs, USB flash devices, and memory sticks, along with similar devices. This driver may also be used for some cameras and card readers. This option depends on 'SCSI' support being enabled, but you probably also need 'SCSI device support: SCSI disk support' (BLK_DEV_SD) for most USB storage devices. This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-107 To compile this driver as a module, choose M 107
  • 109. KconfigとMakefile 次にMakefileを見てみます # Makefile for the USB Mass Storage device drivers. # 15 Aug 2000, Christoph Hellwig # Rewritten to use lists instead of if-statements. # EXTRA_CFLAGS := -Idrivers/scsi obj-$(CONFIG_USB_STORAGE) += usb-storage.o usb-storage-obj-$(CONFIG_USB_STORAGE_DEBUG) usb-storage-obj-$(CONFIG_USB_STORAGE_USBAT) : <省略> usb-storage-obj-$(CONFIG_USB_STORAGE_KARMA) usb-storage-objs := ←このオプションに対するモジュール += debug.o += shuttle_usbat.o += karma.o scsiglue.o protocol.o transport.o usb.o ←scsiglue.c、protocol.c、 initializers.o $(usb-storage-obj-y)transport.c、usb.c、 ifneq ($(CONFIG_USB_LIBUSUAL),) obj-$(CONFIG_USB) += libusual.o endif initializers.c及びこれらと 同名のヘッダファイルがモ ジュールの実体 であることがわかります This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-108 108
  • 110. 「.config」ファイルについて .config # # Automatically generated make config: don’t edit # : # : CONFIG_64BIT=y #CONFIG_X86_32 is not set CONFIG_X86_64BIT=y CONFIG_X86=y ・・・ 値 意味 =y この項目に対応する機能は静的にカーネルに組込まれる =m この項目に対応する機能は、モジュールとしてコンパイルされ る。機能の中にはモジュールとしてコンパイルできないものが ある。その場合対応する設定項目がこの値をとることはない。 # CONFIG_* is not set この項目に対応する機能はコンパイルされない。コメントアウ ト。 カーネルをビルドするとこのファイルの設定値でカーネルが作られる .configを直接手で編集してはいけない ある機能が他の機能に依存している可能性がある 機能の依存関係はKconfigが把握している This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-109 109
  • 111. 「.config」の新規作成 ・「.config」がまだ存在しない場合 →$make menuconfig → <Exit> →「.config」が生成 →Kconfigにおいてdefault指定された機能のみ 「.config」に適用 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-110 110
  • 112. 「.config」の更新 ・「.config」がすでに存在する場合 →ソースツリーのルートに配置 →$make oldconfig 新しく追加された設定項目について1つ1つ設定するか確認さ れる (とりあえずすべてリターンでデフォルトを適用) →「.config」が再生成 →$make menuconfigでカスタム設定→<Exit> →「.config」更新 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-111 111
  • 113. 参 考 menuconfigの操作方法 ↑ 項目の選択カーソルを上に移動 項目の選択カーソルを下に移動 <TAB> 、← 、→ 動作メニュー( Select/Exit/Help)を切り替え <Enter> 選択されている動作メニューに 応じて動作を行う y 項目を<*>(有効:静的組込み) n 項目を<>無効にする m 項目を<M>(有効:モジュール としてコンパイルする) <SPACE> <Exit>→ 「新しい設定を保存するか?」 → YES→.configに保存 動作 ↓ [host_pc~] > make␣menuconfig キー 項目を<M>/<*>/<>のトグルで切 り替える <ESC><ESC> 上の階層に戻る(<Exit>と同じ ) ? 選択されている項目に関するヘ ルプを表示(<Help>と同じ) 設定項目を検索する。設定項目 / のシンボル名からメニュー上の 0-112 位置を探す場合に便利 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 112
  • 114. アーキテクチャ毎の「.config」設定ファイル ・アーキテクチャ毎の「.config」の設定ファイルを 作成する →$make defconfig →アーキテクチャ毎のデフォルト設定に基づいた「.config」の設定ファ イルが生成 →生成される場所 <linuxのソース>/arch/<arch>/configs/ <ターゲットのハード名 >_<*>_defconfig This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-113 113
  • 115. 実 習 armadillo400_android_defconfig 下記のファイルを開いて確認してみましょう $ANDROID/Embedded-MasterARM/kernel/armadillo440/arch/arm/configs/armadillo400_android_defconfig このファイルはカーネルのコンフィギュレーションの設定値(ターゲットボードの ハードウェアおよびAndroidに特化した設定)が記載されたファイルです makeコマンドでこのファイルを指定することによってカーネルオプションとし て.configに反映されます armadillo400_android_defconfigの一部抜粋 # Networking options CONFIG_ANDROID_PARANOID_NETWORK=y # Voltage and Current regulators CONFIG_ANDROID_PMEM=y # Android CONFIG_ANDROID=y CONFIG_ANDROID_BINDER_IPC=y CONFIG_ANDROID_LOGGER=y # CONFIG_ANDROID_RAM_CONSOLE is not set CONFIG_ANDROID_TIMED_OUTPUT=y CONFIG_ANDROID_TIMED_GPIO=y CONFIG_ANDROID_LOW_MEMORY_KILLER=y This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-114 114
  • 116. armadillo400_android_defconfig # #MX25 Options # CONFIG_MACH_ARMADILLO420=y CONFIG_MACH_ARMADILLO440=y # #Armadillo-400 Board options # # CONFIG_ARMADILLO400_GPIO_A_B_GPIO is not set CONFIG_ARMADILLO400_GPIO_A_B_I2C=y # CONFIG_ARMADILLO400_GPIO_A_B_KEY is not set CONFIG_ARMADILLO400_GPIO_C_D_GPIO=y # CONFIG_ARMADILLO400_GPIO_C_D_I2C is not set ## Select wakeup source # CONFIG_ARMADILLO400_UART2_WAKE_SRC_SELECT=y # CONFIG_ARMADILLO400_UART3_WAKE_SRC_SELECT is not set # CONFIG_ARMADILLO400_UART5_WAKE_SRC_SELECT is not set CONFIG_ARMADILLO400_TOUCHSCREEN_WAKE_SRC_SELECT=y CONFIG_ARMADILLO400_TOUCHSCREEN_IS_WAKE_SRC=1 CONFIG_ARMADILLO400_GPIO_KEYS_WAKE_SRC_SELECT=y CONFIG_ARMADILLO400_GPIO_KEYS_IS_WAKE_SRC=1 CONFIG_UTMI_MXC=y # #Mapping drivers for chip access # CONFIG_MTD_ARMADILLO=y # #Display device support # CONFIG_LOGO=y CONFIG_LOGO_ARMADILLO_CLUT224=y ## System on Chip audio support # CONFIG_SND_SOC=y CONFIG_SND_MXC_SOC=y CONFIG_SND_MXC_SOC_SSI=y CONFIG_SND_SOC_ARMADILLO440_WM8978=y #NFS設定 ## Miscellaneous filesystems # CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V3=y CONFIG_NFS_V3_ACL=y CONFIG_ROOT_NFS=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_NFS_ACL_SUPPORT=y CONFIG_NFS_COMMON=y CONFIG_SUNRPC=y This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-115 115
  • 117. 参 考 makeコマンド関連 [host_pc~] > make カーネルのコンパイルをする。ソースツリーのルートディレクトリで実行。 [host_pc~] > make␣modules_install コンパイルされたモジュールを/lib/modulesにインストール。 [host_pc~] > make␣install カーネルバイナリイメージを/boot以下にインストールされる。 Fedora系ではブート時初期化ファイルシステムイメージも作成される。 [host_pc~] > update-initramfs␣–c␣–k␣<カーネルバージョン > Debian系においてブート時初期化ファイルシステムイメージも作成する際に使用するコマンド ファイルまたはディレクトリ名 内容 /lib/modules/<カーネルバージョン>/ モジュールが配置されるディレクトリ /boot/vmlinuz-<カーネルバージョン> カーネルイメージファイル /boot/initramfs-<カーネルバージョン> または /boot/initrd.img-<カーネルバージョン> ブート時初期化用ファイルシステムイメージ /boot/Systemmap-<カーネルバージョン> アドレス情報ファイル This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-116 116
  • 118. 参 考 mekeコマンド関連 [host_pc~] > make␣clean ソースツリーをコンパイル前に戻す。オブジェクトファイルは削除される が.configやコンパイル時に生成された一部ファイルは削除されない。 [host_pc~] > make␣help 使用可能なmakeターゲットを表示する。 [host_pc~] > make␣<dir>/<file>.o 指定したオブジェクトファイルを生成するのに必要なコンパイルだけを行う。 <dir>だけを指定した場合は、 .config によって生成されることになっている そのディレクトリ内すべてのオブジェクトファイルが生成される。 [host_pc~] > make␣<dir>/<file>.ko 指定したモジュールだけを生成する This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-117 117
  • 119. makeコマンド(クロスコンパイル) クロスコンパイルに必要な変数 変数 意味 ARCH ターゲットアーキテクチャ CROSS_COMPILE クロスコンパイラのプレフィックスを指定 [host_pc~] > make␣ARCH=arm CROSS_COMPLIE=armv5tel-linux-␣uImage クロスコンパイラarmv5tel-linux-gccによってARM向けのカーネルをクロスコンパイルする。 生成するカーネルのバイナリイメージはuImage形式がよく使われる。 arch/arm/boot/uImageとして生成される。 [host_pc~] > make␣ARCH=arm CROSS_COMPLE=armv5tel-linux-␣modules クロスコンパイラarmv5tel-linux-gccによってARM向けのカーネルモジュールをクロスコン パイルで生成する。 [host_pc~] > make␣ARCH=arm CROSS_COMPLE=armv5tel-linux-␣ INSTALL_MOD_PATH=~/armroot-2.6.38␣modules_install ホームディレクトリに~/armroot-2.6.38/lib/modulesというディレクトリが生成されその 下にクロスコンパイルで生成されたモジュールがインストールされる。 シンボリックリンク(build、source)->カーネルがコンパイルされたソースツリーをさす。 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-118 118
  • 120. 実 習 コンフィギュレーションの確認 makeコマンドやmake menuconfigでカーネルコンフィギュレーション値 が反映されたか確認する場合は •方法1:「.config」をlessで確認(実習) •方法2:make menuconfigコマンドでGUIから確認(参考) // 方法1:カーネルの設定(.configへの適用)を確認する [host_pc~] > cd␣$ANDROID/Embedded-Master-ARM/kernel/armadillo440 [host_pc~] > less␣config lessで開いて検索( 「/」キーのあとにキーワードを入れてリターン)し設定が反映され ているかを確認する # Voltage and Current regulators CONFIG_ANDROID_PMEM=y #Android CONFIG_ANDROID=y CONFIG_ANDROID_BINDER_IPC=y CONFIG_ANDROID_LOGGER=y など This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-119 119
  • 121. 参 考 コンフィギュレーションの確認 //方法2:make menuconfigコマンドでGUIから確認 [host_pc~] > cd␣$ANDROID/Embedded-Master-ARM/kernel/ [host_pc~] > make menuconfig Androidに特化したカーネルオプションの確認 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-120 120
  • 122. 参 考 コンフィグレーションの確認 NFS設定を行った場合の確認 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-121 121
  • 123. メモ This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-122 122
  • 124. Armadillo440 製品版Linuxイメージファイル アットマークテクノのサイトから出荷時状態のLinuxカーネル、ユーザランド、ダウン ローダー「Hermit-at」をダウンロードする http://armadillo.atmark-techno.com/armadillo-440/downloads 「Hermit-at」はAndroidをArmadillo440の移植する際に使用するので開発PCにインス トールする Linuxカーネルやユーザランドも必要なので必ず開発PCにダウンロードして保存しておく 【Hermit-at】 hermit-at_2.1.0_i386.deb ダブルクリックしてインストールすること 【製品版Linuxカーネ ル】 linux-a400-1.06.bin.gz 【製品版Linuxユーザラン ド】 0-123 romfs-a440-1.04.img.gz This material is licensed under the Creative Commons License BY-NC-SA 4.0. 123
  • 125. 実習の開発環境まとめ 開発用PC 【実習用のAndroidソースコードのrootパス】 /home/aj741327/work/v2_armadillo440-training/Embedded-Master-ARM 【Android用Linuxカーネルのソースコードのrootパス】 /home/aj741327/work/v2_armadillo440-training/EmbeddedMasterARM/kernel 【環境変数】 [host_pc~] > export␣ANDROID=/home/aj741327/work/v2_armadillo440- training Android kernelイメージ $ANDROID/Embedded-MasterARM/kernel/armadillo440/linux_training.bin.gz Androidユーザラン ドのファイルシステ $ANDROID/rootfs_a_training.tar.gz ム Armadillo440製品版Linux kernelイメージ ~/work/atmark/linux-a400-1.06.bin.gz ユーザランドイメー ジ ~/work/atmark/romfs-a440-1.04.img.gz This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-124 124
  • 126. ダウンローダ:Hermitについて 開発用PCにRS232Cの端子がない場合はUSB-RS232C変換ケーブ ルを使用してUSBで接続してください 開発用PC hermit Armadillo用 ブートローダ兼ダウンロー ダ # 開発PCからイメージファイルをArmadilloにダウンロードするダウンローダとして使用す る # (例)atmarktechno製のLinuxカーネルイメージをarmadilloのフラッシュメモリに書き 込む [host_pc~] > cd␣~/work/atmark [host_pc~] > hermit␣download␣--input-file␣linux-a400-1.06.bin.gz␣--region␣kernel␣-- port␣ /dev/ttyUSB0 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-125 125
  • 127. ブートローダ:Hermitについて 開発用PCにRS232Cの端子がない場合はUSB-RS232C変換 ケーブルを使用してUSBで接続してください JP2ショート状態 (hermit起動モー ド) 開発用PC 【C-Kermitの使い方】 *ホームディレクトリで起動させる こと Armadillo440 hermit Armadillo用 ブートローダ兼ダウンロー ダ C-Kermit シリアル通信ソ フト 起動 接続 ヘルプ 切断 c 終了 # シリアル通信ソフトを介してarmadilloのブートローダーに接続する kermit c ? ctrl + ctrl + q [host_pc~] > kermit ← C-Kermit起動 Executing /home/aj741327/.mykermrc... ?SET SPEED has no effect without prior SET LINE C-Kermit 8.0.211, 10 Apr 2004, for Linux Copyright (C) 1985, 2004, Trustees of Columbia University in the City of New York. Type ? or HELP for help. (/home/aj741327/) C-Kermit>c ← ターゲット(armadillo-440)にシ リアル接続 [armadillo] hermit> ンプトが表示(接続済み) This material is licensed under the Creative Commons License BY-NC-SA 4.0. ← armadilloのhermitプロ 0-126 126
  • 128. Armadillo440でAndroidを起動する手順 ① ② ③ ④ ⑤ ⑥ ⑦ 製品版Linuxで起動 Armadillo440側のネットワークの設定 microSDのパーティションと初期化 Android RootfsをArmadillo-440へ転送 Android RootfsをmicroSDに展開 AndroidのLinuxカーネルのメモリ書き込み Android起動 0-127 This material is licensed under the Creative Open Embedded Software Foundation, All rights reserved Copyright 2009-2012, Commons License BY-NC-SA 4.0. 127
  • 129. 製品版Linuxで起動してみよう JP2をショート C-Kermit シリアル通信ソフ ト カンペ⇒05_製品版Linuxのブート手 順.txt 1.JP2をショートにする 2.シリアルケーブルでPCとArmadillo-440を接続する 3.LANケーブルでPCとArmadillo-440を接続する 4.Micro SDカード(1G以上)をスロットに挿入して電源を入 れる 5.C-Kermit起動(前頁参照) 6.Armadillo440の起動 microSD 実 習 hermit> clearenv //起動パラメータをク リア 1G以上のmicroSD hermit> boot //起動コマンド Armadillo-440は出荷時状態です Armadillo440用の標準カーネル と標準ユーザランドが載っていま す ・・・・起動ログが流れます login : root //ログイン名入力 password : root //パスワード入力 [root@armadillo440-0 (ttymxc1) ~]# //起動 完了 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-128 128
  • 130. 実 習 Armadillo440側のネットワークの設定 作業PC側のネットワーク設定 ip:192.168.1.10 subnet:255.255.255.0 カンペ⇒06_製品版Linuxのネットワーク設 定.txt 192.168.1.10 [armadillo ~] # vi␣/etc/config/interfaces #␣/etc/network/interfaces␣--␣configuration␣file␣for␣ifup(8),␣ifdown(8) auto␣lo␣eth0 iface␣lo␣inet␣loopback iface␣eth0␣inet␣static address␣192.168.1.11 netmask␣255.255.255.0 network␣192.168.1.0 broadcast␣192.168.1.255 gateway␣192.168.1.1 viで編集 192.168.1.11 [armadillo [armadillo [armadillo [armadillo [armadillo ~] ~] ~] ~] ~] # # # # # cd␣/etc/config flatfsd␣–s //コンフィギュレーション領域に保存 ifdown␣eth0 ifup␣eth0 ifconfig //確認 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-129 129
  • 131. 実 習 microSDのパーティションと初期化 パーティションのイメージ mmcblk0p1 FAT 1-100M mmcblk0p2 microSD 4G ext3 残り全部の容量 [armadillo ~] # fdisk␣/dev/mmcblk0 The number of cylinders for this disk is set to 30656. There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with: 1) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK) Command (m for help): d //削除コマンド Selected partition 1 //パーティション1を指定(不要なパーティションが残っていた 場合念のため削除) This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-130 130
  • 132. 実 習 microSDのパーティションと初期化 Command (m for help): n //新規パーティション追加コマンド Command action e extended p primary partition (1-4) p //パーティション Partition number (1-4): 1 //パーティション1を選択 First cylinder (1-30656, default 1): リターン(default 1) //シリンダの開始値 Using default value 1 Last cylinder or +size or +sizeM or +sizeK (1-30656, default 30656): +100M //シ リンダの終了値 Command (m for help): n //新規パーティション追加コマンド Command action e extended p primary partition (1-4) p //パーティション Partition number (1-4): 2 //パーティション2を選択 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-131 131
  • 133. 実 習 microSDのパーティションと初期化 First cylinder (3054-30656, default 3054):リターン(default 3054 ) //シリンダの開 始値 Using default value 3054 Last cylinder or +size or +sizeM or +sizeK (3054-30656, default 30656): ): リターン(default 30656 ) //シリンダの終了値 Using default value 30656 Command (m for help): w //パーティション作成実行して終了 The partition table has been altered! Calling ioctl() to re-read partition table. mmcblk0: p1 p2 mmcblk0: p1 p2 Syncing disks. [armadillo ~] # mkdosfs␣/dev/mmcblk0p1 ↑パーティション1(データ保存領域) はWindowsとのデータ交換を考え てDOS用 ファイルシステムFATでフォーマット [armadillo ~] # mke2fs␣-j␣/dev/mmcblk0p2 ↑パーティション2(Android ユーザーランド領域) はEXT3 でフォー マット This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-132 132
  • 134. 実 習 Android RootfsをArmadillo-440へ転送 開発PC armadillo440 /home/ftp/pub/ FTP rootfs_a_training.tar.gz 192.168.1.11 カンペ⇒07_Android RootFSのFTP転送.txt 192.168.1.10 $ANDROIDの有効化 [host_pc~] > export ANDROID=~/work/v2_armadillo440-train [host_pc~] > cd␣$ANDROID [host_pc~] > ftp␣192.168.1.11 login name:ftp login password:なし ftp> cd␣pub ftp> bin ftp> put␣rootfs_a_training.tar.gz ftp> bye [host_pc~] > This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-133 133
  • 135. 実 習 Android RootfsをmicroSDに展開 Armadillo440の/home/ftp/pubからAndroidのユーザラ ンドのファイルシステムをmicroSDカードのパーティ ション2(mmcblk0p2)に展開します カンペ⇒08_Android RootFSをmicroSDに展開.txt [armadillo ~] # mount␣/dev/mmcblk0p2 /mnt //microSDのパーティション2 にマウント [armadillo ~] # cd␣/home/ftp/pub のある場所へ [armadillo ~] # mv␣rootfs_a_training.tar.gz␣/mnt/. //ftpで転送したRootfs //マウント配下にRootfsを 移動 //マウントディレ [armadillo ~] # cd␣/mnt クトリへ [armadillo ~] # tar␣xzvf rootfs_a_training.tar.gz [armadillo ~] # rm␣–rf␣lost+found [armadillo ~] # rm␣–rf rootfs_a_training.tar.gz [armadillo ~] # cd␣.. // Rootfsを展開 //不要なフォルダの削除 //tarファイルも削除 //マウント ディレクトリから抜ける [armadillo ~] # umount␣/mnt This material is licensed under the Creative Commons License BY-NC-SA 4.0. //アンマウント 0-134 134
  • 136. 実 習 製品版Linuxのrebootとkermit切断 [armadillo ~] # reboot [armadillo ~] # System is going down for system reboot now. Starting local stop scripts. Exiting Syslogd! Syncing all filesystems: done Unmounting all filesystems: done The system is going down NOW !! Sending SIGTERM to all processes. Please stand by while rebooting the system. Hermit-At v2.0.8 (armadillo4x0) compiled at 15:29:17, Nov 12 2010 hermit> <ctrl+→ctrl+c> //ショートカットキー (Back at ubuntu-vm) ---------------------------------------------------(/home/aj741327/) C-Kermit>q Closing /dev/ttyUSB0...OK [host_pc~] > This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-135 135
  • 137. 実 習 AndroidのLinuxカーネルをフラッシュROMに書き込む Armadollo-440 開発用PC hermit Armadillo用 ブートローダ兼ダウンローダ Androidのユーザランドの ルートファイルシステム が入っています Armadillo440用の標準カーネル をAndroidのLinuxカーネルで上書きしま す カンペ⇒09_Androidブート手順.txt # Armadillo440用の標準カーネルをAndroidのLinuxカーネルで上書きします [host_pc~] > cd␣$ANDROID/Embedded-Master-ARM/kernel/armadillo440 [host_pc~] > hermit␣download␣--input-file␣linux_training.bin.gz␣--region␣kernel␣ --port␣/dev/ttyUSB0 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-136 136
  • 138. 実 習 Androidを起動しましょう [host_pc~] > cd [host_pc~] > kermit C-Kermit起動 & 接続 C-Kermit> c Armadilloにシリアル hemit> setenv␣console=ttymxc1␣root=/dev/mmcblk0p2␣init=/init␣noinitrd␣rootwait hermit> setenv カーネル起動パラメータ設定 確認 1: console=ttymxc1 & 2: root=/dev/mmcblk0p2 3: init=/init 4: noinitrd 5: rootwait hermit> boot 起動 Uncompressing カーネルスター kernel.................................................................................................... ト ........done. Doing console=ttymxc1 Doing root=/dev/mmcblk0p2 Linuxカーネルのバージョン Doing init=/init ARMのアーキテクチャ Doing noinitrd Doing rootwait Linux version 2.6.26-at7 (unknown) (aj741327@ubuntu-vm) (gcc version 4.4.0 (GCC) ) #1 PREEMPT Tue Feb 15 14:50:35 JST 2011 0-137 CPU: ARM926EJ-S [41069264] revision 4 (ARMv5TEJ), cr=00053177 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 137
  • 139. Android起動ログ Machine: Armadillo-440 Memory policy: ECC disabled, Data cache writeivity 4, 32 byte lines, 128 sets CPU0: D cache: 16384 bytes, associativity 4, 32 byte lines, 128 sets Built 1 zonelists in Zone order, mobility grouping on. Total pages: 32512 カーネル起動パラメー Kernel command line: console=ttymxc1 root=/dev/mmcblk0p2 init=/init noinitrd rootwait タ MXC IRQ initialized PID hash table entries: 512 (order: 9, 2048 bytes) MXC GPT timer initialized, rate = 12000000 Console: colour dummy device 80x30 Dentry cache hash table entries: 16384 (order: 4, 65536 bytes) Inode-cache hash table entries: 8192 (order: 3, 32768 bytes) Memory: 128MB = 128MB total Memory: 125912KB available (3200K code, 683K data, 112K init) カーネル初期化 Mount-cache hash table entries: 512 CPU: Testing write buffer coherency: ok net_namespace: 480 bytes NET: Registered protocol family 16 MXC WDOG1 Enabled This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-138 138
  • 140. Android起動ログ CPU is i.MX25 Revision 1.0 Clock input source is 24000000 MXC GPIO hardware Using SDMA I.API MXC DMA API initialized SCSI subsystem initialized usbcore: registered new interface driver usbfs usbcore: registered new interface driver hub usbcore: registered new device driver usb MXC I2C driver カーネル初期化 MXC I2C driver MC34704 regulator successfully probed mc34704 0-0054: Loaded NET: Registered protocol family 2 IP route cache hash table entries: 1024 (order: 0, 4096 bytes) TCP established hash table entries: 4096 (order: 3, 32768 bytes) fsl-ehci fsl-ehci.1: Freescale On-Chip EHCI Host Controller fsl-ehci fsl-ehci.1: new USB bus registered, assigned bus number 2 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-139 139
  • 141. Android起動ログ fsl-ehci fsl-ehci.1: irq 37, io mem 0x53ff4000 fsl-ehci fsl-ehci.1: USB 2.0 started, EHCI 1.00, driver 10 Dec 2004 usb usb2: configuration #1 chosen from 1 choice hub 2-0:1.0: USB hub found hub 2-0:1.0: 1 port detected asoc: WM8978 HiFi <-> imx-i2s-1 mapping ok ALSA device list: #0: armadillo440 (WM8978) ip_tables: (C) 2000-2006 Netfilter Core Team カーネル初期化 TCP cubic registered NET: Registered protocol family 17 NET: Registered protocol family 15 Static Power Management for Freescale i.MX25 input: imx_adc_ts as /devices/virtual/input/input1 i.MX ADC input touchscreen loaded. rtc-s353xxa 2-0030: setting system clock to 2000-01-01 22:04:59 UTC (946764299) This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-140 140
  • 142. Android起動完了! Waiting for root device /dev/mmcblk0p2... mmc0: new high speed SD card at address b368 mmcblk0: mmc0:b368 SD02G 1968128KiB mmcblk0: p1 p2 カーネル起動設定パラメータに従ってrootディレクトリを マウント VFS: Mounted root (ext2 filesystem). Freeing init memory: 112K Warning: unable to open an initial console. sh: can't access tty; job control turned off rootディレクトリ直下にあるinitを 起動 →initの詳細は後述 # warning: `rild' uses 32-bit capabilities (legacy support in use) 初回起動時は内部の データベース構築10分ほど 時間がかかりますのであせらず 待ちましょう fec: PHY @ 0x0, ID 0x0007c0f1 -- LAN8720 eth0: link down eth0: link up, 100Mbps, full-duplex imx ssi is already activated request_suspend_state: wakeup (3->0) at 117437937832 (2000-01-01 22:06:54.852144332 UTC) binder: release 141:141 transaction 1721 out, still active binder: 52:185 transaction failed 29189, size 4-0 binder: send failed reply for transaction 1721, target dead # 起動完了!(Androidのshellプロン プト) This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-141 141
  • 143. 実 習 Android起動後の確認 # cd / # ls lost+found etc d mnt acct data default.prop dev init init.armadillo440.rc init.goldfish.rc init.rc initlogo.rle proc sbin sys system sdcard cache config # netcfg lo UP eth0 UP # rootディレクトリに 移動 ルートのディレクトリ構成 →2章のAndroidのルートファイルシステム 参照 127.0.0.1 255.0.0.0 192.168.1.11 0x00000049 255.255.255.. ネットワークの確 0x00001043 認 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-142 142
  • 144. メモ This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-143 143
  • 145. 起動後のデバッグ シリアルコンソールからLogcat実行でシステムログやカスタムログの監視がで きますが この場合、シリアルポートをLogcatが占有してしまい終了できなくなってしま います よってシリアルポート接続のプロセスを一度KILLしないとカーネルメッセージ ログの 確認ができません 実際は シリアルポートはカーネルメッセージを確認するのみに使 # logcat 用し、 シリアルポートが1ポートしかないので D/dalvikvm( 46): GC_EXPLICIT freed 2181 objects / 110568 bytes in 191ms カーネルログがみることができなくなってし Logcatなどのデバッグ機能はネットワーク経由でADB接続し W/InputManagerService( 46): Starting input on non-focusedまう client com.android.internal.view.IInputMethodClient$Stub$Proxy@43db5738 (uid=10019 pid=247) てDDMSなどを用いて行う W/InputManagerService( 46): Client not active, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@43d57238 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-144 144
  • 146. ADBデバッグ ADB (Android Debug Bridge)やDDMS (Dalvik Debug Monitor Server )を使用すればグラフィカルなログ表示や開発用PCの シェルからデバッグ、アプリケーションのインストール・ア ンインストールなどが可能になります シリアルではなく ネットワーク経由 DDMS コマンド類 she ll goldfish (エミュレー タ) Android SDK ADT on Eclipse adbd ターゲットボード dalvikVM 開発用PC adbd adbサーバ DDMS グラフィカ ル ツール shell This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-145 145
  • 147. ADBデバッグをするために Android SDK 1. ADBデバッグツールはAndroid SDKのtoolsに含まれている ⇒ホストPCにAndroid SDKを インストールする必要が ある 開発用PC 192.168.1.10 192.168.1.11 2. ターゲットボードのadbdと開 発用PCのadbサーバの通信はリ モート接続が必要 ⇒Armadillo440で動作して いるAndroidに固定IPアド レス を設定する必要がある ⇒環境変数ADBHOSTにター ゲットボードのIPアドレ 0-146 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 146
  • 148. Android SDKのインストール *proxy環境ではAndroid SDK and AVD Managerからダウンロードサイトに接続で きません ダウンロードサイト(Android Developers > SDK) http://developer.android.com/intl/ja/sdk/in dex.html tgz形式のアーカイブをダウンロードし て ダウンロードしたtgzファイルを任 意の場所で展開 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-147 147
  • 149. Android SDKのインストール *proxy環境ではAndroid SDK and AVD Managerからダウンロードサイトに接続で きません SDKのtgzファイル展開後以下の実行ファイルを実行 SDKのルート/android-sdk-linux/tools/android 「Packages 」 →以下の2つにチェックを入れる ・「Android SDK Pratform-tools」と ・「Android 2.2(API 8)-> SDK Platform」 →「Install 2Packages」 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-148 148
  • 150. Android SDKのインストール *proxy環境ではAndroid SDK and AVD Managerからダウンロードサイトに接続で きません 「Acsept all 」→「Install」 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-149 149
  • 151. Android SDKのインストール *proxy環境ではAndroid SDK and AVD Managerからダウンロードサイトに接続で きません ダウンロードが完了するとSDKのルート/androidsdk-linux/ 配下の「platform-tools」ディレク トリと「platform」ディレクトリ内に「android8」ディレクトリができていることを確認 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-150 150
  • 152. 実 習 adb起動 カンペ⇒10_adb起動.txt 開発PCのホーム直下にある~/.bashrcに以下を追加してあるか確認 export␣PATH=${PATH}:~/android/android-sdk-linux/platform-tools export␣PATH=${PATH}:~/android/android-sdk-linux/tools export␣ADBHOST=192.168.1.11 ←ターゲットボードのIPアドレス 開発PCのシェルからadbサーバ起動 [host_pc~] > adb␣kill-server ← adbサーバ停止コマンド [host_pc~] > adb␣start-server ← adbサーバ起動コマンド * daemon not running. starting it now on port 5037 * ← 開発PCの5037 ポート使用 * daemon started successfully * [host_pc~] > adb␣devices List of devices attached emulator-5554 device ← ADBで接続できたらデバイスリストに表示される [host_pc~] > This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-151 151
  • 153. 実 習 ddms起動 開発PCのシェルにてddms実行 [host_pc~] > ddms プロセス一覧 スレッド一覧 ヒープメモリのプロファイル アロケーショントラッカー など ログの保存 Logcat・・・DalvikVMやシステムのログ ddms→「Device」→「Screen capchar」 でターゲットボードの画面キャプチャ 0-152 が撮れます This material is licensed under the Creative Commons License BY-NC-SA 4.0. 152
  • 154. adbでできる事 ホストPCシェルのadbコマンド一覧(一部抜粋) $ adb shell Android OSにログインしてシェルを起動 次頁参照 $ adb installアプリケーシ adb経由でアプリケーションをインストール ex) $ adb install HelloWorld.apk ョン名 $ adb uninstallアプリケー ションのパッケージ名 $ adb push ホストPCのロー カルファイル名 コピー先の パス $ adb pull デバイスのファ adb経由でアプリケーションをアンインストール ex) $ adb uninstall com.adakoda.android.helloworld ホストPCのローカルファイルをエミュレータ/デ バイスの指定の場所にコピー ex) $ adb push sample.png /sdcard/ イルのパス コピー先のホス トPCのパス エミュレータ/デバイスのファイルをホストPCに コピー ex) $ adb pull /sdcard/sample.png /tmp $ adb logcat Logcatを起動してログをみる This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-153 153
  • 155. adbでできる事 adb shellで実行できるコマンド(一部抜粋) # dalvikvm -showversion Javaの実行環境のバージョン確認 # netcfg ネットワーク状態の確認 # netcfg eth0 dhcp eth0のネットワークアドレスをdhcpで取得する # netcfg eth0 (up) / (down) up : eth0を有効にする / down : eth0を無効にする # netstat ホストのネットワーク接続状態やソケット/インターフェイスごとのネットワーク 統計参照 # sqlite3 DB名 Androidの中のsqlite3(データベース)の操作 ex) sample.dbにitemsテーブルを作成 # sqlite3 /data/data/sample.app/databases/sample.db : sqlite> create table items (id integer primary key autoincrement, s text not nul ); create table items (id integer primary key autoincrement, s text not null); sqlite>.exit .exit # # ifconfig eth0 IPアドレ ス # vmstat # reboot eth0に固定IPアドレスを割り当てる コマンド一覧は/system/bin 配下を参照のこと 現在のプロセス,メモリー,スワップ,デバイス,割り込み,CPUの情報参照 0-154 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 154 デバイスを再起動する
  • 156. まとめと次回予告 3章では実習で使用するターゲットボードの仕様やメモリ使用 方法 について学び、4章ではEM3がArmadillo440で起動して デバッグができる環境が完成しました 次章からはAndroid搭載のターゲットボードにデバイスの組込 み、 それが動作するアプリケーションの作成方法について学びます シリアルインタフェースのデバイス Bluetoothアダプタ USBシリアル変換ケーブル WiFiアダプタ This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-155 155
  • 157. メモ This material is licensed under the Creative Commons License BY-NC-SA 4.0. 0-156 156
  • 158. マスタ タイトルの書式設定 第5章 デバイスの組み込み This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-157 157
  • 159. 5章の概要 • • • • • • • • • • Linuxにおけるデバイス入出力 デバイスドライバの種類 デバイスドライバの作成方法 カーネルにデバイスドライバを組み込む Linuxのデバイスファイル デバイス専用ライブラリ Androidにおけるデバイス入出力 Androidにデバイスドライバを組み込む Androidのデバイスファイル Android2.3でのデバイス関連の扱い マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-158 158
  • 160. Linuxにおけるデバイス入出力 デバイスとやり取りするために必要なもの デバイスドライバ 最初からカーネルイメージに組み込んでしまう カーネル起動後にモジュールをロードして組み込む マスタ タイトルの書式設定 デバイスファイル(/dev/xxx) デバイスを仮想化し、デバイスファイルへの入出力が実際のハー ドウェアの入出力になる udevdが自動生成してくれる デバイスファイルを制御するライブラリ This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-159 159
  • 161. Linuxにおけるデバイス入出力 アプリケーション アプリケーショ ン デバイス制御用 ライブラリ デバイス制御用 ライブラリ デバイス制御用 ライブラリ マスタ タイトルの書式設定 /dev/yyy デバイスファイル /dev/xxx モジュール (hoge.ko) insmod modprobe /dev/zzz Linuxカーネル デバイスドライ バ (組み込み) デバイスドライ バ (モジュール) WiFiアダプタ デバイスドライ バ (組み込み) Bluetoothアダプタ USBシリアル変換ケーブル This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-160 160
  • 162. デバイスドライバの種類 キーボードやシリアルケーブルなど キャラクタデバイ システムが1文字(1byte)ずつデー ス タを転送する機器 すでにメーカー で用意されてい る 自作でもなんと か作れる ハードディスクやCDなどのように順 序に関係なくランダムアクセス可能 なストレージのようなもの すでにメーカー で用意されてい る 公開されていな い場合、自分で 実装するのは困 難 ネットワークデバ インターネット接続のためなど、 ネットワーク接続を行うためのもの イス すでにメーカー で用意されてい る 公開されていな い場合、自分で 実装するのは困 難 マスタ タイトルの書式設定 ブロックデバイス その他のデバイス デバイスがGPIO(General Purpose Input/Output:汎用入出力)を介して Commons This material is licensed under the Creative License BY-NC-SA 4.0. カーネル情報にProcFSで直接アクセ ProcFSでのアク セスは複雑なデ バイスでは機能 5-161 不十分のため 161
  • 163. 参 考 デバイスドライバを1から自作 アプリケーショ ン デバイス制御用 ライブラリ 例)GPIOを使用したデバイスのドライバ GPIO(General Purpose Input/Output)とは・・・ マイクロプロセッサやマイコン、インタフェースデバイスに存在する汎 用入出力 で信号の種類や用途は開発者が自由に決めて使うことができる入出力ピ ン /dev/zzz マスタ タイトルの書式設定 Linuxカーネル デバイスドライ バ キャラクタデバイスとしてドライバを作 成 ■デバイス制御開始・終了 open/close・・・入出力準備、クローズ処理 GPIOピン ■デバイス制御に用いる関数 LEDやボタン デバイス ioctl・・・ハードウェアの入出力(GPIOピンの電圧の 制御)をプログラムから使いやすい形にする ■デバイス入出力関数 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-162 162
  • 164. 参 考 デバイスドライバのコード 例 )GPIOを使用してデバイスのLEDの点灯・消灯を行う GPIOを使用してデバイスのボタンのON・OFFの状態を ①mknodeコマンドでノード(デバイス用スペシャルファイル)を作成する ②kernel/drivers/misc/sample_gpio_char.c を作成する マスタ タイトルの書式設定 最小限に必要なヘッダ include linux/module.h // MODULE macro, THIS_MODULE include linux/kernel.h //printk include linux/proc_fs.h // alloc_chrdev_region include asm/uacsess.h // copy_from_user, copy_to_user include asm/io.h // inb,outb include linux/cdev.h //cdev_init include “sample_gpio.h” //GPIOレジスタやLED制御用構造体の定義などのヘッダ This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-163 163
  • 165. 参 考 デバイスドライバのコード カーネル起動時、またはinsmodされたときに呼び出されるinit関数 module_init ( “sample_gpio_char_init” ); static int __init sample_gpio_char_init(void) { //キャラクタデバイスのMAJOR番号の割り当てと登録 (register_chrdev) //キャラクタデバイス構造体と処理関数の登録 //キャラクタデバイスの初期化 } マスタ タイトルの書式設定 カーネル停止時、またはrmmodされたときに呼び出されるexit関数 module_exit ( “sample_gpio_char_exit” ); static int __exit sample_gpio_char_exit(void) { //キャラクタデバイスを削除(unregister_chrdev) } This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-164 164
  • 166. 参 考 デバイスドライバのコード カーネルにデバイスドライバについての情報を伝える MODULE_DESCRIPTION ( “sample_gpio_char” ); MODULE_LICENSE ( “GPL2” ); read関数とwrite関数、ioctl関数 マスタ タイトルの書式設定 //コマンド(cmd)と構造体のポインタ(inode)を受け取る static int sample_gpio_char_ioctl ( struct inode *inode, unsighed int cmd, unsighed long arg) { // LEDのON/OFF設定を処理 // ユーザボタンの値を取得するコマンドの処理 // キャラクタデバイス構造体の登録 } static ssize_t sample_gpio_char_read ( struct file* filp, char* buf, size_t count, loff_t* offset) { //sample_gpio_char_ioctlから現状のボタンの値を読み出して返す } static ssize_t sample_gpio_char_write ( struct file* filp, const char* buf, size_t count, loff_t* offset) { //led 0/1 on/offの値をsample_gpio_char_ioctl に渡す } This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-165 165
  • 167. 参 考 KconfigとMakefileの設定 例 ) kernel/drivers/misc/Kconfig config SAMPLE_GPIO_CHAR bool “Sample GPIO CHAR for LED and User Button” default n ---help--if you use GPIO for LED and User Button マスタ タイトルの書式設定 例 ) kernel/drivers/misc/Makefile obj-$(CONFIG_SAMPLE_GPIO_CHAR) +=sample_gpio_char.o This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-166 166
  • 168. 参 考 ドライバの組込み/モジュール生成 前頁の例で作ったドライバをカーネルに組み込む $ make menuconfig //設定GUI起動 # DeviceDrivers -> Misc Devices # -> [*]Sample GPIO CHAR for LED and User Button $ make マスタ タイトルの書式設定 前頁の例で作ったドライバをモジュール(sample_gpio_char.ko) にする $ make menuconfig //設定GUI起動 #DeviceDrivers -> Misc Devices # -> [M]Sample GPIO CHAR for LED and User Button $ make modules This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-167 167
  • 169. デバイスドライバ(実務では?) アプリケーショ ン デバイス制御用 ライブラリ ハードベンダ以外の組み込み系デバ ドラ開発者がやること ・電圧や消費電力の制御 ・デバイスの起動時間やアプリケーショ ンの 起動時間のチューニングなどを盛り込 んだ 実装をもとのデバイスドライバにラッ ピング して一つのドライバとしてカーネルに ハードベンダが提供 組み込む マスタ タイトルの書式設定 /dev/zzz Linuxカーネル デバイスドライ バ This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-168 168
  • 170. カーネルバージョンとドライバ デバイスドライバは、カーネルに依存している たとえ同じ名前のドライバであっても作成された(ビルド された)カーネルソースが変われば、まったくの別物 サードベンダーが提供するドライバファイルは使用してい るカーネルバージョンと合わない場合には、使用不可 マスタ タイトルの書式設定 カーネルバージョンが合わないデバイスドライバを組み込もう とするとどうなるのか? insmodによるロード時にバージョンの整合性検査があるの で組み込めない(エラーになる) “modprobe -f”のオプションをつけてモジュールを強制的 にロードすればうまくいく可能性があるが動作保障はな い (Androidではmodprobeコマンドは使用できない) 同じバージョンのカーネルでコンパイルし直す必要あり This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-169 169
  • 171. モジュール関連コマンド lsmod 現在ロードされているモジュールの一覧表示 Module : ロードされているカーネル・モジュール名 Size : カーネル・モジュールのサイズ Used by: 使用カウント数、参照しているモジュールの一覧 --------------------------------------------------------# lsmod Module Size Used by i915 81412 3 md5 3968 1 ipv6 232768 12 i2c_dev 11392 0 i2c_core 22400 1 ---------------------------------------------------------- マスタ タイトルの書式設定 modprobe モジュールのロード、 modules.depファイルを参照して依存関 係を考慮 insmod モジュールのロード(依存関係は考慮しない) rmmod モジュールのアンロード -r オプション : 依存するモジュールも同時に削除 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-170 170
  • 172. モジュール関連コマンド modinfo :モジュールの情報参照 ---------------------------------------------------------# modinfo vsock.ko filename: vsock.ko supported: external license: GPL v2 version: 1.0.0.0 description: VMware Virtual Socket Family author: VMware, Inc. srcversion: 3411024EE424348B0A16460 depends: vmci vermagic: 2.6.27-11-server SMP mod_unload modversions 686 ------------------------------------------------------------ マスタ タイトルの書式設定 このモジュールが作成された環境のカーネルバージョ ン This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-171 171
  • 173. Linuxのデバイスファイル Kernel2.6以降ではudevdというデーモンがデバ イスの追加削除の通知をカーネルから受けて デバイスファイルを自動で作成削除する /etc/udev/rules.d/xxyyy.rules マスタ タイトルの書式設定 デバイスの ベンダID などの情報 NETLINK Socket プロセス間通信 Linuxカーネル 通知 udevd 作成/削除 挿抜 /dev/zzz 汎用デバイスのデバイスファイル 名はドライバのソースで定義され ている 5-172 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 172
  • 174. デバイス専用ライブラリ アプリケーショ ン デバイス制御用 ライブラリ デバイスファイル「/dev/zzz」に 対する制御を行うライブラリ fcntl.hのopen関数、close関数、 マスタ タイトルの書式設定 read関数、write関数などを使う /dev/zzz Linuxカーネル デバイスドライ バ GPIOピン アプリケーションからLEDの点灯・消 灯のコマンドをデバイスファイルに 書き込む制御 ボタンの状態をデバイスファイルから 読み出してアプリケーションで表示 LEDやボタン デバイス This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-173 173
  • 175. メモ マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-174 174
  • 176. Androidにおけるデバイス入出力 Linuxのデバイス入出力の仕組みとほぼ同じ 【相違点】 デバイスドライバ カーネル起動後にモジュールをロードさせる場合はinit.rc (init.[ハードウェア名].rc)に指定 マスタ タイトルの書式設定 デバイスファイル(/dev/xxx) udevdが存在しない デバイス情報はカーネルからソケットとしてinitで監視中のdevice_fd で 受け取る ソケットにはsystem/core/init/devices.c の中で定義されたuevent構 造体が含まれている system/core/init/devices.c内でmknod(デバイスファイル作成)して 5-175 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 175
  • 177. Androidにおけるデバイス入出力 ソフトウェア(Androidプラットフォーム) アプリケーション (Java) JNI JNI ネイティブ デバイス制御用 デバイス制御用 アプリケーション (Java) JNI マスタ タイトルの書式設定 デバイス制御用 ライブラリ ライブラリ デバイスファイル モジュール (hoge.ko) ライブラリ /dev/xxx /dev/yyy /dev/zzz デバイスドライバ (モジュール) デバイスドライバ (組み込み) デバイスドライバ (組み込み) Android ランタイ ム Linuxカーネル init.rc insmod WiFiアダプタ BluetoothアダプタUSBシリアル変換ケーブル This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-176 176
  • 178. デバイスドライバを Androidのカーネルに組み込む Androidのカーネルにドライバを組み込む方 法は通常のLinuxの場合と同じ menuconfigの設定 マスタ タイトルの書式設定 • 組み込む場合は[*] カーネルをビルド • 生成されたカーネルのイメージファイルにデバイス ドライバが組み込まれるので、既存のカーネルと差 し替える This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-177 177
  • 179. デバイスドライバの Androidカーネルモジュール作成 Androidのカーネル用のドライバのカーネル モジュールを作成する方法は通常のLinux の場合と同じ マスタ タイトルの書式設定 menuconfigの設定 • モジュール作成は[M] カーネルをビルド • モジュール作成を指定した場合は「.ko」ファイル が作成される This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-178 178
  • 180. デバイスドライバの カーネルモジュールを組み込む Android起動時にモジュール「hoge.ko」を組み込むに は? init.<ハードウェア名>.rcにinsmodとデバイスファイルの 権限変更を記述する /init.<ハードウェア名>.rc マスタ タイトルの書式設定 service install_driver /etc/install_driver.sh oneshot 実行権限をつけるのを忘れずに /etc/install_driver.s h #!/system/bin/bash insmod /data/hoge.ko chmod 666 /dev/hoge0 $ chmod 777 /etc/install_driver.sh root権限があるのに/system以下にアクセスできない場合 は mount␣-o␣rw,remount␣/dev/mmcblk0p2␣/system をadb shellで実行するかinit.rcに加えてみると良い (パーティション名はシステムごとに異なります) This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-179 179
  • 181. Androidのデバイスファイルの作成 initで生成されたNETLINK Socketデータのueventを使う なし init NETLINK Socketの生成 Bind Socketの データ あり デバイスファ イル名やデバ イスのメ ジャー、マイ ナー番号など はSocketデー タに入ってい る マスタ タイトルの書式設定 handle_device_fd Socketからデータ取り出 し NETLINK Socket プロセス間通信 カーネルからの通知デー タ (uevent構造体) Linuxカーネル 挿抜 uevent->subsystem の値にしたがってディレクトリ作成 /dev/xxxx devices.c uevent->action remove × /dev/xxx/zzz add /dev/xxx /zzz デバイスファイル削 the Creative Commons デバイスファイル作 This material is licensed under 除 License BY-NC-SA 4.0. 成 デバイスファイ ルの権限などは dev_perms 構造体に定義 5-180 180
  • 182. devices.c について Androidではデバイスルール的な条件はどこに設定するのか? 生成するデバイスファイルの名称, 権限、uid, gidはソース devices.c の中の struct perms_ devperms[] で指定する ただし、ユーザランドのコード変更なのでルートファイルシステムを 作成しなおす必要あり マスタ タイトルの書式設定 devices.c static struct perms_ devperms[] = { { "/dev/null", 0666, AID_ROOT, { "/dev/zero", 0666, AID_ROOT, { "/dev/full", 0666, AID_ROOT, { "/dev/ptmx", 0666, AID_ROOT, { "/dev/hoge0", 0666, AID_ROOT, { "/dev/tty0", 0660, AID_ROOT, { “/dev/cam”, 0660, AID_ROOT, : { NULL, 0, 0, 0, 0 }, }; This material is licensed under the Creative Commons License BY-NC-SA 4.0. AID_ROOT, AID_ROOT, AID_ROOT, AID_ROOT, AID_ROOT, AID_SYSTEM, AID_CAMERA, 5-181 0 }, 0 }, 0 }, 0 }, 0 }, 0 }, 0 }, 181
  • 183. Android2.3での変更点(デバイス関連) ueventdが新しく追加 ueventdのサービス起動はinit.rcのearlyinitにより起動 マスタ タイトルの書式設定 ueventdの役割 デバイスファイルの作成 デバイス情報はueventd.rcに記述 ueventd.rcの抜 粋 /dev/null 0666 /dev/zero /dev/full /dev/ptmx root root (注意)Android2.3以降はデバイス関 0666 root root 連の他起動スクリプト(init.rc)での変 0666 root root 更部分がかなりあります 0666 root root This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-182 182
  • 184. メモ マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-183 183
  • 185. マスタ タイトルの書式設定 第6章 NDK/JNI概要 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-184 184
  • 186. 6章の概要 • • • • • • • • • • • NDKとは NDKのインストール NDKの開発手順 Eclipseのインストール Eclipse ADT Pluginのインストール NDKでhello-jni(実習) アプリのデバッグ方法 ネイティブのデバッグ方法 TraceViewツール ネイティブのログ出力 JNI詳説 マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-185 185
  • 187. NDK(Native Development Kit)とは Androidアプリケーションのメソッドの一部をネイティブコードに 置き替えることができる手段 [メリット] 既存の資産であるネイティブライブラリをアプリケーションに流用可能 apkファイルの中にプラットフォームごとのにビルドしたネイティブラ イブラリ (.so ファイル)を同梱し実機へ簡単にインストール アプリケーションの速度を向上 apkファイル Linuxのシステムコール マスタ タイトルの書式設定 Javaクラスファイル (dex) Xmlリソースファイル [注意点] JNIのオーバーヘッドの考慮が必要 マニフェストファイル、署  必ず高速化するわけではない 名 NDKで作成した.soファイルはプラットフォーム互換が libs/armeabi/ libs/x86/ ないのでCPUごとにリビルドして作成する必要がある ARM用(so) X86用(so) (ARM9用、x86用など) すべてのC++ライブラリが使用できるわけではない メモリとリソースの管理が重要 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-186 186
  • 188. NDKの開発環境 項目 OS 必要な環境 Windows XP (32-bit) or Vista (32- or 64-bit) → ただしCygwin 1.7 以上が必要 Mac OS X 10.4.8 or later (x86 only) Linux (32- or 64-bit Ubuntu8.0.4以上、またはGLibc2.4 以上のLinux) マスタ タイトルの書式設定 Java JDK Java JDK 6 Android SDK Android SDK 1.5以上(*1,*2) ツール Cygwin : gmake, gcc Linux : GNU Make 3.81 or later 、GNU Awk or Nawk *1:OpenGL ESは使用するバージョンによって必要なAndroidSDKのバージョンが異なります ・OpenGL ES 1.1を使用:Android 1.6以上 android:minSdkVersion="4“ ・OpenGL ES 2.0を使用:Android 2.0以上 android:minSdkVersion="5“ *2:作成するライブラリのCPUアーキテクチャの種類によりAndroidSDKのバージョンが異なり ます ・ARM,ARM-NEON:Android 1.5以上 android:minSdkVersion=“3“ ・x86:Android 2.3以上 android:minSdkVersion=“9“ 5-187 This material is licensed under the Creative Commons ・MIPS:Android 2.3以上 android:minSdkVersion=“9“ License BY-NC-SA 4.0. 187
  • 189. NDKインストール 本実習では実習用マシンのUbuntu on VMWareにNDKをインストール ①NDKのダウンロードサイト (http://developer.android.com/tools/sdk/ndk/inde x.html) マスタ タイトルの書式設定 ②Linux 32/64-bit (x86)用の最新のバージョン のアーカイブファイル(.tar.bz2)をダウン ロード This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-188 188
  • 190. NDKインストール マスタ タイトルの書式設定 ③ダウンロードしたNDKのアーカイブを展開 ④/[自分のホームディレクトリ]/.bashrcにNDKのパスを追 記 export PATH=${PATH}:~/NDKのルートディレクト リ This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-189 189
  • 191. NDKのコンポーネント (ドキュメント docs/) INSTALL.HTML NDKのインストール方法 OVERVIEW.HTML NDKの適用範囲と使用方法の概要 ANDROID-MK.HTML C,C++のソースをコンパイルするためのAndroid.mkファイルの使用方法 APPLICATION-MK.HTML Java用のアプリケーションとネイティブの関連付けを行うApplication.mkファイルの使用方法 CPLUSPLUS-SUPPORT.HTML NDKでサポートしているC++についての詳細 CPU-ARCH-ABIS.HTML サポートされているCPUのアーキテクチャとそれらのターゲットの設定方法 マスタ タイトルの書式設定 CPU-FEATURES.HTML アプリケーションのコードでランタイムオプションとターゲットのCPUファミリーを取得するため の静的ライブラリの使用方法 CPU-ARM-NEON.HTML ARM NEON / VFPv3-D32 CHANGES.HTML NDKのリリース変更履歴 DEVELOPMENT.HTML NDKのカスタマイズおよびパッケージング方法 HOWTO.HTML NDKに共通なタスクに関するHow To情報 IMPORT-MODULE.HTML モジュールの再利用方法および共有方法 LICENSES.HTML ライセンス情報 NATIVE-ACTIVITY.HTML ネイティブアクティビティの実装方法 NDK-BUILD.HTML ndk-buildスクリプトの使い方 PREBUILTS.HTML ビルド済みの静的ライブラリの機能と共有方法 STANDALONE-TOOLCHAIN.HTML NDKのツールチェインのスタンドアロンコンパイラとしての使用方法 SYSTEM-ISSUES.HTML NDKの既知の問題 STABLE-APIS.HTML 安定版ライブラリの一覧 NDK-GDB.HTML ネイティブコードデバッガの使用方法 docs/system/libc/OVERVIEW.HTML bionicのCライブラリが提供できる機能一覧 オプションの使い方 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-190 190
  • 192. NDKのコンポーネント (ドキュメント docs/) sidenavi.htmlを開けばブラウザでドキュメントが読めます マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-191 191
  • 193. NDKのコンポーネント(ツール) ※NDK r8bでサポートされているツ Native ARM、x86 、MIPSバイナリの生成のためのC/C++言語のビルドツール gdbデバッグツール(ndk-gdb) ネイティブコードのスタックトレースツール(ndk-stack) プリビルドされたスタッティックライブラリ、共有ライブラリ – Cライブラリ • libc (C library) 、libm (math library) 、JNI、libz (Zlib compression)、 liblog (Android logging) –C++ライブラリ(デフォルトではlibstdc++のみ。有効にするにはコンパイルオ プション要) • C++最小限構成のヘッダlibstdc++(スタティックのみ) • STLportベースのC++STL(スタティックまたは共有) • C++例外とRTTI – OpenGL ES 1.1 / OpenGL ES 2.0ライブラリ (3D描画エンジンライブラリ) – libjnigraphics (ビットマップのPixel buffer へのアクセス用ライブラリ) – OpenSL ESライブラリ(ネイティブなオーディオライブラリ) – OpenMAX ALライブラリ(ネイティブなマルチメディアライブラリ) 5-192 This material is licensed under the Creative Commons – Android ネイティブアプリケーションのAPI(入力サブシステム、センサデータ License BY-NC-SA 4.0. 192 マスタ タイトルの書式設定
  • 194. NDKのコンポーネント(サンプル) hello-jni ネイティブの共有ライブラリのメソッドから文字列を取得してUIに表示する two-libs ダイナミックに共有ライブラリをロードしてそのライブラリで提供されるネイティ ブなメソッドを呼ぶ。 このサンプルで呼ばれるメソッドは共有ライブラリの中で インポートされた別の静的ライブラリで実装されたメソッドである。 san-angeles ネイティブなOpenGL ES APIで3Dグラフィックスを描画する。Activityのライフサ イクルを管理GLSurfaceViewオブジェクトで管理している。 hello-gl2 三角形の頂点と断片シェーダをOpenGL ES2.0でレンダリングする。 hello-neon ランタイム上でCPU性能のチェックができるcpufeaturesの使い方と、特定のCPUに よってサポートされるNEON 命令の使い方。 このアプリケーションは実行したデバ イスでFIRフィルタをループさせた際の処理の2つのバージョンのベンチマークが とれる。(CのバージョンとNEON命令で最適化されたバージョン) bitmap-plasma ネイティブコードからAndroid Bitmapのピクセルバッファにアクセスするデモンス トレーション。昔からあるような「プラズマ」エフェクトを生成する。 native-activity ネイティブアクティビティを作成するためのnative-app-glue静的ライブラリの使 い方。 native-plasma ネイティブアクティビティで実装されたビットマッププラズマ。 module-export foo,bar,zoo3つのライブラリのうち、fooをスタティックライブラリとしてbarに エクスポートする。 native-audio OpenSLESを使ったサンプル native-media OPenMAXALを使ったサンプル.映像コーデック(H.264)、オーディオ(AAC)による ストリーミング再生。 test-libstdc++ License BY-NC-SA 4.0. 最小限C++標準ライブラリのシンプルなビルドテスト マスタ タイトルの書式設定 This material is licensed under the Creative Commons 5-193 193
  • 195. NDKアプリケーションのプロジェクト構成 NDKで作成するアプリケーションのプロジェクト構成は以下の とおり src Javaのコード Android.mk jni C/C++のコードをビルドするのに必要な情報 ライブラリ名、依存関係、種別などを記載 マスタ タイトルの書式設定 C/C++のヘッダ、コード JNIの規約に沿って書かれていること drawable <project名>/ layout レイアウトを定義したxmlファイルを配置 values res 画像などのリソースファイル String.xml 文字列、色、配列、スタイルなどのxml定義ファイ ル AndroidManife st.xml アプリケーションのバージョン情報、権限、コンポーネントの動作条件 などの設定ファイル default.prope rties SDKが自動生成したデフォルト設定ファイル(SDKのバージョンがr14以上 の場合はproject.propertiesという名前になる) This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-194 194
  • 196. Android.mk Android.mkに指定する変数一覧 CLEAR_VARS 先頭に“LOCAL_”とつく変数の定義 モジュールを新規で定義する場合、最初に以下の記述が必須 include $(CLEAR_VARS) # すべてのLOCAL_XXX変数クリア BUILD_SHARED_LIBRARY LOCAL_MODULEとLOCAL_SRC_FILESで指定したモジュールをビルドして共有ライブラリを 作成するのに必要な設定 include $(BUILD_SHARED_LIBRARY) 作成されたライブラリ名→ lib$(LOCAL_MODULE).so BUILD_STATIC_LIBRARY スタティックライブラリをビルドするのに必要な設定 include $(BUILD_STATIC_LIBRARY) 作成されたライブラリ名→ lib$(LOCAL_MODULE).a PREBUILT_SHARED_LIBRARY プレビルドされたモジュールをビルドして共有ライブラリを作成するのに必要な設定 詳細はdocs/PREBUILTS.html PREBUILT_STATIC_LIBRARY プレビルドされたモジュールをビルドしてスタティックライブラリを作成するのに必 要な設定 詳細はdocs/PREBUILTS.html TARGET_ARCH ターゲットとするアーキテクチャを指定。“arm” TARGET_PLATFORM ターゲットとするAndroidプラットフォームを指定。“android-<API Level>” TARGET_ARCH_ABI ターゲットとするARMのABIを指定。“armeabi” は Armv5TE用、“armeabi-v7a” はArmv7用 TARGET_ABI $(TARGET_PLATFORM)-$(TARGET_ARCH_ABI) と同義。“android-<API Level>-armeabi” 5-195 This material is licensed under the Creative Commons マスタ タイトルの書式設定 License BY-NC-SA 4.0. 195
  • 197. Android.mk Android.mkに指定する変数一覧(モジュール詳細記述変数) LOCAL_PATH ビルド対象のソースファイルを参照するときの基準パス かならずAndroid.mkの始めに定義をする LOCAL_MODULE 生成するモジュール名を定義 LOCAL_MODULE_FILENAME LOCAL_MODULEのオプション定義で作成されるモジュールファイルの名前を再 定義。 LOCAL_MODULE := foo-version-1 LOCAL_MODULE_FILENAME := libfoo LOCAL_SRC_FILES モジュールをビルドするのに必要なソースコードの指定 複数の場合はスペースで区切る LOCAL_CPP_EXTENSION C++ファイルの拡張子を設定。“.cxx” LOCAL_C_INCLUDES includeファイルのパスを設定 LOCAL_CFLAGS C/C++のコンパイルオプションの設定 LOCAL_CXXFLAGS C++のコンパイルオプション LOCAL_CPPFLAGS 同上 LOCAL_STATIC_LIBRARIES LOCAL_MODULEとリンクするスタティックライブラリを指定 LOCAL_SHARED_LIBRARIES LOCAL_MODULEとリンクする共有ライブラリを指定 LOCAL_LDLIBS リンカに渡すオプション LOCAL_ALLOW_UNDEFINED_SYMBOLS 未定義のシンボルを許可するか設定 LOCAL_ARM_MODE This material is licensed under the Creative thumbモードとarmモードを指定 Commons マスタ タイトルの書式設定 License BY-NC-SA 4.0. 5-196 196
  • 198. Android.mk Android.mkに指定する変数一覧(モジュール詳細記述変数) LOCAL_ARM_NEON NEON命令の利用を許可するか指定 LOCAL_DISABLE_NO_EXECUTE NX bitの利用を許可するか設定 LOCAL_EXPORT_CFLAGS static/shared ライブラリが参照先モジュールへ追加するC/C++コン パイラフラグ マスタ タイトルの書式設定 LOCAL_EXPORT_CPPFLAGS LOCAL_EXPORT_CFLAGSと同じであるが C++コンパイラのみ有効 LOCAL_EXPORT_C_INCLUDES LOCAL_EXPORT_CFLAGSと同じであるが Cのincludeパスのみ有効 LOCAL_EXPORT_LDLIBS LOCAL_EXPORT_CFLAGSと同じであるが Cのリンカのみ有効 LOCAL_FILTER_ASM アセンブリファイルをフィルタするシェルコマンド This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-197 197
  • 199. Android.mk Android.mkに指定する変数一覧(NDKマクロ変数) my-dir 最後にincludeしたmakefileが含まれるディレクトリを返す。他のmkファイルをincludeし てしまうと値が変わるのでcurrentのmakefileのディレクトリは他のファイルをincludeす る前に取得する必要がある。 マスタ タイトルの書式設定 all-subdirmakefiles 再帰的にサブディレクトリのAndriod.mkを検索し、リストとして返す。 include $(call all-subdir-makefiles) this-makefile 現在のmakefileのパスを返す parent-makefile includeされている親のmakefileのパスを返す grand-parentmakefile includeされている親の親のmakefileのパスを返す import-module プロジェクトの外にあるndkモジュールをインポートする。 $(call import-module,<name>) とすると、NDK_MODULE_PATH/< name>/Andriod.mkが参照されるので自プロジェクト外のプ ロジェクトのモジュールをLOCAL_STATIC_LIBRARIES += <name>と記述すればリンクするこ とが可能。 詳細は docs/IMPORT-MODULE.html を参照。 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-198 198
  • 200. サンプル(hello-jni) NDKに付属のhello-jniサンプルをみてみましょう <NDK>・・・/home/aj741327/android/android-ndk-r8b/ マスタ タイトルの書式設定 $<NDK>/samples/hello-jni/src/com/example/hellojni/HelloJni.java ∟ /jni/Android.mk ∟/hello-jni.c ∟ /tests ∟ /res/values/strings.xml ∟ /AndroidManifest.xml ∟ /default.properties This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-199 199
  • 201. サンプル(hello-jni) HelloJni.jav a package com.example.hellojni; public class HelloJni extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView tv = new TextView(this); tv.setText( stringFromJNI() ); //JNIメソッドの呼び出 setContentView(tv); し } マスタ タイトルの書式設定 public native String stringFromJNI(); static { System.loadLibrary("hello-jni"); } } //JNIネイティブメソッドの 定義 //hello-jni.soをロード する This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-200 200
  • 202. サンプル(hello-jni) hello-jni.c #include <string.h> #include <jni.h> //文字列操作に必要 //jniに必要 /* HelloJni.javaから呼ばれるJNIのネイティブメソッド * 引数 JNIEnv* :DalvikVM環境との橋渡しをする関数群 * 引数 jobject :このメソッドが定義されている呼び元のjavaのクラス情報が格納 * 返り値 jstring :呼び元のjavaに返す文字列 */ jstring Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz ) { マスタ タイトルの書式設定 //NewStringUTF:文字列をUTF-8で新規作成して呼び元に返す return (*env)->NewStringUTF(env, "Hello from JNI !"); } This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-201 201
  • 203. サンプル(hello-jni) Android.m k LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) #「Android.mk」ファイルの先頭で必ず 指定 #LOCAL_XXXという変数をすべてクリア LOCAL_MODULE #ライブラリ名(モジュール名)の定義 マスタ タイトルの書式設定 := hello-jni LOCAL_SRC_FILES := hello-jni.c #ライブラリのソースコード指定 include $(BUILD_SHARED_LIBRARY) #共有ライブラリを作成する設定 ( LOCAL_PATH /lib/libhellojni.so) This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-202 202
  • 204. 実 習 hello-jniの共有ライブラリを生成しましょう [host_pc~] > cd␣<NDK>/samples/hello-jni [host_pc~] > ls AndroidManifest.xml default.properties tests [host_pc~] > ndk-build jni res src マスタ タイトルの書式設定 Gdbserver : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver Gdbsetup : libs/armeabi/gdb.setup Compile thumb : hello-jni <= hello-jni.c SharedLibrary : libhello-jni.so Install : libhello-jni.so => libs/armeabi/libhello-jni.so [host_pc~] > ls AndroidManifest.xml default.properties res src tests jni This material is licensed under the Creative Commons License BY-NC-SA 4.0. libs obj 5-203 203
  • 205. hello-jniの共有ライブラリの生成場所 $<NDK>/samples/hello-jni/src/com/example/hellojni/HelloJni.java ∟ /jni/Android.mk ∟/hello-jni.c ∟ /libs/armeabi/gdb.setup ∟ /gdebserver 生成された共有ライブラリ ∟ /libhello-jni.so ∟ /obj/local/armeabi/libhello-jni.so ∟/objs-debug/hello-j マスタ タイトルの書式設定 ∟ /tests ∟ /res/values/strings.xml ∟ /AndroidManifest.xml ∟ /default.properties This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-204 204
  • 206. メモ マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-205 205
  • 207. NDKを用いたアプリケーション開発手順 Javaとネイティブライブラリ間のインタフェースを決定 ツール類インストール(SDK,NDK,Eclipse,ADT) Javaのパースペクティブ EclipseでAndroidアプリケーションプロジェクト作成 マスタ タイトルの書式設定 プロジェクトにNative Suportを設定 C/C++のパースペクティブ ネイティブコードおよびAndroid.mk作成・配置 Javaのパースペクティブ AndroidのJavaのコードやリソースファイル作成、ネイティブライブラリの定義・ロードなど ARM用モジュールの場合 project>/libs/eabi/以下に 生成 Build Project実行 C/C++のパースペクティブ Apkファイルはproject>/bin/以下に生 ライブラリ(.so)および、アプリの実行ファイル( .apk)生成 成 実機またはエミュレータにインストールして動作確認 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-206
  • 208. Eclipseインストール ダウンロードサイト(Eclipse Developers) IDE for Java http://www.eclipse.org/downloads/packages/release/indigo/sr2 マスタ タイトルの書式設定 Eclipse IDE for Java Developers のLinux32bit版を選 択 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-207 207
  • 209. Eclipseインストール マスタ タイトルの書式設定 「eclipse-java-indigo-SR2linux-gtk.tar.gz」 をダウン ロードして任意の場所で展開 ※本実習では /home/aj741327/eclipse(indigo) に展開しています This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-208 208
  • 210. Eclipse ADT plugin インストール マスタ タイトルの書式設定 ①eclipse実行 ②Workspace 「/home/aj741327/workspace」 ③Java開発用パースペクティブを開 く This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-209 209
  • 211. Eclipse ADT plugin インストール マスタ タイトルの書式設定 Eclipseメニュー->Help->Install New Software 両方にチェックを付 ける https://dlssl.google.com/android/eclipse/is licensed under the Creative Commons This material License BY-NC-SA 4.0. 5-210
  • 212. Eclipse ADT plugin インストール 「I accept・・・」に チェック マスタ タイトルの書式設定 セキュリティ警告⇒O K CDT(C/C++開発用Eclipseプラ グイン)も自動でインストー ルされた状態で起動される Welcomeタブは×ボタンで閉じ る Eclipse 再起動 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-211
  • 213. Eclipse ADT plugin インストール ADTがインストールさ れるとこのようなボ タンが追加される マスタ タイトルの書式設定 AndroidSDKがある場 所のパスを指定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. AndroidNDKがある場 所のパスを指定 5-212
  • 214. 実 習 NDKサンプル「hello-jni」の アプリケーションプロジェクト作成 今回はNDK付属のサンプル「hello-jni」を動作させるた アプリケーションプロジェクトの作成 めに 「・・・from Existing Code」を選択 NDK付属のサンプル「hello-jni」がある場所を 指定 マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-213
  • 215. 実 習 NDKサンプル「hello-jni」の アプリケーションプロジェクト作成 Javaのパースペクティブにプロジェクトが作成さ れる マスタ タイトルの書式設定 プロジェクト名を選択して右ク リック NDKで作成するライブラリの名前を設 定 Android Tools -> Add Native Support This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-214
  • 216. 実 習 NDKサンプル「hello-jni」の アプリケーションプロジェクト作成 C/C++のパースペクティブに自動で切り替わる マスタ タイトルの書式設定 同名のc++のコードも自動で作成されるが ここでは使用しない libsやobjディレクトリも自動で生成され るが 中身はまだ空 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-215
  • 217. 実 習 NDKアプリ「hello-jni」のビルド プロジェクト名を選択して右ク リック マスタ タイトルの書式設定 「Build Project」実行 「Build が成功すると 「libs」配下にライブラリ が作成される 同時にAndroidアプリケー ションの実行ファイルであ るapkも作成される ※ビルドのログ(エラーログも含む)はEclipseのConsole Viewに表 5-216 This material is licensed under the Creative Commons 示される License BY-NC-SA 4.0.
  • 218. 実 習 「hello-jni」のアプリケーション 動作確認準備 Eclipseのメニューボタン(実 行) マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-217
  • 219. 実 習 「hello-jni」のアプリケーション 動作確認準備 適当に名前をつける マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-218
  • 220. 実 習 「hello-jni」のアプリケーション 動作確認準備 ①下図のように接続し、 JP2をOPENで Armadilli440の電源をいれる ②ホストPCのシェルからadbサーバ起動 マスタ タイトルの書式設定 192.168.1.10 [host_pc~] > adb␣kill-server [host_pc~] > adb␣start-server * daemon not running. starting it now on port 5037 * * daemon started successfully * [host_pc~] > adb␣devices List of devices attached emulator-5554 device 192.168.1.11 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-219 219
  • 221. 実 習 「hello-jni」アプリケーション実行 実機選択 マスタ タイトルの書式設定 Armadillo-440上で動作したNDKサンプルの「helloYesを選択すると自動でLogcatのViewが jni」 表示されアプリケーションのログが確 5-220 This material is licensed under the Creative Commons 認できる License BY-NC-SA 4.0. 220
  • 222. 実 習 HelloJniデバッグ(DDMS) DDMSパースペクティブ表示 選択したプロセ スのスレッド情 報や メモリ情報 マスタ タイトルの書式設定 「hello-jni」アプリのプロセス ログ This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-221 221
  • 223. アプリケーションのJava側のデバッグ Eclipseのデバッガ機能を用いてブレークポイントによる ステップごとの処理の解析(Java側のデバッグ) Debugパースペクティブ自動表示 マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-222 222
  • 224. アプリケーションのネイティブ側の デバッグ ログを出力させてLogcatで確認 (android/log.h) マスタ タイトルの書式設定 gdbを使う gdbサーバによる実機へのアタッチ gdbツールによるネイティブコードのステップデ バッグ This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-223 223
  • 225. LogcatにネイティブのLogを出力させる Android.m k LOCAL_LDLIBS #リンカに渡すオプション := -llog hello-jni.c #include <string.h> #include <jni.h> #include <android/log.h> //ログ出力ライブラ マスタ タイトルの書式設定 リ void Hoge( ) { // 引数 ( ログフラグ<trueがログ有効>, “ タグ “, “タグメッセージ” ) __android_log_write(ANDROID_LOG_DEBUG, "HelloNDK", "congratulation!"); } ログ関数 __android_log_write 文字列出力 __android_log_print 文字列出力(printf相当) __android_log_vprint 文字列出力(va_list版) __android_log_assert アサート This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-224 224
  • 226. 参 考 ログ関数を簡素化する 自作の logdebug.h をincludeすれば簡素化したログ関数を使用可能 logdebug.h : #include <android/log.h> hello-jni.c //ログ出力ライブラ リ #include <string.h> #define LOGV(...) ((void)LOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__)) #include <jni.h> #define LOGV(...) ((void)0) #include “logdebug.h” //簡素化したマクロが定義してる : ヘッダ : void Hoge( ) { #define LOGD(...) ((void)LOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__)) LOGE(“Error!!”); #define LOGD_IF(cond, ...) LOGD_IF(debug, “class name = ‘%s’", className); ( (CONDITION(cond)) ? ((void)LOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__)) : (void)0 ) method"); LOGD_IF(debug, “++++ in #define LOGI(...) ((void)LOG(LOG_INFO, LOG_TAG, __VA_ARGS__)) } #define LOGI_IF(cond, ...) ( (CONDITION(cond)) ? ((void)LOG(LOG_INFO, LOG_TAG, __VA_ARGS__)) : (void)0 ) #define LOGW(...) ((void)LOG(LOG_WARN, LOG_TAG, __VA_ARGS__)) #define LOGW_IF(cond, ...) ( (CONDITION(cond)) ? ((void)LOG(LOG_WARN, LOG_TAG, __VA_ARGS__)) : (void)0 ) #define LOGE(...) ((void)LOG(LOG_ERROR, LOG_TAG, __VA_ARGS__)) #define LOGE_IF(cond, ...) ( (CONDITION(cond)) ? ((void)LOG(LOG_ERROR, LOG_TAG, __VA_ARGS__)) : (void)0 ) : #define android_printLog(prio, tag, fmt...) __android_log_print(prio, tag, fmt) #define android_vprintLog(prio, cond, tag, fmt...) __android_log_vprint(prio, tag, fmt) マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-225 225
  • 227. gdbの使い方 • コマンドラインからgdbを使う ① 「ndk-build –B NDK_DEBUG=1」 でビルドする ② アプリケーションのAndroidManifest.xmlの debuggable属性をtrueにしてapkを作成する ③ デバッグ対象のアプリケーションをエミュレータか 実機で起動 ④ アプリケーションのプロジェクトのルート直下で 「ndk-gdb --start」を実行 ⑤ gdb起動、初期化後(gdb)プロンプトが出現 マスタ タイトルの書式設定 ※ただしgdb起動・初期化完了まで時間がかかるのでアプリ起動直後にJNIを コールしているようなアプリではデバッグは難しい This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-226 226
  • 228. gdbの基本的なコマンド コマンド continue 意味 c info break 実行再開 現在設定されているブレークポイント情 報 マスタ タイトルの書式設定 b ブレークポイントの設定 break <行数> delete d ブレークポイントの削除 next n 1行実行。関数へのステップインは行わな い step s ステップイン実行 finish f 現在の関数を最後まで実行して停止 print <変数名> p 変数の値の参照 quit q gdb終了 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-227 227
  • 229. gdbの使い方 • Eclipseからgdbを使う https://sites.google.com/a/android.com/tools/recent/usingthend kplugin マスタ タイトルの書式設定 CDTのパースペクティブにて プロジェクトの右クリック でPropertiesを選択 「C/C++Build」のBuilder Settingsにて Build Commandに「ndk-build NDK_DEBUG=1」 を設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-228 228
  • 230. gdbの使い方 マスタ タイトルの書式設定 CDTのパースペクティブにて プロジェクトの右クリック で 「Debug As」⇒「Android Native Application」を選 択 アプリケーションが実機またはエミュレー タにインストールされDebugパースペク ティブが開きステップ実行などのデバッグ が可能になる ※ただしgdb起動・初期化完了まで時間がかかるのでアプリ起動直後にJNIをコールしてい るようなアプリではデバッグは難しい http://mhandroid.wordpress.com/2011/01/23/using-eclipse-for-android-cc5-229 This material is licensed under the Creative Commons debugging/ License BY-NC-SA 4.0. 229
  • 231. その他 アプリケーションのデバッグ テストAPI(junit.framework) JUnit を基本にした Android のテストスイート Android の API を呼び出さない純粋な JUnit テスト Android のコンポーネントをテストする Android のJUnit 拡張テ スト Monkey マスタ タイトルの書式設定 エミュレータインスタンスやデバイスで動作するコマンドライン ツール クリックやタッチなどのユーザーの操作イベントやシステムのイ ベントをランダムに発生させてシステム内に送信 ストレステストの一種として使用可能 monkeyrunner ツール API から特定のコマンドやイベントを送信することにより、ワー クステーションからデバイスやエミュレータを制御することを 可能にする This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-230 230
  • 232. 高速化したか確かめる SDKのTraceViewツールを使 ・スレッドごとにグラフが分かれている public class HelloJni extends Activity { ・グラフは時系列で表示されており。その時間に実行され 用 @Override た public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); メソッドごとに色分けされている ・グラフの拡大可能 ・グラフをクリックすることでそのメソッドがコールされ ている場所 の一覧と関連情報がプロファイルパネルに反映される マスタ タイトルの書式設定 Debug.startMethodTracing(“test”); String str = getParametar(); //String str = stringFromJNI(); //ここの処理にかかる時間を測 Debug.stopMethodTracing(); 定 TextView tv = new TextView(this); tv.setText( str); setContentView(tv); } private String getParametarFromJava() { //浮動小数点演算などの重い処理 return str; } public native String stringFromJNI(); static { System.loadLibrary("hello-jni"); } } This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-231 231
  • 233. TraceViewの使い方 コードにDebug.startMethodTracingを仕込んだアプリを実機で実行 実機の/sdcard/にtest.traceが生成 [host_pc~] > adb pull /sdcard/test/trace ./ [host_pc~] > traceview ./test.trace name メソッド名 Incl% 最大経過時間に対するインク ルーシブタイムの割合 マスタ タイトルの書式設定 包括時間 Excl% 最大経過時間に対するイクスク ルーシブタイムの割合 Exclusive 降順にソート Inclusive 実際にメソッドの実行に費やさ れた時間 Calls+Recu コール回数+再帰的にコールされ r る回数、合計コール回数 Calls/Tota l 解析方法 Time/Call 平均タイム ① Excl%の値が高いメソッドを見つけて最適化す る ② Incl%の値が高いメソッドを見つけて最適化す る 5-232 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 232
  • 234. メモ マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-233 233
  • 235. JNIとは Java Native Interface アプリ Java Javaとネイティブ間を連携する仕組み AndroidのFramework内でもJNIが多用 Java⇔ネイティブ間の結合用ライブラ リと インタフェースの規約によって連携を 実現 層 Java アプリケーショ ン アプリケーション フレームワーク マスタ タイトルの書式設定 JNIをAndroidで利用することで ネイティブの資産を使えます 現在のAndroidに存在しないAPI を拡張できます フレームワーク JNI ネ イ テ ィ ブ 層 Androidランタイム コアライブラリ ネイティブ モジュール C/C++ Dalvik 仮想マシン ライブラ リ Linuxカーネル2.6 ドライバ This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-234 234
  • 236. JNIの型定義(プリミティブ型) JNIではJavaのプリミティブな型をC/C++で別名定義しています Javaの型名 C/C++の型名 備考 boolean jboolean unsigned 8bit byte jbyte signed 8bit //利便性のために定義されている定 数 #define JNI_FALSE 0 //false #define JNI_TRUE 1 //true マスタ タイトルの書式設定 char jchar unsigned 16bit short jshort signed 16bit int jint signed 32bit long jlong signed 64bit float jfloat 32bit double jdouble 64bit //整数添え字、サイズ typedef jint jsize; Java ネイティブ(C/C++) package com.sample; public class HelloJni { public native int getValue(); } jint Java_com_sample_HelloJni_getValue ( JNIEnv* env, jobject thiz ) This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-235 235
  • 237. JNIの型定義(参照型) JNIではJavaのオブジェクトを参照する型をC/C++で別名定義していま す Javaのオブジェクト C/C++の型名 すべてのJavaオブジェクト jobject java.lang.Class jclass マスタ タイトルの書式設定 java.lang.String jstring Object配列 jobjectArray boolean配列 jbooleanArray byte配列 jbyteArray char配列 jcharArray short配列 jshortArray int配列 jintArray long配列 jlongArray float配列 jfloatArray double配列 jdooubleArray This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-236 236
  • 238. JNIの文字列の取り扱い Javaの文字列はUNICODEなのでJNIでも文字列はUNICODEで扱う JNIにおいてUTF-8の文字列を扱う専用の関数 jstring NewStringUTF (JNIEnv* env, const char *bytes); マスタ タイトルの書式設定 jsize GetStringUTFLength (JNIEnv *env, jstring string); 【メソッドの機能】 【メソッドの機能】 文字列の長さを変更後の UTF-8 によるバイト数で返す 変更後の UTF-8 エンコーディングによる文字配列から 【パラメータ】 新しい java.lang.String オブジェクトを生成 env:JNI インタフェースポインタ 【パラメータ】 string:Java 文字列オブジェクト env:JNI インタフェースポインタ bytes: 変更後の UTF-8 文字列を参照するポインタ 【戻り値】 文字列の UTF-8 長を返す 【戻り値】 Java 文字列オブジェクト 文字列が構築できない場合は NULLを返す This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-237 237
  • 239. JNIの配列型の取り扱い C/C++の配列をJNI用の配列に変換する関数(例:int配列の場合) jintArray NewIntArray (JNIEnv *env, jsize length); jint* GetIntArrayElements (JNIEnv *env, jinitArray array, jboolean *isCopy); 【メソッドの機能】 int配列の新規作成 【メソッドの機能】プリミティブ配列の本体を返す 【パラメータ】 env:JNI インタフェースポインタ 【パラメータ】 env:JNI インタフェースポインタ length:配列の大きさ array:参照元のJava配列 【戻り値】 jintArray型で作成した配列 isCopy:参照方法指定 【戻り値】配列要素を参照するポインタ 演算が失敗した場合は、NULL マスタ タイトルの書式設定 jsize GetArrayLength (JNIEnv *env, jarray array); 【メソッドの機能】 配列の大きさ取得 【パラメータ】 env:JNI インタフェース ポインタ array:参照元のJava配 列 【戻り値】 配列の要素の数 void ReleaseIntArrayElements (JNIEnv *env, jinitArray array, jint* elems, jint mode); 【メソッドの機能】確保したプリミティブ配列のメモリを開 放する 【パラメータ】 env:JNI インタフェースポインタ array:参照元のJava配列 elems:開放するint型データ mode:Java配列への反映と解放の可否 JNI関数を利用して配列のリソースを確保した場合は最後に必ず解放する こと 5-238 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 238
  • 240. メソッド命名規則と引数 JNIのネイティブメソッド名の命名規則 接頭辞 Java_ 分解された完全修飾クラス名 下線 (「_」) 区切り文字 分解されたメソッド名 JNIのネイティブメソッドの引数はJavaのメソッドの引数 のほかに 必ず以下の引数が必要 第1引数 : JNIEnv* (JNIインタフェースポインタ) 第2引数 : jobject (呼び元のJavaのインスタンス参照注 1) マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-239 注1:呼び元のJavaで定義したJNIメソッドがstaticの場合はJavaクラス(jclass)の 239
  • 241. メソッド命名規則と引数 package com.example.hellojni; Javaのコード public class HelloJni { public native int getValue(); public native void setValue(int value); public native String addName(String str1, String str2); } マスタ タイトルの書式設定 Cのコー jint Java_com_example_hellojni_HelloJni_getValue( JNIEnv* env, jobject thiz ) { } ド void Java_com_example_hellojni_HelloJni_setValue ( JNIEnv* env, jobject thiz, jint value ) { } jstring Java_com_example_hellojni_HelloJni_addName ( JNIEnv* env, jobject thiz, jstring str1, jstring str2 ) { } JDKのjavahを使用すれば自動でネイティブ側のメソッド名が定義されたヘッダファイル HelloJni.classを指定してHelloJni.h を自動生成する $ javah –classpath bin/classes –d jni This material is licensed under the Creative Commons com.example.hellojni.HelloJni License BY-NC-SA 4.0. 5-240 240
  • 242. JNIのしくみ ネイティブコードは、JNI 関数を呼び出してJava VM機能に アクセスする JNIインタフェースポイ ンタ「JNIEnv」型 (このスレッドのみ有 効) JNI 関数のポイン タを格納する構造 体 マスタ ポインタ タイトルの書式設定 ポインタ (ポインタ配列のポイン タ) スレッドごとの データ構造 ポインタ ポインタ JNIインタフェース 関数 JNIインタフェース 関数 JNIインタフェース 関数 http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/jni/spec/jniTOC.htm This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-241 241
  • 243. JNIのしくみ 常にJNIインタフェースポインタ env を使用してJava オブジェクトを操 作 jdouble Java_pkg_Cls_f__ILjava_lang_String_2 ( JNIEnv *env, /* interface pointer */ jobject obj, /* "this" pointer */ jint i, /* argument #1 */ jstring s) /* argument #2 */ { /* Obtain a C-copy of the Java string */ const char *str = (*env)->GetStringUTFChars(env, s, 0); /* process the string */ ... /* Now we are done with str */ (*env)->ReleaseStringUTFChars(env, s, str); return ; ... } マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-242 242
  • 244. JNIのロード/アンロード jint JNI_OnLoad(JavaVM *vm, void *reserved); Java側のSystem.loadLibraryによりネイティブライブラリがロードされたとき にVMに呼ばれるメソッド このメソッドをエクスポートしていない場合はVMで認識されるJNI バージョン のデフォルト値「JNI_VERSION_1_1」 となる 戻り値のバージョン番号が不正な値の場合:ネイティブライブラリをロード不 可 パラメータ vm : インタフェース取得元の仮想マシンインスタンス 戻り値 JNI バージョン マスタ タイトルの書式設定 void JNI_OnUnload(JavaVM *vm, void *reserved); VMのネイティブライブラリを含むクラスローダのガベージコレクションのときに 呼ばれるクリーンアップオペレーション用メソッド パラメータ vm : インタフェース取得元の仮想マシンインスタンス This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-243 243
  • 245. JNIEnvのポインタ取得 jint GetEnv(JavaVM *vm, void **env, jint version); JavaVMのインスタンスからJNIインタフェースポインタを取得するためのメ ソッド パラメータ vm : インタフェース取得元の仮想マシンインスタンス env : 現在のスレッドの JNI インタフェースポインタの配置位置を参照 する ポインタ version : 要求された JNI バージョン 戻り値 現在のスレッドが VM に接続されていない場合:*env を null に設定し、 JNI_EDETACHED を返す 指定したバージョンがサポートされていない場合:*env を null に設定し、 JNI_EVERSION を返す それ以外の場合:*env を適切なインタフェースに設定し、JNI_OK を返す マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-244 244
  • 246. JavaVMへの接続/切断 jint AttachCurrentThread(JavaVM *vm, JNIEnv **p_env, void *thr_args); 現在のスレッドを Java VM へ接続。すでに接続されているスレッドへの接続は無 操作 JNIEnv 引数で JNI インタフェースポインタを返す パラメータ vm : 現在のスレッドが接続される VMのインスタンス p_env : 現在のスレッドの JNI インタフェースポインタが配置される位置 へのポインタ thr_args : NULL または JavaVMAttachArgs 構造体を参照するポインタにして 追加 情報を指定 jint DetachCurrentThread(JavaVM *vm); 戻り値 JNI_OK / VM からメインスレッドを切り離す JNI エラーコード マスタ タイトルの書式設定 パラメータ vm : 現在のスレッドが分離される VMのインスタンス 戻り値 JNI_OK / JNI エラーコード This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-245 245
  • 247. VMの参照(サンプルコード) JavaVM *gJavaVM; //グローバル参照 //Java側のSystem.loadLibraryで呼ばれる jint JNI_OnLoad(JavaVM *vm, void *reserved){ gJavaVM = vm; return JNI_VERSION_1_6; } void *myThread(void *arg) { int status = (*gJavaVM)->GetEnv(gJavaVM, (void **) &env, JNI_VERSION_1_6); if ( status < 0 ){//VMに未接続の場合このスレッドをVMに接続させる status = AttachCurrentThread(JavaVM *vm, JNIEnv **p_env, void *thr_args); if(status < 0 ) //エラー return; } //VMからJava側のメソッド呼び出しなどの処理 } //VMのネイティブライブラリを含むクラスローダがGCされるときに呼ばれる void JNI_OnUnload(JavaVM *vm, void *reserved) { int status = (*gJavaVM)->DetachCurrentThread(gJavaVM); if ( status < 0 ) //エラー } マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-246 246
  • 248. Javaからネイティブ呼び出し ①Javaのコード作成、ビルド HelloJni.java → HelloJni.class package com.example.hellojni; public class HelloJni { static { System.loadLibrary("hello-jni"); } public native boolean setValue(int value); ③Cのコード作成(hello-jni.c) - com_example_hellojni_HelloJni.h をinclud - JNIメソッド内の処理作成 #include <string.h> #include <jni.h> #include <com_example_hellojni_HelloJni.h> jboolean Java_com_example_hellojni_HelloJni_setValue ( JNIEnv* env, jobject thiz, jint value ) { sum = 100 + value; if( sum > 100 ){ return JNI_TRUE; return JNI_FALSE; } マスタ タイトルの書式設定 public static void main(String[] args) { HelloJni jni = new HelloJni (); Boolean res = jni.setValue ( 1 ); } } ②javahでJNIヘッダファイル作成 ④ビルドしてlibhello-jni.so作成/共有ライ ブラリ用ディレクトリに配置 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-247 247
  • 249. Javaからネイティブ呼び出し HelloJniアプリ実行 呼び元のHelloJniから引数が渡される - env :JNIインタフェースポインタ - jobject:HelloJniクラスのオブジェクト - value :1 処理実行 結果( JNI_TRUE (1)) を返す マスタ タイトルの書式設定 libhello-jni.soをロード main()を実行 HelloJniのインスタンス生成 ネイティブのsetValue(1)呼び出し Boolean res == true This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-248 248
  • 250. ネイティブからJavaメソッド呼び出し ①Javaのコード作成、ビルド HelloJni.java → HelloJni.class package com.example.hellojni; public class HelloJni { static { System.loadLibrary("hellojni"); } protected static native void setHogeObject(); protected static void setHoge(int value){ Log.i("Test", "hoge" + value); } public static void main(String[] args) { HelloJni jni = new HelloJni(); jni.setHogeObject(); ②javahでJNIヘッダファイル作成 } } ③Cのコード作成(hello-jni.c) - com_example_hellojni_HelloJni.h をinclude - JNIメソッド内の処理作成 void Java_com_example_hellojni_HelloJni_setHogeObject (JNIEnv *env, jclass clazz) { jmethodID mid = (*env)-> GetStaticMethodID(env, clazz, “setHoge", "(I)V"); (*env)->CallStaticVoidMethod(env, clazz, mid, 5); return; } マスタ タイトルの書式設定 呼び元のJavaで定義したJNIメ ソッドがstaticの場合は java.lang.Classの参照になる ④ビルドしてlibhello-jni.so作成/共有ライ ブラリ用ディレクトリに配置 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-249 249
  • 251. ネイティブからJavaメソッド呼び出し HelloJniアプリ実行 libhello-jni.soをロード main()実行 HelloJniのインスタンス生成 ネイティブのsetHogeObject呼び出し 呼び元のHelloJniからsetHogeObjectに 引数が渡される - env :JNIインタフェースポインタ - clazz:HelloJniクラスの java.lang.Class オブジェクト マスタ タイトルの書式設定 呼び出すJavaのメソッド名 “setHoge”とシグネチャからメソッ ドID取得 CallStaticVoidMethod実行 JavaのメソッドsetHoge(5)を呼ぶ setHoge(5)が呼ばれて 「hoge5」とログ表示 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-250 250
  • 252. Javaメソッドの表現 JNIではJavaのオーバーロード関数はメソッド名と引数リストの組み 合わせで識別する。Javaの型にはそれぞれ型のシグニチャーが決めら れているので引数リストはそれらのシグニチャーで構成する Javaの型の シグニチャー Java型名 Z boolean B byte C char S short I int J long F float D double L 完全指定のクラス [ 型[](型の配列) V void Javaメソッド long hoge(int n, String s, int[] arr); マスタ タイトルの書式設定 シグニチャー表現 (ILjava/lang/String;[I)J JDKのjavapを使用すれば指定されたク ラスのメソッドのシグニチャーが表示 されます $ javap –s <完全指定のJavaクラスファイル名> This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-251 251
  • 253. ネイティブからのオブジェクトの参照 Java Classオブジェク ト クラス名か ら取得 jclass clazz = (*env)-> FindClass(env,"Ljava/lang/Object;"); 返り値のNULL チェック要 インスタン スから取得 jclass clazz = (*env)->GetObjectClass(env, obj); 返り値のNULL チェック要 jmethodID mid = (*env)-> GetMethodID(env,clazz, "メソッド名", “SIG"); jint response = (*env)-> CallIntMethod(env, obj, mid, 引数…); * Javaメソッド midのNULL チェック要 マスタ タイトルの書式設定 static Javaメソッド Javaオブジェク トのフィールド 値 static なJavaオ ブジェクトの フィールド値 呼び出し jmethodID mid = (*env)-> GetStaticMethodID(env,cclazz, "メソッド名", “SIG"); jint response = (*env)-> CallStaticIntMethod(env, clazz, mid, 引数…); * jfieldID fid = (*env)-> GetFieldID(env, clazz, "フィールド名", "I"); jint response = (*env)-> GetIntField(env, obj, fid); * fidのNULL チェック要 取得 jfieldID fj = (*env)-> GetStaticFieldID(env, clazz, "フィールド名", "I"); jint response = (*env)-> GetStaticIntField(env, clazz, fid); * この関数を呼 ぶことでロー すべてのJavaオ ローカル参 (*env)->DeleteLocalRef(env, obj); カル参照が終 ブジェクト *JNI関数の名前はコールするメソッドや取得するフィールドの型によって変わります 照の終了 obj = NULL; 了したとみな される <type> Call<type>Method(JNIEnv*, jobject, jmethodID, ・・・) <type> CallStatic<type>Method(JNIEnv*, jclass, jmethodID, ・・・) <type> Get<type>Field(JNIEnv*, jobject, jfieldID, ・・・) <type> GetStatic<type>Field (JNIEnv*, jclass, jfieldID, ・・・) This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-252 252
  • 254. JNIの例外処理 JNI では、ネイティブメソッドは任意の Java の例外を発生させることが可能 try~catchに当たる部分は 自分でコーディングする必要がある env*->Throw((env, jthrowable)e); return; 必ずreturn要 jclass clsj = env->FindClass("Ljava/lang/RuntimeException;"); if (clsj==NULL) return; env*->ThrowNew(env, clsj, "message"); env*->DeleteLocalRef(env, clsj); return; ローカル参照の jclass は必ず DeleteLocalRefする こと マスタ タイトルの書式設定 例外発生 再throw if (env* -> ExceptionCheck ( env)) return; 特定の種類の 例外をcatch jclass reClsj = env*->FindClass ( env, "Ljava/lang/RuntimeException;"); if (reClsj==NULL) return; //予めRuntimeExceptionのオブジェクトを用意しておく jthrowable ej = env* -> ExceptionOccurred ( env ); if (ej!=NULL && env*->IsInstanceOf ( env, ej, reClsj ){ //例外補足したときの処理 } 例外無視 env*->ExceptionClear( env ); 致命的エラー env*->FatalError( env, "malloc() is null"); This material is licensed under the Creative Commons License BY-NC-SA 4.0. ローカル参照の jclass は必ず DeleteLocalRefする こと Javaも終了する 5-253 253
  • 255. まとめと次回予告 5章ではLinuxやAndroidにおけるハードウェアの組み込みの仕組み を理解し実際のカーネルに組み込むためのドライバモジュールの 作成をして組み込むことができるようになりました また6章においてネイティブライブラリを含んだAndroidのアプリケー ションを作成するためにNDKの使い方を理解し、ネイティブーJava 間でやり取りをする仕組みであるJNIの規約について学びました マスタ タイトルの書式設定 次章からはいよいよこれまで学んだことを生かして Armadillo-440上のAndroidにUSBシリアル変換ケーブルを組込み シリアル通信インタフェースで動作するデバイスを使ったAndroid アプリケーションを作成し、実際に動作させてみましょう This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-254 254
  • 256. メモ マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-255 255
  • 257. 第7章 シリアルデバイス マスタ タイトルの書式設定 アプリケーション作成 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-256 256
  • 258. 7章の概要 • • • • • • • • • 実習で使用するデバイスの前提知識 システム構成 アプリケーション構成 デバイスファイル名の確認方法 デバイスの組込み カーネルの移植 ユーザランドのファイルシステム作成と移植 デバイス制御アプリケーションを動作させる デバッグ方法 マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-257 257
  • 259. バーコードリーダー仕様 • 本実習ではバーコードリーダーを使用します • TSK-R CCD RS232C バーコードリーダー(FKSYSTEM製 ) – タッチ式CCDバーコードリーダー(0mm~最大2cm程度) – JANコード(市販の商品等)、NW-7(宅配便の送り状等)、 Code39、Code128(社内伝票等) – シリアル通信インタフェース マスタ タイトルの書式設定 • • • • ボーレート : 9600 データビット : 8bit ストップビット : 1 パリティ制御 : なし – データ送受信用ケーブルの端子 • RS232C – 給電用ケーブルの端子 • USB – 接続先へ送信する解析データの構成 • フレームの先頭データの値 : アスキー[FF]( HEX:0D) 5-258 This material is licensed under the Creative Commons • フレームの末尾データの値 License BY-NC-SA 4.0. : アスキー 258
  • 260. USBシリアルケーブル仕様 • USBシリアルケーブル – SRC06USB(Arvel) – Linux汎用FTDIドライバ使用可能 マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-259 259
  • 261. 実習課題 ①バーコードリーダー アプリ起動 シリアル Armadillo-440 ACアダプタクロスケーブル ( Android 2.2) 給電用USB 開発用PC マスタ タイトルの書式設定 バーコードリー USB-RS232C 変換ケーブル ダー USB RS232C LANケーブル ③書籍情報表示 ②書籍バーコード をタッチ! This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-260 260
  • 262. ソフトウェア構成図 実装箇所 アプリケーション アプリ 画面 Home Contacts Phone Browser アプリケーションフレームワーク アクティビティ マネージャ ウィンドウ マネージャ コンテンツ プロバイダ ビューシステム 通知マネージャ パッケージ マネージャ 電話 マネージャ リソース マネージャ 位置 マネージャ XMPP サービス マスタ タイトルの書式設定 シリアル通信 マネージャ JNI シリアル インタフェース ライブラリ ライブラリ Androidランタイム サーフェス マネージャ メディア フレームワーク SQLite コアライブラリ OpenGL | ES FreeType WebKit Dalvik 仮想マシン SGL SSL Libc HARDWARE ABSTRACTION LAYER WiFi Audio Camera Radio(RIL) ・・・ ディスプレイ ドライバ Bluetooth ドライバ カメラドライバ フラッシュメモリ ドライバ バインダ(IPC) ドライバ キーパッド ドライバ USBドライバ WiFiドライバ オーディオ ドライバ 電源管理 Graphics Linuxカーネル 2.6 カーネルに 組み込む USBシリアル ドライバ (FTDI) This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-261 261
  • 263. デバイスドライバとデバイスファイル名確認 【接続環境】 開発用PC ⇔ RS232C変換ケーブル このデバイスの デバイスドライバとデ バイスファイル名を確 認する 開発用PC マスタ タイトルの書式設定 USB-RS232C 変換ケーブル USB RS232C This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-262 262
  • 264. デバイスドライバとデバイスファイル名確認 ①開発用PCにデバイス挿入前 ※すでに本研修で 開発用PCに接続して しまっているので ①は確認できません [host_pc~] > lsmod マスタ タイトルの書式設定 Module binfmt_misc nfsd exportfs Size Used by 6587 1 238871 13 3437 1 nfsd [host_pc~] > ls␣/dev/tty* : /dev/tty15 /dev/tty26 /dev/tty37 /dev/tty48 /dev/tty59 /dev/ttyS3 /dev/tty16 /dev/tty27 /dev/tty38 /dev/tty49 / dev/tty6 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-263 263
  • 265. 実 習 デバイスドライバとデバイスファイル名確認 【環境】 開発用PCのLinuxシェル ②開発用PCにデバイス挿入後 [host_pc~] > lsmod Module ftdi_sio usbserial binfmt_misc nfsd exportfs Size Used by ①と②を見比べる 34252 USB SERIALにはFTDI_SOドライバが 1 33694 3 ftdi_sio 使われていることがわかる 6587 1 238871 13 3437 1 nfsd マスタ タイトルの書式設定 [host_pc~] > ls␣/dev/tty* : /dev/tty15 /dev/tty26 /dev/ttyS3 /dev/tty16 /dev/tty27 /dev/ttyUSB0 /dev/tty37 /dev/tty48 /dev/tty59 /dev/tty38 /dev/tty49 /dev/tty6 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-264 264
  • 266. 実 習 カーネルコンフィギュレーションの 編集と適用と確認 【環境】 開発用PCのLinuxシェ ル カンペ⇒11_FTDIカーネルコンフィギュレーションとビ ルド.txt ①$ANDROID/Embedded-MasterARM/kernel/armadillo440/arch/arm/configs/armadillo400_android_de fconfigを別名コピー。(armadillo400_android_ensyu_defconfig) マスタ タイトルの書式設定 [host_pc~] > cd␣$ANDROID/Embedded-Master-ARM/kernel/armadillo440/arch/arm/configs [host_pc~] > cp␣armadillo400_android_defconfig␣armadillo400_android_ensyu_defconfig ②geditで直接編集。下記を追加。 [host_pc~] > gedit␣armadillo400_android_ensyu_defconfig # USB port drivers # CONFIG_USB_SERIAL=y CONFIG_USB_SERIAL_FTDI_SIO=y ③geditで保存して終了 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-265 265
  • 267. 実 習 カーネルコンフィギュレーションの 編集と適用と確認 カンペ⇒11_FTDIカーネルコンフィギュレーションとビ ルド.txt ④makeコマンドでコンフィグレーション設定 [host_pc~] > cd␣$ANDROID/Embedded-Master-ARM/kernel/armadillo440 [host_pc~] > make␣ARCH=arm␣CROSS_COMPILE=$ANDROID/Embedded-MasterARM/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi␣armadillo400_android_ensyu_defconfig マスタ タイトルの書式設定 ⑤カーネルコンフィギュレーション値が反映されたか「.config」をless で確認しましょう [host_pc~] > cd␣$ANDROID/Embedded-Master-ARM/kernel/armadillo440 [host_pc~] > less␣config lessで開いて検索( 「/」キーのあとにキーワードを入れてリターン)し設定が反映され ているかを確認する # USB port drivers # CONFIG_USB_SERIAL=y CONFIG_USB_SERIAL_FTDI_SIO=y This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-266 266
  • 268. 実 習 Androidカーネルイメージの作成 カンペ⇒11_FTDIカーネルコンフィギュレーションとビ ルド.txt ⑥カーネルイメージ作成 [host_pc~] > make␣ARCH=arm␣CROSS_COMPILE=$ANDROID/Embedded-Master- マスタ タイトルの書式設定 ARM/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi- //カーネルのイメージファイル作成 [host_pc~] > gzip␣-c␣arch/arm/boot/Image␣>␣linux_training.ensyu_bin.gz FTDIデバイスを組み込んだ Androidのカーネルイメー ジ This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-267 267
  • 269. メモ マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-268 268
  • 270. 実 習 ユーザランドのソースの修正 【環境】 開発用PCのLinuxシェル カンペ⇒12_演習用ユーザランド作 成.txt ユーザランド内で組み込んだデバイス(デバイスファイル名 「ttyUSB0」)にアプリケーションなどがアクセスできるよう にします ① $ANDROID/system/core/init/devices.c マスタ タイトルの書式設定 の構造体「perms_devperms[]」に以下の行を追加します デバイスファイル「ttyUSB0」の追加とアクセス権限、uid、gidの設定を行っ ています static struct perms_ devperms[] = { { "/dev/null", 0666, AID_ROOT, AID_ROOT, 0 }, { "/dev/zero", 0666, AID_ROOT, AID_ROOT, 0 }, { "/dev/full", 0666, AID_ROOT, AID_ROOT, 0 }, { "/dev/ptmx", 0666, AID_ROOT, AID_ROOT, 0 }, { "/dev/tty", 0666, AID_ROOT, AID_ROOT, 0 }, { "/dev/tty0", 0660, AID_ROOT, AID_SYSTEM, 0 }, { "/dev/cam", 0660, AID_ROOT, AID_CAMERA, 0 }, : { "/dev/ttyUSB0", 0666, AID_ROOT, AID_ROOT, 0 }, { NULL, 0, 0, 0, 0 }, }; This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-269 269
  • 271. Androidのユーザランドのビルド カンペ⇒12_演習用ユーザランド作 成.txt ②ユーザランドのビルド マスタ タイトルの書式設定 // Androidユーザランドのビルド [host_pc~] > cd␣$ANDROID/Embedded-Master-ARM/ [host_pc~] > echo␣"TARGET_PRODUCT:=armadillo440"␣>␣buildspec.mk [host_pc~] > make␣-j2 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-270 270
  • 272. 実 習 ユーザランドのファイルシステム作成 カンペ⇒12_演習用ユーザランド作成.txt ③ Androidのルートファイルシステムに必要なファイル類を集め る [host_pc~] > cd␣$ANDROID [host_pc~] > mkdir␣-p␣android-ensyu_root マスタ タイトルの書式設定 [host_pc~] > cd␣$ANDROID/Embedded-MasterARM/out/target/product/armadillo440 [host_pc~] > cp␣-Rdpf␣root/*␣$ANDROID/android-ensyu_root [host_pc~] > cp␣-Rdpf␣system/* $ANDROID/android—ensyu_root/system/ [host_pc~] [host_pc~] [host_pc~] [host_pc~] [host_pc~] > > > > > cd␣$ANDROID/android-ensyu_root sudo␣chown␣-R␣root.root␣. sudo␣chmod␣777␣-R␣system/usr/keychars sudo␣chmod␣777␣-R␣system/usr/keylayout sudo␣chmod␣777␣system/etc/dhcpcd/dhcpcd-run-hooks This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-271 271
  • 273. 実 習 固定IPアドレスの設定について Androidのネットワーク設定は移植先のターゲットボードのルートファイル システムにあるハードウェア専用の起動スクリプトinit.<hardware名>.rc で設定されている Armadillo440の場合 → /init.armadillo440.rc : $ANDROID/ android-ensyu_root on boot コメントをはずす setprop ro.sf.lcd_density 120 sudo gedit init.armadillo440.rc setprop ro.radio.use-ppp no setprop ro.radio.noril yes setprop status.battery.state Slow#LAN service␣lansetprop status.battery.level 5 setprop status.battery.level_raw setup␣/system/etc/init.armadillo440.sh 50 setprop status.battery.level_scale 9 oneshot setprop net.eth0.dns1 8.8.8.8 setprop net.dns1 8.8.8.8 symlink /dev/snd/dsp /dev/eac このシェルスクリ chmod 0666 /dev/snd/dsp write /sys/class/backlight/pwm-backlight/brightness プトも確認(次 255 マスタ タイトルの書式設定 ページ) #LAN ##service lan-setup /system/etc/init.armadillo440.sh ## oneshot This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-272 272
  • 274. 実 習 固定IPアドレス設定 カンペ⇒02_固定IPアドレス設定.txt ④ 起動時に固定IPアドレスが設定されるようなシェルスクリプト 作成 //Androidのネットワーク設定ファイルに固定IPアドレスを設定しておく [host_pc~] > cd␣$ANDROID/ android-ensyu_root [host_pc~] > cd␣system/etc [host_pc~] > sudo␣gedit␣init.armadillo440.sh マスタ タイトルの書式設定 gedit起動、編集 #!/system/bin/sh netcfg eth0 up netcfg eth0 dhcp #!/system/bin/sh ifconfig␣eth0␣192.168.1.11 保存してgedit終了 //実行権限をつける [host_pc~] > sudo␣chmod␣a+x init.armadillo440.sh This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-273 273
  • 275. 実 習 Androidファイルシステムの完成 カンペ⇒03_ファイルシステムの完 成.txt ⑤ Androidのルートファイルシステムのアーカイブ作成 //Androidユーザランドのファイルシステムをアーカイブにする [host_pc~] > cd␣$ANDROID/android-ensyu_root [host_pc~] > tar␣cvzf␣$ANDROID/rootfs_ensyu_training.tar.gz . [host_pc~] > cd␣$ANDROID [host_pc~] > ls マスタ タイトルの書式設定 Embedded-Master-ARM␣rootfs_ensyu_training.tar.gz␣androidensyu_root␣ rootfs_a_training.tar.gz␣android-root FTDIデバイスを組み込んだ Androidのユーザランドのファイルシス テム This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-274 274
  • 276. メモ マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-275 275
  • 277. 4章の実習完了後のメモリの状態 【接続環境】 開発用PC ⇔ Armadillo-440(RS232Cケーブ ル) JP2ショート状態(hermit起動モード) [armadillo] hermit> setenv console=ttymxc1 root=/dev/mmcblk0p2 init=/init noinitrd rootwait [armadillo] hermit> boot 開発用PC C-Kermit シリアル通信ソフ ト マスタ タイトルの書式設定 Armadillo-440 NOR Flashメモリ(32M) linux_training_.bi n.gzをRAMに ロードして実行 組み込み済み 現在はこの状態 bootloader ブートローダ領域(Hermit) SDカード内の Androidで起動 Android対応kernel Linuxカーネル領域 userland microSD /dev/mmcblk0p1 Androidの ルートファイル システム /dev/mmcblk0p2 Linuxユーザランド領域 config Linuxカーネルパラメータ保存領域 This material is licensed under the Creative Commons License BY-NC-SA 4.0. Androidが起動 5-276 276
  • 278. 実 習 ユーザランドの差し替えをするので 通常Linuxのカーネルに戻す 【接続環境】 開発用PC ⇔ Armadillo-440(RS232Cケーブル) JP2ショート状態(hermit起動モード) カンペ⇒05_製品版Linuxのブート手 順.txt [host_pc~] $ cd␣~/work/atmark [host_pc~] $ hermit␣download␣--input-file␣linux-a400-1.06.bin.gz␣--region␣kernel␣--port␣ マスタ タイトルの書式設定 /dev/ttyUSB0 Armadillo-440 NOR Flashメモリ(32M) 開発用PC bootloader ブートローダ領域(Hermit) kernel hermit Linuxカーネル領域 Armadillo用 ブートローダ兼ダウンロー ダ userland Linuxユーザランド領域 config Linuxカーネルパラメータ保存領域 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-277 277
  • 279. 実 習 通常Linuxのカーネルで起動 【接続環境】 開発用PC ⇔ Armadillo-440(RS232Cケーブル) JP2ショート状態(hermit起動モード) 開発用PC カンペ⇒05_製品版Linuxのブート手順.txt [armadillo] hermit> clearenv [armadillo] hermit> setenv Armadillo-440 [armadillo] hermit> boot NOR Flashメモリ(32M) C-Kermit シリアル通信ソ フト マスタ タイトルの書式設定 linux-a400-1.06.bin.gz をRAMにロードして実行 /dev/mmcblk0 bootloader microSD ブートローダ領域(Hermit) kernel Linuxカーネル領域 × Androidの ルートファイル /dev/mmcblk0p2 システム userland Linuxユーザランド領域 linux-romfsをマウント 各プロセスの実行 config Linuxカーネルパラメータ保存領域 通常Linuxが起動 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-278 278
  • 280. 実 習 演習用Android RootfsをArmadillo-440へ転送 【接続環境】 開発用PC ⇔ Armadillo-440(RS232Cケーブル) 開発用PC ⇔ Armadillo-440(LANケーブル) JP2ショート状態(hermit起動モード) 開発PC armadillo440 マスタ タイトルの書式設定 FTP /home/ftp/pub/ カンペ⇒07_Android RootFSのFTP転送.txt rootfs_ensyu_training.tar.gz 192.168.1.10 192.168.1.11 [host_pc~] > cd␣$ANDROID [host_pc~] > ftp␣192.168.1.11 login name:ftp login password:なし ftp> cd␣pub ftp> bin ftp> put␣rootfs_ensyu_training.tar.gz ftp> bye [host_pc~] > This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-279 279
  • 281. 実 習 演習用Android RootfsをmicroSDに展開 Armadillo440の/home/ftp/pubからAndroidのユーザラ ンドのファイルシステムをmicroSDカードのパーティ ション2(mmcblk0p2)に展開します マスタ タイトルの書式設定 カンペ⇒13_演習用Android RootFSをmicroSDに展開.txt [armadillo ~] # mount␣/dev/mmcblk0p2 /mnt //microSDのパーティション2に マウント [armadillo ~] # rm –rf /mnt/* //マウント配下の ファイルやディレクトリを削除 [armadillo ~] # cd␣/home/ftp/pub //ftpで転送したRootfsのある場所へ [armadillo ~] # mv␣rootfs_ensyu_training.tar.gz␣/mnt/. //マウント配下にRootfsを 移動 [armadillo ~] # cd␣/mnt //マウント ディレクトリへ [armadillo ~] # tar␣xzvf␣rootfs_ensyu_training.tar.gz // Rootfsを展開 [armadillo ~] # rm␣–rf␣lost+found //不要なフォルダの 削除 [armadillo ~] # rm␣–rf␣rootfs_ensyu_training.tar.gz //tarファイルも削除 [armadillo ~] # cd␣.. 5-280 //マウント This material is licensed under the Creative Commons License BY-NC-SA 4.0. 280 ディレクトリから抜ける
  • 282. 実 習 製品版Linuxのrebootとkermit切断 [armadillo ~] # reboot [armadillo ~] # System is going down for system reboot now. Starting local stop scripts. Exiting Syslogd! Syncing all filesystems: done Unmounting all filesystems: done The system is going down NOW !! Sending SIGTERM to all processes. Please stand by while rebooting the system. Hermit-At v2.0.8 (armadillo4x0) compiled at 15:29:17, Nov 12 2010 hermit> <ctrl+→ctrl+c> //ショートカットキー (Back at ubuntu-vm) ---------------------------------------------------(/home/aj741327/) C-Kermit> q Closing /dev/ttyUSB0...OK [host_pc~] > マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-281 281
  • 283. 実 習 デバイスを組み込んだAndroid用カーネルを書き込む 【接続環境】 開発用PC ⇔ Armadillo-440(RS232Cケーブル) JP2ショート状態(hermit起動モード) カンペ⇒14_演習用Androidブート手順.txt # Armadillo440用の標準カーネルをAndroidのLinuxカーネルで上書きします [host_pc~] > cd␣$ANDROID/Embedded-Master-ARM/kernel/armadillo440 [host_pc~] > hermit␣download␣--input-file␣linux_training_ensyu.bin.gz␣-- マスタ タイトルの書式設定 region␣kernel␣ --port␣/dev/ttyUSB0 Armadillo-440 NOR Flashメモリ(32M) 開発用PC bootloader ブートローダ領域(Hermit) Android対応kernel hermit Linuxカーネル領域 Armadillo用 ブートローダ兼ダウンロー ダ userland Linuxユーザランド領域 config Linuxカーネルパラメータ保存領域 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-282 282
  • 284. 実 習 デバイスを組み込んだ新Androidで起動 【接続環境】 開発用PC ⇔ Armadillo-440(RS232Cケーブル) JP2ショート状態(hermit起動モード) 開発用PC カンペ⇒14_演習用Androidブート手順.txt [armadillo] hermit> setenv␣console=ttymxc␣root=/dev/mmcblk0p2␣init=/init␣noinitrd␣ rootwait [armadillo] hermit> boot C-Kermit シリアル通信ソ フト マスタ タイトルの書式設定 Armadillo-440 NOR Flashメモリ(32M) linux_training_ensyu.b in.gzをRAMにロードして 実行 組み込み済み bootloader ブートローダ領域(Hermit) SDカード内の Androidで起動 Android対応kernel /dev/mmcblk0 microSD Linuxカーネル領域 userland Androidの ルートファイル システム /dev/mmcblk0p2 Linuxユーザランド領域 config Linuxカーネルパラメータ保存領域 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 新Androidが起動 5-283 283
  • 285. 実 習 新Android起動後の確認事項 【接続環境】 ここでは 作業用PC ⇔ Armadillo-440(RS232Cケーブル) から下記に変更する 開発用PC ⇔ Armadillo-440(LANケーブル) ネットワーク設定の確認をします [Android] # netcfg lo UP 127.0.0.1 255.0.0.0 eth0 UP 192.168.1.11 マスタ タイトルの書式設定 0x00000049 255.255.255.0. 0x00001043 ※上記のIPアドレスが設定されていない場合は「ifconfig eth0 192.168.1.11」を手 打ち で実行して設定してください。 IPアドレスの設定確認終了後 ①ckermitでの接続を切断(Androidのプロンプトで[ctrl+→ctrl+c] ⇒ [q]) ②RS232CケーブルをArmadilloからはずす ③LANケーブルで開発用PCと接続 ④開発用PCのコマンドプロンプトからpingを投げてネットワークの接続の確 認 5-284 This material is licensed under the Creative Commons ⑤adb shell 起動 License BY-NC-SA 4.0. 284
  • 286. 実 習 新Android起動後の確認事項 【接続環境】 開発用PC ⇔ Armadillo-440(LANケーブル) Armadillo-440のUSBポートに「USBシリアル変換ケーブル」を抜き挿ししてデ バイス ファイル「ttyUSB0」があるか確認します マスタ タイトルの書式設定 ①Armadillo-440に挿入前 [Android] # ls␣/dev/tty* : /dev/tty15 /dev/tty26 /dev/tty37 /dev/tty48 /dev/tty59 /dev/ttyS3 /dev/tty16 /dev/tty27 /dev/tty38 /dev/tty49 / dev/tty6 ②Armadillo-440に挿入後 [Android] # ls␣/dev/tty* : /dev/tty15 /dev/tty26 /dev/tty37 /dev/tty48 /dev/tty59 /dev/ttyS3 /dev/tty16 /dev/tty27 /dev/tty38 /dev/tty49 /dev/tty6 /dev/ttyUSB0 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-285 285
  • 287. メモ マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-286 286
  • 288. 実 習 新規NDKアプリケーションProject作成 【Application Name】 BarcodeReader 【Project Name】 BarcodeReader 【Package Name】 jp.oesf.ensyu Ecripse⇒File > New > Project マスタ タイトルの書式設定 【Build Target】 Android 2.2 (API level 8) チェックをはずす 「Android Application Project」選択して「Next」 必要な設定項目を入力して「Next」 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-287 287
  • 289. 実 習 新規NDKアプリケーションProject作成 マスタ タイトルの書式設定 「Create Activity」にチェックをつけて「Next」 TitleはApplication名に変更して「Finish」 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 「BarcodeReader」という新規の プロジェクトが完成 (ここまでは通常のAndroidアプ リケーションのプロジェクトで す) 5-288 288
  • 290. 実 習 新規NDKアプリケーションProject作成 マスタ タイトルの書式設定 作成するJNI用の共有ライブラ リ名「serial-barcode」を入 力して プロジェクト名を右クリックして 「Finish」 「Andoroid Tools」⇒「Add Native Support」選択 This material is licensed under the Creative Commons License BY-NC-SA 4.0. プロジェクトにjniフォル ダとobjフォルダが追加さ れる Jniフォルダには最小限の 設定が書かれたAndroid.mk が自動生成される 5-289
  • 291. 実 習 新規NDKアプリケーションProject作成 マスタ タイトルの書式設定 今回は単一解像度の実機しか用いないのでdrawableフォルダの不要なフォルダを削除してください drawable-hdpi、drawable-ldpi、drawable-xdpiを選択して「Delete」 ※プロジェクトの構造を見やすくするため This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-290
  • 292. 実 習 ソースコードの配置(リソースファイル) 本実習で使用するコードをプロジェクト内に配置(コ ピー) ●デスクトップ/resource_of_res/drawable-mdpi ●デスクトップ/resource_of_res/layout → res/配下に上書きコピー マスタ タイトルの書式設定 コピー This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-291
  • 293. 実 習 ソースコードの配置(Javaのソースコード) 本実習で使用するコードをプロジェクト内に配置(コ ピー) ●デスクトップ/source_of_java/MainActivity.java ●デスクトップ /source_of_java/OnSerialListener.java ●デスクトップ/source_of_java/RxtxSerial.java → jp.oesf.ensyuパッケージ配下に上書きコピー マスタ タイトルの書式設定 コピー This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-292
  • 294. 実 習 ソースコードの配置(ネイティブのソースコード) 本実習で使用するコードをプロジェクト内に配置(コ ピー) ●デスクトップ/source_of_native/logdebug.h ●デスクトップ/source_of_native/serial-barcode → jniフォルダ配下にコピー マスタ タイトルの書式設定 コピー jniフォルダ配下にserial-barcode.cppというC++のコード ファイル がありますが今回はCで開発するので削除してかまいませんCommons This material is licensed under the Creative License BY-NC-SA 4.0. 5-293
  • 295. ソフトウェア構成図 MainActivity.java OnSerialListener. java アプリ 画面 アプリケーション Home Contacts Phone Browser アプリケーションフレームワーク アクティビティ マネージャ ウィンドウ マネージャ コンテンツ プロバイダ ビューシステム 通知マネージャ パッケージ マネージャ 電話 マネージャ リソース マネージャ 位置 マネージャ XMPP サービス マスタ タイトルの書式設定 RxtxSerial.jav シリアル通信 マネージャ JNI a シリアル インタフェース ライブラリ ライブラリ Androidランタイム サーフェス マネージャ メディア フレームワーク SQLite コアライブラリ OpenGL | ES FreeType WebKit Dalvik 仮想マシン SGL SSL Libc HARDWARE ABSTRACTION LAYER serialbarcode.c WiFi Audio Camera Radio(RIL) ・・・ ディスプレイ ドライバ Bluetooth ドライバ カメラドライバ フラッシュメモリ ドライバ バインダ(IPC) ドライバ キーパッド ドライバ USBドライバ WiFiドライバ オーディオ ドライバ 電源管理 Graphics Linuxカーネル 2.6 USBシリアル ドライバ (FTDI) This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-294 294
  • 296. 実 習 Android.mkの編集 BarcodeReader/jni/Android.mkを編集します LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) マスタ タイトルの書式設定 LOCAL_MODULE := serial-barcode LOCAL_SRC_FILES := serial-barcode.cpp include $(BUILD_SHARED_LIBRARY) LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := serial-barcode バーコードリーダを制御するネイティブモジュー ル名 LOCAL_SRC_FILES := serial-barcode.c バーコードリーダを制御するネイティブライブラリのソー LOCAL_LDLIBS := -llog スコード include $(BUILD_SHARED_LIBRARY) This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-295 295
  • 297. JNIインタフェース 本アプリケーションでバーコードリーダを制御するために必要なJava側のJNIインタフェ ース はRxtxSerial.javaで定義されています。 RxtxSerial.java //ネイティブモジュール(.so)のロード static { System.loadLibrary("jniserial"); } //シリアルデバイスに接続 public native int openComm(String dev, boolean debug); //シリアルデバイスから切断 public native void closeComm(); //シリアルデバイスに接続時のパラメータ設定 private native boolean setCommParams(int baudRate, int dataBits,int stopBits, int parity); //ネイティブに自インスタンスを渡す protected static native void setListener(RxtxSerial rxtxSerial); //ネイティブで動いているスレッドを明示的に止める protected static native void stopReadThread(); マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-296 296
  • 298. 実 習 JNIヘッダファイルの生成 ①JNIインタフェースが定義されたヘッダファイルを作成します AndroidのJavaのコードのコンパイル結果(.classファイル)は<Project>/bin/classes配下に 存在します。 JDKのjavahコマンドでJNIヘッダファイルの生成とプロジェクトのjniディレクトリへの配置を 行います。 カンペ⇒15_JNIヘッダファイル作 成.txt [host_pc~] [host_pc~] [host_pc~] Android.mk $ cd␣~workspace/BarcodeReader //アプリケーションのプロジェクト $ javah␣-classpath␣bin/classes␣-d␣jni␣jp.oesf.ensyu.RxtxSerial $ ls␣jni serial-barcode.c logdebug.h jp_oesf_ensyu_RxtxSerial.h マスタ タイトルの書式設定 ②Eclipseにてプロジェクト名を右クリックし、「Refresh」を行うことで、Eclipse内のパッ ケージ構成にも 作成したヘッダファイルが表示されます This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-297 297
  • 299. 実 習 JNIヘッダファイルの生成 ③EclipseにてBarcodeReader/jni/serial-barcode.cを開き以下のヘッダのincludeを追記 します マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-298
  • 300. 参 考 コード概要(MainActivity.java) MainActivity.javaではバーコードで読み取ったコードを表示する画面の実装をし ています //ActivityクラスにOnSerialListenerインタフェースを実装する public class MainActivity extends Activity implements OnSerialListener { @Override public void onCreate(Bundle savedInstanceState) { : RxtxSerial sp = new RxtxSerial(); // シリアルポートオープン int devStatus = sp.openComm(SERIAL_PORT, true); //シリアル通信パラメータのセット sp.setCommMode(BAUDRATE, DATABITS_8, STOPBITS_1, PARITY_NONE); //シリアルライブラリに自インスタンスを渡して受信待ち開始 sp.setOnSerialListener(this); : } //バーコードが読み取ったコード受信用メソッド main_activity.xmlで定義されたレイア @Override ウト マスタ タイトルの書式設定 public void onReceive(String id) { //idの値により、画面に表示するコンテンツを選択、表示 } This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-299
  • 301. 参 考 コード概要(RxtxSerial.java) RxtxSerial.javaは実際にネイティブライブラリを呼び出しり、Androidアプリケーションの画面 とのやりとりを 行うインタフェースの実装も行っています // イベントリスナーの登録関数 public void setOnSerialListener(OnSerialListener serialListener) { this.mSerialListener = serialListener; setListener(this); //MainActivityのインスタンスを保持しておく //ネイティブに自身のインスタンスを渡す マスタ タイトルの書式設定 // MainActivityとやりとりをするためのハンドラを生成 mHandler = new Handler() { public void handleMessage(Message msg) { // ハンドラでUIに読み取りコードの値を渡す mSerialListener.onReceive((Integer) msg.obj); : またネイティブからコールバックされるメソッドが実装されています // JNIからコールされるコールバック関数 protected static void callBackFromJNI(String code) { Message msg = new Message(); msg.obj = code; mHandler.sendMessage(msg); // 読み取りコードの値をハンドラに渡す } This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-300 300
  • 302. 参 考 コード概要(serial-barcode.c) Serial-barcode.cはJavaから呼ばれるJNI関数を実装しています ネイティブログの出力 #include "logdebug.h" //ログ出力例 LOGD_IF(debug, "JNI: +setListener"); LOGD_IF( debug, "JNI: openPort: Device Open...: %s", port); マスタ タイトルの書式設定 デバイスファイルのオープン #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> static int fd = 0; JNIEXPORT jint JNICALL Java_jp_oesf_ensyu_RxtxSerial_openComm ( JNIEnv *env, jobject obj, jstring dev, jboolean debug_flag) { // シリアルのオープン(読み取り専用)してファイルディスクリプタを受け取る fd = open(port, O_RDONLY); : This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-301 301
  • 303. 参 考 本実習のネイティブコード概要解説 シリアル通信用パラメータの設定 #include <termios.h> struct termios oldtio, newtio; /* 通信設定構造体 */ JNIEXPORT jboolean JNICALL Java_jp_oesf_ensyu_RxtxSerial_setCommParams( JNIEnv *env, jobject obj, jint baudrate, jint databits, jint stopbits,jint parity){ //制御モード(シリアル通信の制御全般の設定) newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD; //入力モード(入力された文字に対して行う設定) newtio.c_iflag = IGNPAR | ICRNL; //出力モード(出力する文字jに対して行う処理) newtio.c_oflag = 0; //ローカルモード(通信先に影響のない設定) newtio.c_lflag = ICANON; newtio.c_cc[VMIN] = 1; newtio.c_cc[VTIME] = 0; マスタ タイトルの書式設定 cfmakeraw(&newtio); cfsetospeed(&newtio, BAUDRATE); cfsetispeed(&newtio, BAUDRATE); /* 設定上書き(即座に) */ tcflush(fd, TCIFLUSH); tcsetattr(fd, TCSANOW, &newtio); This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-302 302
  • 304. 参 考 本実習のネイティブコード概要解説 Javaへのコールバックメソッドのmid取得とデータ受信用スレッド生成 #include <pthread.h> void *readThread(void *arg); /* シリアル入力データ受信用のスレッド */ jmethodID mid; jclass mClass; jobject mObject; マスタ タイトルの書式設定 JNIEXPORT void JNICALL Java_jp_oesf_ensyu_RxtxSerial_setListener ( JNIEnv *env, jclass clazz, jobject obj) { : //JavaへのコールバックメソッドIDの取得 jclass claz = (*env)->GetObjectClass(env, obj); mClass = (jclass) (*env)->NewGlobalRef(env, claz); mObject = (*env)->NewGlobalRef(env, obj);//グローバル参照取得 mid = (*env)->GetStaticMethodID(env, clazz, "callBackFromJNI", "(I)V"); : // バーコードからの信号受信待ちのスレッドを生成 pthread_t thread_; int status = pthread_create(&thread_, NULL, readThread, NULL); : This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-303 303
  • 305. 参 考 本実習のネイティブコード概要解説 データ受信用スレッド void *readThread(void *arg) { : //JavaにコールバックするためにJavaVMのJNIEnvを取得してこのスレッドにアタッチさせる status = (*gJavaVM)->AttachCurrentThread(gJavaVM, &env, NULL); : // 受信データ入力待ちの間ループ while (!STOP) { res = read(fd, &c, 1); : switch((unsigned char)c){ case 0x0C: //データの始まり break; case 0x0D: //データの終わり *pos = '0'; //文字列をjstringにする jstring result = (*env)->NewStringUTF(env, buf); //Androidアプリの画面に読み取った文字列をコールバックする (*env)->CallStaticVoidMethod(env, mClass, mid, result); pos = buf; break; default: if((pos - buf) < size){ *pos++ = c; } break; マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-304 304
  • 306. 参 考 readThread(void)の処理 シリアル通信 マネージャ ③JavaメソッドにString型でコールバック マスタ タイトルの書式設定 JNI シリアル インタフェース ライブラリ /dev/ttyUSB0 有効なコードか判定 Buf[1024] 41 ②開始”0C”受信後から 終了”0D”受信までの バイトデータをバッファに詰め込む 9 2 1 ・・・ ①バーコードリーダから1byteずつデータを 受信 USBシリアル ドライバ This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-305 305
  • 307. 参 考 本実習のネイティブコード概要解説 デバイス切断 JNIEXPORT void JNICALL Java_jp_oesf_ensyu_RxtxSerial_closeComm (JNIEnv *env, jobject obj) { : // グローバル参照を削除 if (mObject != NULL) { (*env)->DeleteGlobalRef(env, mObject); } mObject = NULL; // 強制中断のためにSIGINTを送信 raise(SIGINT); // 保管しておいた設定を元に戻す ioctl(fd, TCSETS, &oldtio); // シリアルデバイスのクローズ close(fd); // readThreadからデタッチ if (isAttached) { (*gJavaVM)->DetachCurrentThread(gJavaVM); LOGD_IF(debug, "JNI: DetachCurrentThread DONE"); } : マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-306 306
  • 308. 実 習 NDKアプリ「BarcordReader」のビルド プロジェクト名を選択して右ク リック マスタ タイトルの書式設定 「Build Project」実行 「Build が成功すると「libs」配下に ライブラリが作成される 同時にAndroidアプリケーションの実 行ファイルであるapkも作成される This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-307
  • 309. 実 習 「BarcordReader」のアプリケーション 動作確認準備 ホストPCのシェルからadbサーバを起動してarmadillo-440とadb接続する [host_pc~] > adb␣kill-server [host_pc~] > adb␣start-server * daemon not running. starting it now on port 5037 * * daemon started successfully * [host_pc~] > adb␣devices List of devices attached emulator-5554 device マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-308 308
  • 310. 実 習 NDKアプリ「BarcordReader」の インストール Eclipseのメニューボタン(実 行) マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-309
  • 311. 実 習 NDKアプリ「BarcordReader」の インストール 適当に名前をつける マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-310
  • 312. 実 習 NDKアプリ「BarcordReader」の インストール・実行 実機選択 マスタ タイトルの書式設定 Armadillo-440上で起動した「BarcodeReader」 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-311 311
  • 313. 実 習 動作確認 ①バーコードリーダー アプリ起動 シリアル Armadillo-440 ACアダプタクロスケーブル ( Android 2.2) 給電用USB 開発用PC マスタ タイトルの書式設定 バーコードリー USB-RS232C 変換ケーブル ダー USB RS232C LANケーブル ③書籍情報表示 ②書籍バーコード をタッチ! This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-312 312
  • 314. 余力のある人向け デバッグ Logcatを見る DDMSを見る Eclipseのデバッガを使用してJavaのコード内のトレー スをする gdbでネイティブコードのステップ実行を行う Trace Viewを使ってみる マスタ タイトルの書式設定 Androidの応用 画面のデザインを変えてみる 実際に読み込んだJANコードの商品名を取得できるよう なWebサービス(楽天など)と連携してみる This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-313 313
  • 315. まとめ 以上でプラットフォーム編の研修は終了です。 お疲れ様でした。 AndroidはベースはLinuxだから移植も組み込みも簡単と思われがちですが、 意外とAndroidに特化したところも多いので、今回学んだことも含めて、 再度ソースコードのトレースなどで各機能を理解することをお勧めします。 マスタ タイトルの書式設定 Androidの開発を行うには、今までの下回りの知識だけではなく、Javaの知 識や JNIの知識もとても重要です。 この研修を機に、新たな領域におけるスキルを身につけましょう。 他にも様々なハードウェアデバイスをAndroidが動作しているArmadillo440 に組み込んで、新しいサービス、新しいアプリケーションを考えてみませ んか? This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-314 314
  • 316. メモ マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-315 315
  • 317. 参考資料 マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-316 316
  • 318. 参 考 アプリケーション開発環境事前確認 JDK6はインストールされているか? $ java –versionで確認しましょう × java version "1.5.0_19" Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_19-b02) Java HotSpot(TM) Client VM (build 1.5.0_19-b02, mixed mode, sharing) マスタ タイトルの書式設定 java version "1.6.0_26" Java(TM) SE Runtime Environment (build 1.6.0_26-b03) Java HotSpot(TM) Client VM (build 20.1-b02, mixed mode, sharing) No!(Javaそのものがない)→JDK6をインストールしま しょう Oracleのサイトから「jdk-6u43-linux-i586.bin」をダウンロード してテキストに あるJDK5のインストール方法と同様にインストールしましょう。 http://www.oracle.com/technetwork/java/javase/downloads/jdk 6downloads-1902814.htmlis licensed under the Creative Commons 5-317 This material Copyright 2009-2012, Open Embedded Software Foundation, All rights reserved License BY-NC-SA 4.0. 317
  • 319. 参 考 アプリケーション開発環境事前確認 -No!(バージョンが1.5)→使用するJDKを6に変更 下記コマンドで変更します $ sudo␣update-alternatives␣--config␣java マスタ タイトルの書式設定 There are 2 choices for the alternative java (providing /usr/bin/java). 選択肢 パス 優先度 状態 -----------------------------------------------------------0 /usr/lib/jvm/java-6-sun/jre/bin/java 63 自動モード * 1 /usr/lib/jvm/java-1.5.0-sun/jre/bin/java 53 動モード 2 /usr/lib/jvm/java-6-sun/jre/bin/java 63 手動モード 現在の選択 [*] を保持するには Enter、さもなければ選択肢の番号の 5-318 This under the Creative キーを押してください: 0material is licensed BY-NC-SA 4.0. Commons License 手 318
  • 320. 参 考 アプリケーション開発環境事前確認 AndroidSDKがインストールされている? $ ls ~/android/android-sdk-linux No!→4章の手順を参考にインストールしましょう AndroidNDKがインストールされている? $ ls ~/android/android-ndk-r8b No!→6章の手順を参考にインストールしましょう マスタ タイトルの書式設定 Eclipseがインストールされている? $ ls ~/eclipse(indigo) No!→6章の手順を参考にインストールしましょう ADTがEclipseにインストールされている? Eclipseを起動してavd manager ボタンやddmsなどがあることを確 認 Android Native Developemt Toolsがあることも確認 No!→6章の手順を参考にインストールしましょう This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-319 319
  • 321. 参 考 アプリケーション開発環境事前確認 EclipseにAndroidのSDKのロケーションが設定されてい る? Eclipse>Window>Preferences>Android No!→ SDK LocationにSDKのパスを設定しましょう マスタ タイトルの書式設定 EclipseにAndroidのNDKのロケーションが設定されてい る? Eclipse>Window>Preferences>Android>NDK No!→NDK LocationにNDKのパスを設定しましょう Eclipseの各種設定は終わっているか? プロジェクトのテキストエンコードがutf8、Javaのコンパイラが 1.6になっているか確認 No!→Eclipseの環境設定ダイアログで設定しましょう Android2.2のプラットフォームがインストールされてい る? Android SDK ManagerでAndroid2.2(API8)のSDK Platformが 5-320 This material is licensed under the Creative Commons License BY-NC-SA 4.0. installedになっているか確認 320
  • 322. 参 考 アプリケーション開発環境事前確認 ローカルのシェル設定ファイルに環境変数が登録されてい る? $ cd | less .bashrc で確認 • export tools • export • export • export PATH=${PATH}:~/android/android-sdk-linux/platform- マスタ タイトルの書式設定 PATH=${PATH}:~/android/android-sdk-linux/tools ADBHOST=192.168.1.11 PATH=${PATH}:~/android/android-ndk-r8b This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-321 321
  • 323. 参 考 ライセンス GPL(GNU General Public License ) GNUプロジェクトで開発されたソフトウェアや、その派生物を使用した際はソフトウェアはソー スコードの公開が原則とされている ソースコードの著作権は永久に伝播する LGPL(GNU Lesser General Public License ) GPLをベースとしているが、LGPLの元で公開されたソースを利用したソフトウェアを開発しても 、その独自開発部分のソースコードの公開を強制しない LGPLの元で公開されたソースコードを改変して利用した場合には、その部分のソースコードは 公開しなければならないとされている マスタ タイトルの書式設定 BSD(Berkeley Software Distribution License) 「無保証」であることの明記と著作権およびライセンス条文自身の表示を再頒布の条件とする ライセンス規定。 この条件さえ満たせば、BSDライセンスのソースコードを複製・改変して作成したオブジェクト コードを、ソースコードを公開せずに頒布できる。 著作権表示、ライセンス条文、無保証の旨の三点をドキュメント等に記載さえしておけば、BSD ライセンスのソースコードを他のプログラムに組み込み、しかも組み込み後のソースコード を非公開にできる。 apache 2.0 ユーザーがそのソフトウェアの使用/頒布/修正、派生版の頒布をすることを制限しない。 要求するのは、ユーザーがそのソフトウェアに Apache License のコードが使われていること を知らせる文言を入れることだけである。 ライセンスされたファイルそれぞれに元々ある著作権と特許権の記述はそのまま保持されなけ ればならず、何らかの修正が施されている場合は、その旨を追加記述しなければならない。 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-322 322
  • 324. 参 考 Proxy環境での各種設定(1) EclipseのADT Pluginインストール/アップデートに失敗する場合 ① http://developer.android.com/intl/ja/sdk/eclipse-adt.htmlから ADT-x.x.x.zipをDLする ② 「Help」→「Install New Software」→「Add」siteダイアログで Archiveを選択し①のzipファイルを指定する ③ 「Next」でインストールを開始する マスタ タイトルの書式設定 EclipseのADT PluginにてSDK Componentのインストールに失敗する場合 ① 「AndroidSDKのインストール先android-sdk-linuxtoolsandroid」を実 行 ② 「tools⇒Options」でSettingsダイアログを開きProxyサーバ情報を入力 し、Miscにある項目にチェックをいれる ③ EclipseのADTPluginにてリトライ This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-323 323
  • 325. 参 考 Proxy環境での各種設定(2) アップデートマネージャ使用時やapt-getコマンドでパッケ ージを取得する場合 /etc/apt/apt-confにproxy設定を記述 Acquire::ftp::proxy "ftp://username:password@your.proxy.address:8080/"; Acquire::http::proxy "http://username:password@your.proxy.address:8080/"; Acquire::https::proxy "https://username:password@your.proxy.address:8080/"; マスタ タイトルの書式設定 Curlツールでrepoを取得する際のproxy認証のオプション $ curl -U username:password -x your.proxy.adress:8080 gitのポート開放:TCP9418 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-324 324
  • 326. 参 考 init.rcのAction解説 <trigger> の種類 init.rc boot propname=value on <trigger> <command> <command> : SERVICE部 プロパティ(propname)に値(value)が設 定されたときに発生するトリガー device-added(またはremoove)-<path> ACTION部 Initが起動したときに発生するトリガー デバイスノードが追加または削除された ときに発生するトリガー マスタ タイトルの書式設定 service-exited-<name> サービスが終了したときに発生するトリ ガー <command> の種類 class_start <class name> class_stop <class name> import <path> <class name>に属するserviceの startまたはstopを一括指定 pathでされた*.rcファイルをパ ース Exec <path> [<argument>]* Forkして<path>で指定したプログラムを実行( 非推奨) export <name> <value> グローバル環境変数設定 ifup <interface> Interfaceをオンラインに hostname <name> ホスト名設定 insmod <path> モジュールを<path>にインスト ール copy <from path> <to path> ファイルコピー trigger <target define> target defineに指定したトリガーを実施 setprop <name> <value> nameのプロパティにvalueを設定 する chdir <directry> 作業ディレクトリ変更 chmod <octal-mode> <path> パーミッション付与 chown <owner> <group> <path> ファイルのオーナーとグループ の変更 chroot <directry> プロセスのルートディレクトリ変更 loglevel <level> 3=ERROR, 5=NOTICE, 6=INFO デバイスファイル登録指定 sourceは”/dev/hoge” や“/dev/fuga* “のよ <permission> <uid> <gid> 5-325 This material is licensed under the Creative Commonsうに書く device <source> License BY-NC-SA 4.0. 325
  • 327. 参 考 init.rcのService解説 init.rc ACTION部 : SERVICE部 service <service> <path> [argument]* [option] マスタ タイトルの書式設定 <option> <option> : <option> の種類 capability class oneshot onresta rt console サービスが再起動したときにコマンドを 実行 setenv クラス名付与 サービスが終了した際に再起動しない プロセス起動時に環境変数に値付与 critical 4分間に4回以上終了してしま った場合リカバリーモードで起 動 socket disabled 自動起動不可。明示的に起動 user keycodes Rootではなく指定のuserアカウントでサ ービスを実行 Ioprio This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-326 326
  • 328. 参 考 init.rcのService解説 <service> の種類 サービス名 機能 ファイルシステム ソースコード console Console /system/bin/sh adbd Android Debug Bridge Daemon /system/adbd servicemanager Binder Context Manager /system/bin/servicemanager vold Volume Manager /system/bin/vold system/vold Netlink Manager /system/bin/netd system/netd debuggerd Debugger Daemon /system/bin/debuggerd system/core/debuggerd ril-daemon Radio Interface Layer Daemon /system/bin/rild hardware/ril/rild zygote Zygote /system/bin/app_process frameworks/base/cmds/app_ process media Media Server /system/bin/mediaserver frameworks/base/media/med iaserver netd system/core/adb frameworks/base/cmds/serv icemanager マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-327 327
  • 329. 参 考 ソースコード詳細(external) external 外部プロジェクトは外部のオープンソースプロジェクトから移植されたコードです 携帯端末搭載用のモジュールと開発環境で使用するモジュールが含まれてます Apache提供のhttpアクセスライブラ リ embunit Android STLライブラリ(標準 C++STLの最適化版) emma 3Dグラフィックス用プラットフォー ム Bisonパーサ esd サウンドデーモン blktrace ブロックIOトレースライブラリ expat XMLパーサ bluetooth Bluetoothプロトコルスタック fdlibm 算術演算ライブラリ bsdiff バイナリファイルのパッチ生成 freetype フォント関連ライブラリ bzip2 データ圧縮アルゴリズム fsck_msdos fatファイルシステムのチェッカー clearsilver C言語によるテンプレートエンジン genext2fs ext2ファイルシステムイメージ作成 dbus プロセス間通信(IPC)ライブラリ giflib GIF画像操作ライブラリ dhcpcd DHCPプロトコルデーモン grub ブートローダー dnsmasq 簡易DNSキャッシュサーバプログラ ム gtest google-testテストフレームワーク dropbear SSH2用サーバとクライアント guava googleのjava1.6向けコアライブラ リ e2fsprogs ext2,3,4のメンテナンスユーティリ ティ icu4c 国際化ライブラリ apache-http astl bison easymock 組込C言語向けテストユニットフレ ームワーク マスタ タイトルの書式設定 ユニットテストツール パケットのルーティングテーブル操 5-328 This material is licensediproute2 under the Creative Commons 作 License BY-NC-SA 4.0. 328
  • 330. 参 考 ソースコード詳細(external) external jdiff javadocの差分ツール jhead jpegのExif情報操作ツール jpeg 静止画像圧縮方式 jsr305 アノテーション標準セット junit kernelheaders libffi oprofile システム全体のプロファイリングツ ール ping ppp PPPプロトコルデーモン proguard javaクラスファイル難読化ツール qemu Androidエミュレータプログラム quake quakeエンジン safe-iop 整数(int)のオーバーフロー抑止 skia グラフィックエンジン sonivox midi再生エンジン speex VoIPの音声圧縮コーデック sqlite データベースライブラリ srec 音声認識エンジン マスタ タイトルの書式設定 javaのユニットテストツール Linux kernelのヘッダファイル 低レイヤ用の外部関数インタフェース ライブラリ libpcap ユーザレベルパケットキャプチャ libpng PNG画像解析用ライブラリ libxml2 XMLパーサ mtpd メディア転送プロトコル netcat ネットワーク通信ユーティリティ netperf ネットワークパフォーマンス計測ユー ティリティ stlport 標準STLにはないハッシュ、単方向 リスト、ロープクラスなどを含む STL neven 画像処理ライブラリ strace システムコールのトレースツール This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-329 329
  • 331. 参 考 ソースコード詳細(external) external svox text to speechサポートツール tagsoup XMLのSAXパーサ tcpdump パケットモニタリングツール tinyxml C++言語用XMLパーサ tremolo v8 マスタ タイトルの書式設定 オーディオデコーダ javascriptレンダリングエンジ ン webkit Webブラウザエンジン wpa_supplicant 無線LANプロトコル用ライブラリ wpa_supplicant_6 WPS2対応無線LANクライアントラ イブラリ xmlwriter xmlの書き出し用ライブラリ yaffs2 フラッシュメモリファイルシス テム zlib 圧縮アルゴリズムライブラリ This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-330 330
  • 332. 参 考 JNIメソッドを一括登録する Javaでネイティブ定義されたメソッドをJNIで認識させるためには メソッドの命名規則を守って手動で記述したり、javahコマンドを 使って自動でヘッダファイルを作成する方法がありますが、メ ソッド名が長く可読性が低くなります。 package com.sample.hellojni; public class HelloJni { static { System.loadLibrary(“hellojni"); } マスタ タイトルの書式設定 public native int openComm(String str, boolean debug); public native void closeComm(); public native int getBaudrate(); public native boolean setParams(int i, int j, int k , int n); public native int commWrite(byte b[], int off, int len); public static native void setObject(new SomeObject()); public static native void stopTread(); 定義されたネイティブメ ソッドが多くなるにつれ て、JNI側のコードが見難 くなるので、JNI側のコー ドを見やすくするための 工夫が必要 メソッドを一括登録でき るようにする } This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-331 331
  • 333. 参 考 JNIメソッドを一括登録する AOSPから取得したソースコードにある「jniRegisterNativeMethods」を 自分の NDKのプロジェクトで流用します。 dalvik/libnativehelper/include/nativehelper/JNIHelp.h dalvik/libnativehelper/JNIHelp.c マスタ タイトルの書式設定 以下の2つのファイルを用意す る <アプリのプロジェクト >/jni/hellojni.h <アプリのプロジェクト >/jni/hellojni.c This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-332 332
  • 334. 参 考 JNIメソッドを一括登録する hellojni.h #include <jni.h> #ifndef _hellojni_h #define _hellojni_h #ifdef __cplusplus extern "C" { #endif jint openComm(JNIEnv *, jobject, jstring, jboolean); void closeComm(JNIEnv *, jobject); jint getBaudrate(JNIEnv *, jobject); jboolean setCommParams(JNIEnv *, jobject, jint, jint, jint, jint); jint commWrite(JNIEnv *, jobject, jbyteArray, jint, jint); static void setListener(JNIEnv *, jclass, jobject); static void stopThread(JNIEnv *, jclass); #ifdef __cplusplus } #endif #endif マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-333 333
  • 335. 参 考 JNIメソッドを一括登録する hellojni.c #include <jni.h> #include "jniserial.h“ ヘッダのinclude 呼び出しもとのJavaのパッケー ジ名 マスタ タイトルの書式設定 static JNINativeMethod methods[] = { static const char *classPathName = "com/sample/hellojni/HelloJni"; { "openComm","(Ljava/lang/Object;)Ljava/lang/Integer;",(void*)openComm }, { "closeComm", "(Ljava/lang/Object;)V",(void*)closeComm }, { "getBaudrate", "(Ljava/lang/Object;)Ljava/lang/Integer;",(void*)getBaudrate }, { "setCommParams", "(Ljava/lang/Object;)Ljava/lang/Boolean;",(void*)setCommParams }, { "commWrite", "(Ljava/lang/Object;)Ljava/lang/Integer;",(void*)commWrite }, { "stopThread", "(Ljava/lang/Object;)V",(void*)stopReadThread }, メソッド名と { "setListener", "(Ljava/lang/Object;)V",(void*)setListener } メソッドのシグネ }; チャ This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-334 334
  • 336. 参 考 JNIメソッドを一括登録する hellojni.c int registerNatives(JNIEnv* env) { if (!registerNativeMethods(env, classPathName, methods, sizeof(methods)/ sizeof(methods[0]))) return JNI_FALSE; 登録するメソッドの数を算出し return JNI_TRUE; registerNativeMethods実行 } || int registerNativeMethods(JNIEnv* env, const char*JNIHelp.h にて定義されてます className, JNINativeMethod* gMethods, int numMethods) { マスタ タイトルの書式設定 jclass clazz; clazz = (*env)->FindClass(env, className); if (clazz == NULL) { LOGD_IF(debug, "Native registration unable to find class '%s'", className); return JNI_FALSE; } if ((*env)->RegisterNatives(env, clazz, gMethods, numMethods) < 0) { LOGD_IF(debug, "RegisterNatives failed for '%s'", className); return JNI_FALSE; } return JNI_TRUE; } This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-335 335
  • 337. 参 考 JNIメソッドを一括登録する hellojni.c jint JNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv *env; if ((*vm)->GetEnv(gJavaVM, (void**) &env, JNI_VERSION_1_6) != JNI_OK) { return -1; //error } if (registerNatives(env) != JNI_TRUE) { return 0; //error } return JNI_VERSION_1_6; } static void setListener(JNIEnv *env, jclass clazz, jobject obj) { 通常のC/C++の //このメソッドの具体的な処理 メソッド定義の return; ように } メソッド名を短 jint openComm(JNIEnv *env, jobject obj, jstring dev, jboolean debug_flag) { 縮できる //このメソッドの具体的な処理 return 1; } マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-336 336
  • 338. 参 考 Android用ドライバモジュール作成と組み込み方法 【環境】 開発用PCのLinuxシェル ①カーネルコンフィグの設定を変更 該当のモジュール設定値を「M」にする *「7章デバイスを組み込んだカーネルの作成」を参照 ②カーネルをmakeしてカーネルモジュール作成(hoge.ko) マスタ タイトルの書式設定 [host_pc~] > cd $ANDROID/linux-2.6.26-at-android [host_pc~] > make ARCH=arm CROSS_COMPILE=$ANDROID/prebuilt/linuxx86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- modules *hoge.koができている場所(hoge.koがUSBシリアルデバイスだった場合) Linuxカーネルのルート/drivers/usb/serial/hoge.ko ③Androidのルートファイルシステムの/data配下に②で作成したモジュールを配 置 ④ Androidのルートファイルシステムの/etc配下にinstall_driver.shを作成して 実行権限を付与 ($ chmod 777 /etc/install_driver.sh) ③init.rcを変更してsample.shを起動時にサービスして起動させる 5-337 This material is licensed under the Creative Commons * 「5章ドライバのモジュールを組み込む」を参照 License BY-NC-SA 4.0. 337
  • 339. 参 考 Android用ドライバモジュール作成と組み込み方法 /init.rc #追加 service install_driver /etc/install_driver.sh oneshot マスタ タイトルの書式設定 /etc/install_driver.s h #!/system/bin/bash insmod /data/hoge.ko sleep 20 chmod 666 /dev/hoge0 /system/bin/cmd_server exit 1 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-338 338
  • 340. メモ マスタ タイトルの書式設定 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-339 339
  • 341. マスタ タイトルの書式設定 本ドキュメントは下記が作成・提供しております。 株式会社OKIソフトウェア http://www.oki-osk.jp 株式会社リーディング・エッジ社 http://www.leadinge.co.jp// This material is licensed under the Creative Commons License BY-NC-SA 4.0. 5-340