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