ラベル 所感 の投稿を表示しています。 すべての投稿を表示
ラベル 所感 の投稿を表示しています。 すべての投稿を表示

Xperiaのオープンソース開発におけるカメラ問題

19:05 6

Xperia向けのCM13で一番難航しているのがカメラ機能であることは前の記事で触れましたが、Cyanogenmodのnightly公式配信が中々始まらないのもこのためです。

そのうち改善されていくのでしょうが、実はXperiaのカスタムROMにおけるカメラ問題は根が深く、これをまとめている記事も見かけないので一度整理しておこうと思います。


自社技術保護に熱心なSoMC

SonyがXperiaのカメラ性能に自信を持っていることはプロモーションを見てもよく分かりますが、Sonyは技術保護のためにカメラ機能に端末固有のDRMキーを要求するようにしています。スマートフォンメーカーの中では一眼レフやミラーレス機も真面目に作っているだけあって、(実際に現像された写真の見栄えが良いかは別として、)暗所性能や色のりは評価できると思いますが、そういう画像処理(BIONZ for mobile)を担当するバイナリやライブラリを他端末に移植して外部から呼び出されないようにするための処置ですね。




この動きはZ1世代のRhineプラットフォームから起こっていて、当時はカスタムROMを焼くためにブートローダーをアンロックしたらカメラが使えなくなったと散々ユーザーからSoMCの公式フォーラムに文句が出ました。
具体的な症状は、プレビューまではできるがフォーカスしようとするとカメラが落ちるというもので、Z1のグローバルモデルの4.2.2でこの問題が起こっていました。さすがに不評だったためかZ1が4.3にアップグレードされたときに、カメラにDRMキーを要求しないようにSoMCが仕様を変更したのですが、4.4以降ではこの仕様が元に戻されています。

この部分の処理はエラーログを追うとよく分かります。

DRMキーをTAパーティションから取得するCredentialManagerが(ここではソケットの作成で)エラーを起こす
E/CredMgrDinLib(1676): SendAndReceive socket failed
E/CredMgrDinLib(1676): SendAndReceive() ended. result 1 - CREDMGR_RESULT_GENERIC_ERROR

CredentialManagerとカメラをつなぐcacaoプロセスが、DRMキーを受け取れないためにchokoballの作成に失敗する
E/cacao(1676): 1137370710 cacao_chokoball.cpp               (3704) 12370 E [CKB] ckb preCompile fail. keymgr credmgr generic error.
W/cacao(1676): 1137370745 cacao_chokoball.cpp               (3713) 12370 W [CKB] Post process preLoad(0xffffff91)
E/cacao(1676): 1134871177 cacao_chokoball.cpp                (852) 12373 E [CKB] ckb create fail.
E/cacao(1676): 1134871243 cacao_chokoball.cpp                (893) 12373 E [CKB] ckb is not ready.

cacaoプロセスが開始できないので、カメラ機能を司るcaladbolgがフォーカス時にエラーを吐く
E/caladbolg(1676): 1134871299 excal_focus_detector.cpp           (177) 12372 E [EXC] [FocusDetector  ] Cacao start Fail <ffffff90>
E/caladbolg(1676): 1134953273 excal_idt_ctrl.cpp                 (688) 12371 E [EXC] [IdtCtrl        ] Received error event from FocusDetector
E/caladbolg(1676): 1134953307 excal_idt_ctrl.cpp                 (692) 12371 E [EXC] [IdtCtrl        ] Call returnBuffer for HwFocusStats 0xb7b54c98
カカオやらチョコボールやらカラドボルグやらSoMCの開発者はプロセスのネーミングがかわいいですね。


オープンソース開発における問題

SoMCが技術保護に熱心なのは分かりましたが、こうなると困るのはカスタムROMを作成する一般開発者です。
カスタムROMを焼くためにブートローダーをアンロックする以上、DRMキーは失われて使い物にならないカメラが残ります。この仕様はZ2、Z3のShinanoプラットフォームにも引き継がれたので、長らくCMのメンテナの間で問題になっていました。

CM12.1までは、その場しのぎの処置として、DRMキーが要求されないZ1のプロプライエタリバイナリとそれに合うようにカーネルを変更してカメラが使えるように工夫されていましたが、CM13でカメラ起動に求められる関数が大きく変更されると、4.3のバイナリでは対応できなくなり、問題が表面化したというわけです。

