カスタム ROM 内のカメラ: 開発者がソース コードなしでハードウェアを動作させる方法

click fraud protection

ソース コードがなければ、開発者はどうやってカスタム ROM で動作するカメラなどのハードウェア コンポーネントを取得するのでしょうか? 答えは、BLOB、シム、そして多くのデバッグです。

Android Oreo のリリースと、 Xiaomi Redmi Note 3, Google Nexus 5 そして 非公式に受け取っている人もいる開発者が Android オープンソース プロジェクト (AOSP) ベースの ROM を移植するときに、同じ機能 (主にカメラ) が壊れる傾向があるのはなぜだろうと不思議に思うのはおそらく当然でしょう。 XDA フォーラムの ROM スレッドで、壊れた機能の長いリストが先頭にあるのを見たことがあるでしょう。 「何が機能するか」の後に機能する機能のリストが続き、その下に象徴的な「何が機能しないのか?」が表示されます。 あなたが教えて!" この 2 つはフォーラムでよく使われるフレーズで、Reddit や Twitter などでは事実上ミームになっています。

開発者が AOSP ROM をデバイスに移植しようとするたびに、多くの機能が破損するのはなぜですか? 基本的な答えは、Android のバージョンが異なると機能が変わるため、BLOB としてパッケージ化された古いデバイス ドライバーは、新しいバージョンの Android では動作しない、あるいは標準の AOSP だけでは動作しないということです。 これを克服するために、開発者は「シム」と呼ばれるものを利用しますが、それに伴うプロセスは扱いが難しく、時間がかかり、場合によってはデバッグが非常に困難です。

この記事では、特に AOSP ベースの ROM 上でカメラを適切に動作させることに関して、シムがどのように機能するかを概説します。 例として OnePlus 3T を使用します。 これらの機能を動作させる際の難しさはデバイスに大きく依存することに注意してください。

OxygenOS を実行している OnePlus 3T。 OnePlus スマートフォンはカスタム開発が容易であることで知られていますが、AOSP の安定したポートを作成するために開発者が舞台裏で行う多くの作業があります。


シムまたは BLOB とは何ですか?

開発者が行っていることの一部を理解するには、まずいくつかのことを説明する必要があります。 Android OS はオープンソースですが (Android オープンソース プロジェクトと呼ばれるのには理由があります)、何千もの Android デバイスに搭載されているソフトウェア (カーネルを除く) はオープンソースではありません。 開発者はソースコードにアクセスできません

サムスンの体験, えむい, オキシジェンOS、または Android の他のサードパーティ製フレーバーのいずれか。

現在、ストック AOSP を Google 以外のデバイスに移植する開発者は、これらの Android スキンのソース コードを気にしないでしょう。 これらの ROM を変更および構築します。 それは、カメラを適切に動作させるために必要な部品という大きな大きな理由がなければ、それは真実でしょう。 の カメラHAL (ハードウェア抽象化層) クローズドソースも.

カメラ HAL だけでなく ROM もソースがクローズされている場合の問題は、AOSP を自分のデバイスに移植しようとしている開発者が、 盲目で働く. OEM はカメラ HAL ソースにアクセスできるため、クローズド ソースの OEM ROM はカメラ HAL と問題なく接続できます。 カメラ HAL は、ROM がカメラ ハードウェアと「通信」できるようにするもので、HAL がなければカメラは機能しません。 カメラ HAL を車のハンドルとペダルと考えてください。 ステアリング ホイール/ペダルは、内部コンポーネントを利用するための外部インターフェイス (ROM) をドライバーに提供することにより、車両の内部コンポーネントの制御を可能にします。

カメラのアーキテクチャを示すグラフィック。 ソース: グーグル

カメラのハードウェアがますます複雑になるにつれて、 デュアルカメラの登場、たとえば)、カメラ HAL ソースにアクセスできると、機能するカメラを備えた AOSP ROM の移植がはるかに簡単になります。

ただし、OEM はさまざまな理由からカメラ HAL ソースへのアクセスを提供していません。 まず、カメラ HAL に対するすべての所有権を持っていない場合 (他社の知的財産を組み込んでいる場合など)、ソースを配布することはできません。 第二に、カメラの HAL ソースを公開すると、自社の知的財産が危険にさらされる可能性があります。 最後に、企業にはこのソース コードを提供する法的義務はありません (カーネル ソース コードとは異なります)。 GPLに基づいてリリースする義務がある)、したがって、彼らにはそれをリリースするインセンティブがありません。 それでは、カメラ HAL ソースにアクセスできない場合、開発者は正確にどのようにしてカメラを AOSP ROM 上で動作させることができるのでしょうか? 答えは、BLOB、シム、そして非常に多くのデバッグです。

デバイス BLOB (バイナリ ラージ オブジェクト) には、ソフトウェアのコンパイル済み形式である、事前にパッケージ化されたバイナリが含まれています。 この場合、カメラ HAL ソースは OEM によってコンパイルされ、バイナリとしてデバイスに出荷されます。 開発者が BLOB について話すときは、ライブ デバイス上に配布され、抽出できるバイナリを指します。 さて、「カメラ BLOB」の話題です。 長い間悩まされてきたOnePlus 何ヶ月もの間、開発者は常にカメラの BLOB にアクセスできてきたのが真実です。 の カメラ HAL ソース コードはゴールデン チケットです ただし、ここの開発者向けですが、それは 決して、決して解放されない 法的な危険があるため、OnePlusのような企業が参入することになる。

