android カスタムromの作り方

Post on 05-Dec-2014

23.962 Views

Category:

Technology

6 Downloads

Preview:

Click to see full reader

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

top related