今のところ、CMのメンテナとしては、どのみちカーネルバージョンを3.10に上げれば、3.4カーネル向けのバイナリとカーネルの変更は使えなくなるので、いっそのこと小手先のハックはやめて、SoMCが開発中の3.10向けのAOSP用カメラバイナリが提供されるのを待とうという結論に達したようです。

CMのメンテナが3.10カーネルありきの方向で納得してしまうと困るのは、カーネルを変更できないLB用ROMを作っている私やZ以前のROMを作っている開発者です。私が1年半前にZ1f用のCMをビルドしたときはTAパーティションからDRMキーを読み出すDRMサービスの修正で躓いたのですが、今ならこちらは解決できるとして、カメラ起動に足りない関数を自前で用意してエラーを追い切るほどの技量はないのでどうしたものかと考えています。

XperiaはSony Ericsson時代からのオープンソース開発への積極性とSonyによる買収後の自社技術保護のクローズ性が両立しているので、なんとも煮え切らずに歯がゆい思いです。もっとも、FreeXperiaのJerpeleaが入社して以降は、先述のSonyの技術を除いたAOSP向けカメラフレームワークの開発や3.10カーネルの作成などオープンソース開発へのやる気も見せています。惜しむらくはそういった活動の恩恵を受けられるのがブートローダーをアンロックしたモデルだけということです。なかなか思うようにはいかないものです。


白黒付けがたいスマートフォンのオープンソース開発

余談ですが、XDAでは上記の技術保護の仕組みを破るmodが公開されています。しかし、Cyanogenmodの公式配信に真っ黒なクラックを載せるわけにはいかないので、アンオフィシャルビルドで使えれば良い程度の認識です。もっとも、LGの署名脆弱性を突いてカーネルに任意の有効な署名をできるようにしたOpen BumpがCM公式で採用されているところを見ると、線引きなど曖昧なものです。メーカーとしてはこういったユーザーの趣味的な開発を不正な改造行為と切って捨てることは容易いですが、コアなファンのいないビジネスは面白みに欠けるのではないかとも思いますし、白黒付けがたい問題ではあります。

<参考>
Xperia Z1、現時点ではブートローダーをアンロックするカメラが機能しなくなる、Sony Mobileが公式サイトで注意を呼びかけ | juggly.cn

BUG!Camera broken after bootloader unlock! - Support forum