したがって、AOSP をデバイスに導入しようとしている開発者には、ソース コードにアクセスできないカメラ HAL の BLOB だけが残されます。 開発者が AOSP ROM コードをカメラの HAL BLOB と組み合わせて動作することを期待できることは、めったにありません。そのため、この 2 つの間のギャップを埋めるために、開発者は「」と呼ばれるものを作成します。シム.”

「シム」とは、「(何かを)押し込むか、スペースを埋める」ことです。 これは事実上、開発者が行うことです。 シムの作成 - コードを追加して、BLOB が作業中の AOSP ソース コードと連携できるようにします。 と。 シムは、さまざまな種類の BLOB を AOSP で動作させるために使用されますが、通常、最もシミングが必要となるのはカメラ BLOB です。 前に述べたように、シミングは、新しいバージョンの Android をデバイスに移植する場合だけではありません (たとえば、 これらの非公式 Android Oreo ROM はすべて)、同じ Android バージョンの AOSP をその ROM に移植するときにも必要です デバイス。

推奨読書: 店舗から棚まで: MSM8974 デバイスが Nougat から除外される理由の詳細な要約

たとえば、OnePlus 2 は、 最後の公式メジャー OS アップデート Android 6.0 マシュマロの形で。 ただし、このデバイスには実際には、 完全に動作するカスタム AOSP ベースの ROM Android Nougat をベースにしています。これは開発者とそのシムの熱心な努力のおかげです。 shim の例をいくつか説明しますが、その前に、shim が正確にどのように機能するかについて説明する必要があります。


シミングはどのように機能しますか?

開発者はカメラ HAL または OEM ROM ソース (プリコンパイルされたバイナリのみ) にアクセスできないため、カメラ HAL がどのような機能を期待しているかを知ることができません。 このため、カメラ HAL が探している関数の名前と、開発者が作業している AOSP コード内の実際の関数の名前の間に不一致が生じることがよくあります。

この問題を解決するには、開発者は、同じ名前を使用する新しい関数を作成するだけです。 カメラ HAL BLOB が期待する機能ですが、この新しい機能は開発者が望むものを実行するだけです それを。 BLOB と AOSP の間の仲介者として機能するこの新しい関数は shim です。 BLOB が探している関数を見つけることができないというこの特定のシナリオは、shim が必要となる最も一般的なシナリオの 1 つです。

シムが必要な場所を示す非常にシンプルな MS ペイント図。

おそらく、OnePlus 3T に関する仮想的な例を考えてみると、もう少し理解できるでしょう。 OxygenOS と OnePlus カメラを使用してサンプルを作成します。 OnePlus 3T 用の OxygenOS Nougat から取得したカメラ BLOB を使用して AOSP ベースの Nougat ROM を構築すると、問題が発生する可能性があります。 これは、カメラ BLOB (元々は OEM によってコンパイルされたもの) が、OxygenOS 内で必要なすべての関数を参照できるためです。 コンパイルされた AOSP ROM にはこれらの関数がないか、別の名前でコンパイルされている可能性があります (そのため、関数シンボル間の不一致が生じます)。 エラー。 これは、BLOB が予期する名前 (シム) を持つ新しい関数を AOSP ROM 内に作成することで修正できます。

プログラミング コンテキストのシンボルは、コード内の特定の関数を参照するために使用されます。 コードを編集すると関数の位置が変わる可能性があるため、ハードコーディングを避けるためにシンボルが必要です。 関数を参照すると、コンパイラは他の関数が常に正しいものを参照するために使用できるシンボルのテーブルを作成します。 関数。 コンパイル前に関数の名前を変更すると、そのシンボルも変更されるため、基本的にはすべての変更が反映されます。 OEM がコンパイル前にカメラ HAL ソースに作成するものは、開発者が新しい HAL ソースを作成する必要があります。 シム。

ホッパーを使用したシンボル テーブルの表示。 ソース: アプリオリット

これまでの説明では、シムの作成は簡単であるように聞こえます。 いくつかの関数名をあちこちで変更するのは、それほど難しいことではありませんね。 それがそんなに簡単だったらいいのに。 実際の shim には、関数の名前変更だけではありません。 XDA 認定開発者である Sultanxda に話を聞きました。彼は、これまでに取り組んできたより困難な shim の 1 つの例を提供してくれました。


シミング - 思っているほど簡単ではありません

OnePlus 3T に慣れていない人のために説明すると、最初は前面カメラがかなり壊れていました。 AOSP ベースのカスタム ROM。 まず、8MP を超える写真を撮ろうとすると、次のような結果になります。 クラッシュする。 この問題を解決しようとして、Sultanxda はいくつかのことを行いました。 シム OnePlus 3T 前面カメラが適切に動作できるようにします。

