31
techbooster.org 日高正博 1

Android カスタムROMの作り方

  • Upload
    mhidaka

  • View
    23.962

  • Download
    6

Embed Size (px)

DESCRIPTION

カスタムROMハッカソンでの成果をまとめました。 with @chun_ryo @furusin_oriver @c1e @rey_k @hamatzさん です!

Citation preview

Page 1: Android カスタムROMの作り方

techbooster.org

日高正博

1

Page 2: Android カスタムROMの作り方

組込エンジニアです? Androidとか

関西が生息圏です

techbooster.org みてね

2

Twitter Account @mhidaka

Page 3: Android カスタムROMの作り方

Android ADK 組込み プログラミング完全ガイド

執筆しました! 発売中です

電子工作、クラウド連携がAndroidで出来るようになりました

3

Page 4: Android カスタムROMの作り方

Androidをカスタマイズ?

VPSでビルドしてみよう

ほしいAndroidを作ろう

4

Page 5: Android カスタムROMの作り方

カスタムROMの紹介

5

Page 6: Android カスタムROMの作り方

AOSPが提供するソースコードがベース ◦ 通知バーへのWiFiトグル追加などオリジナル機能を提供

◦ コミュニティが主体となって開発

6

Page 7: Android カスタムROMの作り方

Android Open Source Project(AOSP)が管理

•コントリビュータ、メーカーエンジニアが改善を提案したり、Forkして

自社製品開発したり。

7

Google Inner

Android Open Source Project

コントリビューター

メーカー, CustomROM Developer

Fork

Page 8: Android カスタムROMの作り方

Androidの利点を生かしたまま機能を追加 ◦ システムレベルのメニュー追加、テーマチェンジ

◦ 自分の思うAndroidが作れます!

8

Page 9: Android カスタムROMの作り方

SIMは差さないでください

•電波法に触れる可能性が高いです

アプリに注意

•Google Mobile Serviceのようなプロプライエタリなアプリケーションの利用

に注意してください。

•変なところからダウンロードしちゃだめです。カスタムROMを使う端末にもと

もと入っているアプリを利用を推奨

キャリアやメーカー独自の機能は使えなくなるよ

•そもそも保証が無くなるので自己責任のもと実施しましょう

9

Page 10: Android カスタムROMの作り方

カスタマイズしやすい機種

•Galaxy Nexus / Nexus S / Nexus One など。

(Googleリファレンス機。おすすめは Galaxy Nexus)

メリット

•場合によってはメーカー製Androidよりも安定。追加機能も。

•CyangenModはOSのアップデーターを標準化

• JCROMならシステムレベルのテーマ設定

デメリット

•著作権など法令には注意してね。

目的と異なってダーティなイメージがつくのは良くないです。

10

Page 11: Android カスタムROMの作り方

VPS編

11

Page 12: Android カスタムROMの作り方

ソースコードをビルドしてAndroidの実行イメージを作成する手順を紹介します

12

CyanogenMod JCROM AOSP Pure Android

Page 13: Android カスタムROMの作り方

ビルド環境構築の敷居が異様に高い・・・

13

パフォーマンス

•Core i7 QuadCore

CPU

•広大なメモリ空間

16GB,24GB

•SSD

高速ストレージが

256GBは欲しい

ネットワーク

•ソースコードのダウンロードには数時間が

必要

•最新のAndroidソー

スコードが公開される

ごと。

•たまに落ちてこない

Linux OS

•普通の人は使わない

OS

•Ubuntu 12.04

64bit

•コマンドライン…

そこにシビれたり 、あこがれたりできない…(´・ω・`)

Page 14: Android カスタムROMの作り方

14

元ネタは「ようかんマン」でぐぐってね

Page 15: Android カスタムROMの作り方

クラウドの仮想PCを利用することで 初期費用を抑えてビルド環境が作れる

15

仮想PC

メンテナンスフリー

高速ネットワーク

手軽に構築/破棄

基本的に趣味

自宅で構築

手元にあるので安心

通信は既存でOK

用途は転用可能

そもそも作るのが楽しい

Page 16: Android カスタムROMの作り方

•インスタンス型

• 1時間0.6ドル程度

Amazon

EC2

•~月額7980円

• 6CPU/8GB/800GB

さくらインター

ネット

•~月額15,880円

• 10CPU/16GB/1TB

GMO(お名

前.com)

16

カスタムROMハッカソンでGMOさんにVPSをもらったので使ってみました。 その分割り引いて見てね

ちょっと使ってみるならAmazon EC2をおすすめ。 VPS使うのはガチ勢だけでは…

Page 17: Android カスタムROMの作り方

$ 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

Page 18: Android カスタムROMの作り方

ソースコードの無いバイナリファイルのダウンロード

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

Page 19: Android カスタムROMの作り方

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

Page 20: Android カスタムROMの作り方

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

Page 21: Android カスタムROMの作り方

カスタムROMハッカソン編

21

Page 22: Android カスタムROMの作り方

Androidをカスタマイズするチャレンジングなハッカソン。 そもそもビルドに数時間…ということでVPSの出番

22

Page 23: Android カスタムROMの作り方

23

Page 24: Android カスタムROMの作り方

あ、いいかも。アプリごとに動きを変えるとか?

固定じゃ無くて色々変更したいし、動きを決めるのは面倒だからサジェストしたい

ちょっと、おちつけ。

でも機能をカスタマイズできるのは良いかもしれない。 ソフトウェアキーで機能を割り当てるとかどう?

大きなお友達のハートをがっちりつかむケータイがほしい

AKBフォンとか。プリキュアフォンとか。ROMの入れ替えで変身できるのであれば需要があるかも?

24

Page 25: Android カスタムROMの作り方

Android フレームワークを変更して、ボタンを追加する

単純なボタンではなく動作を決めたい

サジェストできるようにボタン押下イベントが欲しい

•たとえばどんな風に動きを変えたい?

• Mapをみてるなら特定の場所からの一発ルート検索

•ウェブサイトを見てれば特定の言葉で検索

• YouTubeなら動画、ツイッターならハッシュタグをみるなど

25

Page 26: Android カスタムROMの作り方

SystemUI.apk

◦ 画面全体を提供している特殊なアプリケーション

イメージ図

26

フレームワーク

SystemUI

Application

キーイベントの通知

Page 27: Android カスタムROMの作り方

ハードウェアキー ◦ Home、Backキーなどは

キーコードが割り当てられている

ソフトウェアキー

◦ 通知はハードウェアと違い、イベント化されている

インテントを使うメリット

◦ アプリ側で動作を決められる。アップデートできる。入れ替えもできる。

27

フレームワーク

SystemUI

<ボタン追加>

Application

<Serviceを追加>

独自のインテントを発行する。

アプリ側で動作を規定できるメリット

Page 28: Android カスタムROMの作り方

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っぽい

Page 29: Android カスタムROMの作り方

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(); }

Page 30: Android カスタムROMの作り方

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(); } }

Page 31: Android カスタムROMの作り方

ね、簡単でしょう?

カスタマイズに興味を持った人はチャレンジしてください!

カスタムROMハッカソンの成果は

• @chun_ryo @furusin_oriver @c1e @rey_k @hamatzさんたちと

一緒にやりました!

31