AndroidソースコードにおけるC++カバレッジ機能の実用化

問題の原因は次のとおりです。

SourceInsight を使って Android のソースコードを調べていると、こんな場所がありました。

status_t AudioPolicyManager::startOutput(audio_io_handle_t output,
                                             audio_stream_type_t stream,
                                             audio_session_t session)
{
    //前面省略
//就是这个地方,真讨厌!!!!!!1
	ALOGV("before startSource");
    status_t status = startSource(outputDesc, stream, newDevice, &delayMs);
	ALOGV("after startSource");
//以下省略
}


コードの場所: Frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp


あなたはそれを見ましたか?startSource 関数です。クリックしてジャンプします。

status_t AudioPolicyManager::startSource(sp<AudioOutputDescriptor> outputDesc,
                                             audio_stream_type_t stream,
                                             audio_devices_t device,
                                             uint32_t *delayMs)
{
	ALOGV("AudioPolicyManager::startSource()");
その結果、呼び出されたログを印刷できなくなります。本当に久しぶりに会いました、本当に。現在のディレクトリとその近くのディレクトリを検索しました。他の実装は見当たりませんでした。変。

ついに見つけました

クラス AudioPolicyManagerCustom: public AudioPolicyManager

実際にはサブカテゴリがあります本当にあります

startSource
そして同じ名前です。パラメータの数とパラメータの種類は同じです。

さて、AudioPolicyManager クラスの定義に戻ります。

virtual status_t startSource(sp<AudioOutputDescriptor> outputDesc,
                             audio_stream_type_t stream,
                             audio_devices_t device,
                             uint32_t *delayMs);
仮想関数

物事はここにあり、基本的には明らかです。

それでは、C++ 入門の xxxx ページに進み、C++ でカバーされる知識を確認してください。

そうですね、スクリーンショットを撮ることはできませんし、本も手元にないので、スクリーンショットを手に取ってください。

覆盖是指派生类函数覆盖基类函数,特征是:
(1)不同的范围(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有virtual 关键字。

私が見た奇妙な現象の理由は、 報道が行われたためであることがわかりました

また、呼び出し先は実際にはポインタで呼ばれており(既成のサンプルの多くはポインタで書かれています)、この場所にこのポインタが隠されています。

それは何の役に立つでしょうか?たとえば、Andorid システムについて説明します。Google が標準バージョンを提供しています。元のシステムを変更する必要はありません。自分でクラスを作成し、元のクラスを上書きすることができます。これがカスタマイズです。

おすすめ

転載: blog.csdn.net/bberdong/article/details/51799985