Shim #1 - カメラのパッケージ名の変更

ユーザーが 8MP で写真を撮るたびに前面カメラがクラッシュするのを防ぐために、Sultanxda はカメラ HAL にすべてのカメラを OnePlus カメラとして識別させるようにしました。 これは、OnePlus が特定のアプリケーション専用のヘルパー関数を決定したために行われます (isOnePlusCamera, isFacebookCamera、など)何らかの理由で。 Sultanxda は、カメラ HAL をシムすることでこの問題を修正し、ユーザーが OnePlus カメラを使用しているかのように (使用していない場合でも) 常に「true」を返す新しい関数をポイントしました。

Shim #2 - QuadraCfa を無効にする

次のシムでは、おそらくカメラに関連する Qualcomm 独自のテクノロジーである QuadraCfa を無効にする必要がありました。 おそらく、私自身も Sultanxda も QuadraCfa が何であるかを正確に理解していないためだと思われますが、Sultanxda は、QuadraCfa が有効になるたびに前面カメラが壊れることを知っています。

彼は、QuadraCfa が何らかの形で自動的に有効になることを観察しましたが、その理由や方法についてはわかりませんでした。 これを解決するには、彼側でかなり型破りな修正が必要でした。 従来の shim では、shim 関数はコンパイル時に、BLOB が探している欠落しているシンボルを提供します。 この場合、BLOB には必要なシンボル (おそらく QuadraCfa を開始する関数を表すシンボル) がすでに含まれていました。

ヘックスエディターを祝福してください。 Sultanxda が使用したプログラム。

したがって、カメラ HAL で使用されるシンボルをオーバーライドし、本質的にそれらを「欠落」させる必要がありました。 彼の shims はそれらの「欠落している」シンボルを提供します。 それを行う唯一の方法は、 カメラ HAL 自体の 16 進数編集. 16 進数編集は基本的に、編集対象の関数または文字列のいずれかを干し草の山から見つけるために、バイナリ データの形で整理されていない意味不明の塊を調べることです。

関数の 16 進数編集は、文字列の 16 進数編集よりも大幅に困難ですが、幸いなことに、Sultanxda は代わりに次の方法で QuadraCfa の背後にある関数を 16 進数編集する必要を回避することができました。 シンボル名を 16 進数で編集してシンボルを無効にする.

Shim #3 - 明るい光によるクラッシュの修正

次に、Sultanxda 氏は、明るい照明条件下で前面カメラから写真を撮影すると、カメラがクラッシュする可能性があることを確認しました。 このバグを自分のデバイスで再現するために、Sultanxda は実際に OnePlus One の懐中電灯機能をオンにし、OnePlus 3T の前面カメラの前でライトを照らしました。 クラッシュさせて使用可能なログを生成するためです。 どの機能がクラッシュの原因となっているのかを発見すると、デバイスの前面カメラに対して常に低照度モードを使用するように強制するシムを作成しました。

Shim #4 - 低解像度の前面カメラの写真

以前のシムによる明るい光のクラッシュを修正した後、Sultanxda は、そのシムの直接の結果として実際に発生した別のバグ、つまり低解像度の前面カメラ画像を発見しました。 ユーザーが要求した解像度 (例: 16MP)、結果の写真は 4MP で撮影されます。

これを解決するには、関数をシム化する必要がありました handleSuperResolution そして isSuperResolution 常に true を返しますが、前面カメラがアクティブな場合のみです (そうしないと、背面センサーから写真を撮るときにカメラがクラッシュするため)。


学んだ教訓 - シミングは難しい場合がある

Sultanxda 氏は、OnePlus 3T の前面カメラを動作させるために作成しなければならなかったシムは、典型的なシムの例ではないと認めています。 彼は、シムの複雑さと、BLOB 自体を 16 進編集する必要性がほとんどないことを考えると、シムをかなり誇りに思っています。 ただし、この例は、特定のデバイスでカメラ ハードウェアを動作させることがいかに難しいかを示しているだけです。

あなたのカメラシムの冒険が私ほど苦痛ではありませんように。 -スルタンクスダ

ログ、ログ、さらにログ。 クラッシュを再現する一貫した方法がなく、ログもなければ、開発者は問題の原因を見つける望みがほとんどありません。 問題の原因が見つかったとしても、必ずしも簡単に解決できるとは限りません。 これらのバグを見つけて潰すプロセス全体には数日から数週間かかる場合があり、これが AOSP ROM 上のカメラの修正がより困難な作業の 1 つである理由です。

お使いのデバイスに、完全に機能するハードウェアを備えた AOSP ROM が移植されている場合は、うまくいけば、次のことを始めることができます。 これらの開発者がこれらの機能を提供するために経験したであろう苦労に感謝します。 特徴。 それは簡単なことではありませんので、彼らの仕事に感謝してください。 私たちのフォーラムの才能ある開発者が Android の多くの目に見えない部分を担当しているため、大多数のユーザーは気付かないほどの大変な作業です。

この記事の作成にあたり、彼が提案した多くの貢献に対して、Sultanxda に特に感謝したいと思います。