[dev][cam][improvements & auto-focus dev… | Sony Xperia Z1

Change I8a63f407: msm: camera: Use Sony Rhine camera stack from 4.3 | review.cyanogenmod Code Review

Change Ic1b2696d: Use rhine 4.3 camera stack | review.cyanogenmod Code Review

Change Ie15c02cc: Remove stock camera stuff | review.cyanogenmod Code Review

Experimental AOSP camera available for experienced developers – Developer World

GitHub - sonyxperiadev/camera at aosp/LA.BF64.1.2.2_rb4.7

Official CM11/CM12 builds now possible thanks to Open Bump : LGG3

Sony credentials restore after unlocking the… | Sony Xperia Z5

hijack-ramdisk考案の経緯

10:57 6

前回の投稿でXperiaはユーザーコミュニティが小さいということを書きましたが、GXの延命で重宝しているhijack-ramdiskにしても突然考案されたわけではなく、その手法自体は他の端末で使われていたものが元になっています。

Bootstrapの手法

オリジナルを辿れば、アイデアの元はClockworkMod Recoveryの開発で有名なKoushが2010年にMotorola Droid X用に作成した"Bootstrap"でしょう。hijack-ramdiskはシェルスクリプトですが、Bootstrapはカーネルモジュール(訂正:ただのバイナリでした)として作られています。処理の内容はほとんど同じで、/systemをカスタムROMで書き換えてしまう点も同じです。

KoushのBootstrapを更に洗練させた手法が、Hashcodeの"Safestrap"です。Safestrapは単体のmodというよりはTWRPのフォークとなっていて、XZDualRecoveryのような形でシステム起動中にプロセスをフックしてリカバリを起動します。そこから内蔵ストレージ内にパーティションを作成することで擬似的なマルチブートを可能にしています。ROMの初期イメージが提供されないような復旧の難しい端末上で、/systemを書き換えることなく安全にカスタムROMを使える点が"Safe"ということなんですね。

Hashcodeは開発者として私が目指したい姿でもあります。彼はブートローダーがロックされた多くのMotorolaデバイス向けにSafestrapと専用のカスタムROMを作成していますし、近年はAmazonのKindle Fire HD/HDXにもSafestrapが使われていました。(もっともKindleはLittle Kernelブートローダーの脆弱性が見つかって以降はアンロック出来るようになりましたが)

不遇なXperia?

常々疑問に思っているのは、三星、LG、Motoなどの端末は割と堅めのセキュリティがある割に、(例えばGalaxyはカーネルモジュールも署名されていると聞きます)それを回避する手法が生み出される一方、Xperiaはブートローダーの欠陥など致命的な脆弱性が見つかってもなかなか革新的な進展がありません。これは、S1BootをはじめSomcの実装が堅牢なのか、単に解析できるだけの人材がコミュニティにいないのか、よく分からないところです。(現に私のような弱小しかhijack-ramdiskを活用していませんし、Xperiaにはもっと開発の余地があると思います。)

私もhijack-ramdiskを洗練させたいと思っているのですが、何も無いところから進展させるのは難しいですね。それこそやる気を出せばせめてHashcodeのSafestrapを移植できそうなものですが、それをする人がいないのが辛いところです。

<参考>



新年の抱負と今後の展望

10:33 2


皆様、明けましておめでとうございます。

私がXperiaを弄るようになって既に3年以上が過ぎましたが、昨年はブログも立ち上げたことですし、これからも細く長く開発を続けて行ければ良いなと思う新年の朝です。
今後の方向性を明確にする意味でも、これからの展望を書き残しておきたいと思います。

なぜ活動するのか

私がAndroid界隈の片隅で活動を続ける最大の理由は、自分の開発知識・技量を高めたいという知的欲求から来ているのですが、このブログの副次的な目標として、自分の勉強の過程でビルドされたROMをたくさん取りそろえたいというのがあります。
それも、BLアンロックできる国際版ではなく、(今のところ)自分しか提供できないであろうBLロックされた国内モデル向けのROMやModを扱った、国内Xperia向けのワンストップサービス的な老舗を目指したいと思っています。
(というのも、私よりよほど経験のある方達が三星やHTCの国内モデルを色々と扱っているのを見ると、Xperia(開発)のファンベースとコミュニティの小ささをどうにかしたいという思いも沸くからです)

不安要素

もっとも、そういう思いと同時に、ファンベースのAndroid開発もそう長くはないという感覚もあります。AOSPが洗練されてセキュリティが固められると共に、サードのメーカーも締め付けを厳しくするので、一般人が口を出す余地がどんどん無くなって自作PC熱が冷めるのと似たような気分になりますね。
そもそも、Somc自体がいつまでもつかも分からないし、最近はコアなファンをどんどん切り離して大衆化しているので、アーリーアドプターにも愛想を尽かされた味気ないコモディティになっていくのでしょう。

私自身も本業の方が忙しくなってきているので、昔のような知識不足を時間と労力で補うやり方は効かなくなってきました。私のリソースの限界やAndroid開発界隈の熱の冷め方を見るに、それほど長くはもたないような気もします。

Android(とXperia)黎明期に精力的に活動されていた方々の今を見ていると、一番輝いていた時期はさぞ楽しかっただろうと羨ましくもありますね。

今後の展望

まあ、あまり不透明な先の話をしても仕方が無いので、今は深く考えず目下の開発を楽しみたいと思います。
GXでMarshmallowに追随するのも辛くなってきましたが、次はZとZ1を順番に攻略していきます。
Z3シリーズへの要望もあることは承知していますが、やはりメインで使っている端末は開発には使いにくいのです。もう一台開発用に揃えるか、来たるS820搭載Xperiaの購入後に引退させてから、となりそうですね。もちろん、それまで私のモチベーションとXperiaのファンベースが維持されていればの話ですが。

ともかく、今しばらくは細かいことは考えずに楽しめるだけ楽しんで知識欲を満たしたいと思います。


happy new year, happy development!