Successfully reported this slideshow.
Your SlideShare is downloading. ×

Android カスタムROMの作り方

More Related Content

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

Android カスタムROMの作り方

  1. 1. techbooster.org 日高正博 1
  2. 2.  組込エンジニアです?  Androidとか  関西が生息圏です  techbooster.org みてね Twitter Account @mhidaka 2
  3. 3.  Android ADK 組込み プログラミング完全ガイド  執筆しました! 発売中です  電子工作、クラウド連携 がAndroidで出来るよう になりました 3
  4. 4. Androidをカスタマイズ? VPSでビルドしてみよう ほしいAndroidを作ろう 4
  5. 5. カスタムROMの紹介 5
  6. 6.  AOSPが提供するソースコードがベース ◦ 通知バーへのWiFiトグル追加などオリジナル機能を提供 ◦ コミュニティが主体となって開発 6
  7. 7. Android Open Source Project(AOSP)が管理 • コントリビュータ、メーカーエンジニアが改善を提案したり、Forkして 自社製品開発したり。 Google Inner Android Open Source Project コントリビューター Fork メーカー, CustomROM Developer 7
  8. 8.  Androidの利点を生かしたまま機能を追加 ◦ システムレベルのメニュー追加、テーマチェンジ ◦ 自分の思うAndroidが作れます! 8
  9. 9. SIMは差さないでください •電波法に触れる可能性が高いです アプリに注意 •Google Mobile Serviceのようなプロプライエタリなアプリケーションの利用 に注意してください。 •変なところからダウンロードしちゃだめです。カスタムROMを使う端末にもと もと入っているアプリを利用を推奨 キャリアやメーカー独自の機能は使えなくなるよ •そもそも保証が無くなるので自己責任のもと実施しましょう 9
  10. 10. カスタマイズしやすい機種 • Galaxy Nexus / Nexus S / Nexus One など。 (Googleリファレンス機。おすすめは Galaxy Nexus) メリット • 場合によってはメーカー製Androidよりも安定。追加機能も。 • CyangenModはOSのアップデーターを標準化 • JCROMならシステムレベルのテーマ設定 デメリット • 著作権など法令には注意してね。 目的と異なってダーティなイメージがつくのは良くないです。 10
  11. 11. VPS編 11
  12. 12.  ソースコードをビルドしてAndroidの実行イメージを作 成する手順を紹介します AOSP CyanogenMod JCROM Pure Android 12
  13. 13.  ビルド環境構築の敷居が異様に高い・・・ パフォーマンス ネットワーク Linux OS • Core i7 QuadCore • ソースコードのダウン • 普通の人は使わない CPU ロードには数時間が OS 必要 • Ubuntu 12.04 • 広大なメモリ空間 16GB,24GB • 最新のAndroidソー 64bit スコードが公開される • SSD • コマンドライン… ごと。 高速ストレージが 256GBは欲しい • たまに落ちてこない そこにシビれたり 、あこがれたりできない…(´・ω・`) 13
  14. 14. 元ネタは「ようかんマン」でぐぐってね 14
  15. 15.  クラウドの仮想PCを利用することで 初期費用を抑えてビルド環境が作れる 仮想PC 自宅で構築 メンテナンスフリー 手元にあるので安心 高速ネットワーク 通信は既存でOK 手軽に構築/破棄 用途は転用可能 基本的に趣味 そもそも作るのが楽しい 15
  16. 16.  カスタムROMハッカソンでGMOさんにVPSをもらったので使ってみました。 その分割り引いて見てね  ちょっと使ってみるならAmazon EC2をおすすめ。  VPS使うのはガチ勢だけでは… • インスタンス型 • ~月額7980円 • ~月額15,880円 • 1時間0.6ドル程度 • 6CPU/8GB/800GB • 10CPU/16GB/1TB Amazon さくらインター GMO(お名 EC2 ネット 前.com) 16
  17. 17.  作業ディレクトリの準備 $ mkdir -p ~/jcrom_work $ export ANDROID_ROOT=~/jcrom_work  ソースコードのダウンロード $ cd $ANDROID_ROOT $ repo init -u https://bitbucket.org/sola/jcrom_manifest -m jcrom_jb-master.xml $ repo sync –j8 通常、数時間かかるところがVPSだと30分で終わり! ちなみにプロキシ有りネットワークだと1日かかるorz https://sites.google.com/site/jcromproject/home 17
  18. 18.  ソースコードの無いバイナリファイルのダウンロード $ wget https://dl.google.com/dl/android/aosp/broadcom-maguro- jro03h-4cc54d09.tgz $ wget https://dl.google.com/dl/android/aosp/imgtec-maguro- jro03h-827bcb4c.tgz $ wget https://dl.google.com/dl/android/aosp/invensense-maguro- jro03h-682067a4.tgz $ wget https://dl.google.com/dl/android/aosp/samsung-maguro- jro03h-0655880b.tgz $ tar zxvf broadcom-maguro-jro03h-4cc54d09.tgz $ tar zxvf imgtec-maguro-jro03h-827bcb4c.tgz $ tar zxvf invensense-maguro-jro03h-682067a4.tgz $ tar zxvf samsung-maguro-jro03h-0655880b.tgz $ ./extract-broadcom-maguro.sh $ ./extract-imgtec-maguro.sh $ ./extract-invensense-maguro.sh $ ./extract-samsung-maguro.sh https://sites.google.com/site/jcromproject/home18
  19. 19.  端末から必要なファイルを吸い出す $ cd $ANDROID_ROOT/jcrom/samsung/maguro/proprietary/ $ ./extract-files.sh  ccache の設定 設定しておくと、2回目以降のビルド時間を短縮出来る。 $ export USE_CCACHE=1 $ $ANDROID_ROOT/prebuilts/misc/linux-x86/ccache/ccache -M 50G ※Galaxy Nexusの場合、端末からデータを取り出す必要があります VPS上では出来ないので注意 https://sites.google.com/site/jcromproject/home19
  20. 20.  Androidのビルド $ cd $ANDROID_ROOT $ source build/envsetup.sh $ lunch full_maguro-userdebug $ make –j16 GMOのVPSではj16オプションを付けて、初回ビルド37分でした Xeon 8コア論理16 / 24GBマシンで25分、普通のPCなら数時間コース recovery mode で書き込む為のデータを作成する $ cd $ANDROID_ROOT $ make otapackage https://sites.google.com/site/jcromproject/home20
  21. 21. カスタムROMハッカソン編 21
  22. 22.  Androidをカスタマイズするチャレンジングなハッカソン。 そもそもビルドに数時間…ということでVPSの出番 22
  23. 23. 23
  24. 24. 大きなお友達のハートをがっちりつかむケータイがほしい AKBフォンとか。プリキュアフォンとか。ROMの入れ替えで変身できるのであれば需要があるかも? ちょっと、おちつけ。 でも機能をカスタマイズできるのは良いかもしれない。 ソフトウェアキーで機能を割り当てるとかどう? あ、いいかも。アプリごとに動きを変えるとか? 固定じゃ無くて色々変更したいし、動きを決めるのは面倒だからサジェストしたい 24
  25. 25. Android フレームワークを変更して、ボタンを追加する 単純なボタンではなく動作を決めたい サジェストできるようにボタン押下イベントが欲しい • たとえばどんな風に動きを変えたい? • Mapをみてるなら特定の場所からの一発ルート検索 • ウェブサイトを見てれば特定の言葉で検索 • YouTubeなら動画、ツイッターならハッシュタグをみるなど 25
  26. 26.  SystemUI.apk ◦ 画面全体を提供している特殊な アプリケーション  イメージ図 Application キ ー イ SystemUI ベ ン ト の 通 フレームワーク 知 26
  27. 27.  ハードウェアキー ◦ Home、Backキーなどは キーコードが割り当てられ Application ている <Serviceを追加>  ソフトウェアキー SystemUI ◦ 通知はハードウェアと違い、 独自のインテントを イベント化されている <ボタン追加> 発行する。  インテントを使うメリット アプリ側で動作を規 定できるメリット ◦ アプリ側で動作を決められ フレームワーク る。アップデートできる。入 れ替えもできる。 27
  28. 28.  SystemUI¥src¥com¥android¥systemui¥statusbar¥phone¥ PhoneStatusBar.java private View.OnClickListener mMomokuroClickListener = new View.OnClickListener() { public void onClick(View v) { Intent intent = new Intent(); intent.setAction("net.momoclo.action.SUGGEST"); v.getContext().sendBroadcast(intent); } }; カスタムキー用のonClickListnerを作成 独自の暗黙的インテントをブロードキャストする ※この場所でこの実装で正しいかはNoっぽい 28
  29. 29.  SystemUI¥src¥com¥android¥systemui¥statusbar¥phone¥ PhoneStatusBar.java private void prepareNavigationBarView() { mNavigationBarView.reorient(); mNavigationBarView.getRecentsButton() .setOnClickListener(mRecentsClickListener); mNavigationBarView.getRecentsButton() .setOnTouchListener(mRecentsPanel); mNavigationBarView.getExpandButton() .setOnClickListener(mExpandClickListener); mNavigationBarView.getMomokuroButton() .setOnClickListener(mMomokuroClickListener); mNavigationBarView.getHomeButton() .setOnTouchListener(mHomeSearchActionListener); updateSearchPanel(); } 29
  30. 30. public class WhatsTop extends BroadcastReceiver { @Override public void onReceive(Context arg0, Intent arg1) { ComponentName name = Util.getTopActivity(arg0); Intent intent = new Intent(Intent.ACTION_SEARCH); PackageManager manager = arg0.getPackageManager(); List<ResolveInfo> list = manager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); try{ for(int i = 0; i < list.size(); i++){ ResolveInfo info = list.get(i); String packageName = info.activityInfo.packageName; if(packageName.equals(name.getPackageName())){ android.util.Log.e("debug", "たいおうしています!"); intent.setComponent(name); intent.putExtra("query", "ももくろ"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); arg0.startActivity(intent); suggested = true; break; } if(!suggested){ Toast.makeText(arg0, "ももくろ関連情報はみつかりません", Toast.LENGTH_SHORT).show(); } } 30
  31. 31. ね、簡単でしょう? カスタマイズに興味を持った人はチャレンジしてください! カスタムROMハッカソンの成果は • @chun_ryo @furusin_oriver @c1e @rey_k @hamatzさんたちと 一緒にやりました! 31

×