Androidの開発はこれまで以上に困難です!面接の質問はとても難しいです

序文

Android開発の現在の市場は誰もが理解している必要があります。知らない友達がいる場合は、私の記事「2021年です。Android開発の見通しについてどう思いますか?」を読むことができます過去数年間、Androidの開発は非常に人気があり、脚光を浴びるのはほぼ同じでした。多くのJavaとC +がパイを共有するようになりました。市場の高騰する配当が消えて安定した後、Androidへの切り替えへの熱意は徐々に薄れ、Androidプログラマーは建築家になりたいと思っていますが、この間、必要な労力と労力は私たちの想像をはるかに超えています。

Android業界の調査データによると、Android開発者の97%が次のジレンマに直面することがわかっています。

  • アウトソーシング会社/小さなチームにいると、テクノロジーはブロックされます。
    小さなソフトウェア会社やアウトソーシング会社で長期間働いている場合、テクノロジーが完全で大規模な開発を体験する機会を持つことは困難です。規模の大きいプロジェクト。全体的な技術的ビジョンは比較的狭く、長期的な給与の停滞につながります。
  • 同じコーディング作業を繰り返し、同じコーディング作業を1年間繰り返し、同じコーディング作業を何年も繰り返し
    ます。プロジェクトの技術要件は、期待どおりに開発できないものであり、結果として長い時間がかかります。自分の能力が突破できない時。新しい技術を受け入れるのはさらに難しい。
  • 自制心
    が乏しく、日中は働くことを学ぶ時間がなく、夜は残業し、学習する時間は断片化されているだけです。自制心が比較的悪い場合は、基本的に3日間の釣りと2日間のサーフィンです。ネット、体系的に学ぶことができず、技術力を蓄積することができない;
  • 現在の履歴書は大工場に入るのが難しい。
    既存の技術力とプロジェクト経験は、大工場から高額のオファーを受けるどころか、大工場の履歴書の最初の審査に合格することはできない。

これらの問題は、その時点では何も感じません。転職したり昇進したりすると、キャリア開発の障害になりますあなたがこれらの問題を解決したくないのなら、彼らは岩のように不安の形であなたを圧迫します。多くの求職者の能力システムは、企業のニーズとはまったく異なります。

会社の採用は以前と同じではありません。いくつかの簡単なページを書いてAndroid開発の基本を理解できれば、合格することができます。Androidの主要市場は長い間飽和状態にあり、現在、市場でより多くのポジションが中堅および上級エンジニアに求められています。どんな業界でも、どんなポジションでも、ジュニア技術者の供給は常に需要を上回っており、仕事を見つけるのは簡単ではありません。Androidの開発はその1つにすぎません。

インタビュアーが尋ねる36の選択された質問

面接官からの面接の質問:

  1. バインダー通信の原理とメカニズムについて詳しく話す
  2. Linuxにはさまざまなプロセス通信方法がありますが、Androidが偏ったバイアスでバインダー通信を使用しないのはなぜですか
  3. プロセスを維持する方法、維持率はどのくらいですか
  4. バインダーの原理とコピーを実装するプロセスについて話します
  5. ButterKnifeの実行効率が他のインジェクションフレームワークよりも高いのはなぜですか?その原理は何ですか
  6. コンポーネント化の実現方法、コンポーネント化とプラグイン化の違い、および選択方法
  7. コンポーネント間のジャンプとコンポーネント通信の主要なメカニズムについて話します
  8. コンポーネント化を使用したことがありますか?コンポーネント化された通信をどのように実現しますか?ARouterは役に立ちましたか?
  9. プラグインをどのように理解していますか
  10. ホットリペアシリアルガン(ホットリペアは、いじくり回しが接触したものであり、いじくり回しの原理は何ですか)
  11. インクリメンタルアップグレードがアップグレードコストを削減する理由とインクリメンタルアップグレードの原則
  12. PackageManagerService実行プロセスの詳細な説明
  13. AndroidでAMSはどのような役割を果たしますか?Androidのソースコードの簡単な分析
  14. AOPとは何か知っていますか?AOPとOOPの違いは何ですか、AOPの原則は何ですか
  15. モバイルQQのスキンをどのように変更しますか?それについて何か知っていますか?肌のリサーフェシングの原理を見たことがありますか?
  16. Android(仮想マシン)メモリモデル
  17. データベースのバージョンを個別にアップグレードし、元のデータを移行する方法。
  18. メモリ内のvolatileキーワードとsynchronizedキーワードの違いについて話します
  19. 仮想マシンでのsynchronizeキーワードの実行原理は何ですか?メモリの可視性とロックのアップグレードについて話していただけますか?
  20. WeChatと同様に、APKで極端な圧縮を実行する方法について、Androidの圧縮8ステップについて説明しましょう。
  21. 逆コンパイルを完全に防ぐ方法、dex暗号化を行う方法
  22. シリアル化と逆シリアル化の原則、AndroidのParcelableとSerializableの違いは何ですか
  23. アプリ用のデータベースフレームワークを設計しましたか?それとも、ormlitegreenDaoフレームワークを使い続けますか?
  24. Android Pでのhttpの禁止はあなたに影響を与えますか?httpsの原理を知っていますか?
  25. 対称暗号化とは何ですか、非対称暗号化とは何ですか?公開鍵と秘密鍵は対称暗号化に属しますか?
  26. これまでにライブ放送を行ったことがありますか?ライブ放送をどのように達成しましたか?ライブ放送のやり取りをどのように行いますか?
  27. ライブ放送でネットワーク速度が比較的遅い場合に、画像のスムーズな効果を確保する方法
  28. ハードコーディングとソフトコーディングの違い、画面を記録するときにハードコーディングとソフトコーディングを選択する方法
  29. Tersorflowをどのように理解していますか?人工知能を適用したことがありますか?
  30. ANRをすばやく見つける方法のデモを提供します
  31. ハンドラーには無限ループがありますが、なぜメインスレッドをブロックしないのですか、そしてその原理は何ですか?
  32. Dalvik仮想マシンとJava仮想マシンの理解の違いについて話します
  33. EventBusを使用する理由EventBusの詳細なソースコードの説明とアーキテクチャ分析EventBusを使用することの欠点は何ですか?
  34. Androidスレッドプールの原則についてのあなたの理解について話してください
  35. オーディオとビデオの同期の原理について話します。オーディオとビデオを完全に同期させることはできますか?
  36. ライブ放送の特殊効果を行ったことがありますか?ライブ放送の特殊効果の実装原理と難しさについて話してください。

上記の36の質問はすべて、バインダー通信の原則とメカニズム、コンポーネント化、プラグイン化、ホットリペア、ハンドラー、データベースフレームワークから、オーディオおよびビデオテクノロジーのライブ放送やその他の技術的な問題に至るまで、以前のインタビューから抽出した古典的なインタビューの質問です。答えを求められた場合、いくつの質問に答えることができますか?

記事の長さのため、分析のためにいくつかの短い分析をランダムに選択しました。すべてのインタビューの質問の分析を参照したい場合は、私のGitHubにアクセスしてください:https://github.com/733gh/Android-表示するT3

面接の質問分析

1.バインダー通信の原理とメカニズムについて詳しく話します

まず、バインダーのワークフローチャートに行きましょう。(はっきりしない場合は、画像のリンクをブラウザにコピーするか、ローカルに保存して表示できます。私はこのような画像をよく見ます)


最初はなじみのないことがたくさんありますが、複雑ではありません。ああ、フローチャートはProcessOnで描かれました。素晴らしいオンライン描画ツール。

出発前に弾丸を準備します。プロセスには異なる仮想アドレスがあり、直接通信できないことがわかっています。これは保護メカニズムです。タスクマネージャーを開き、N個のプロセスを確認し、これらのプロセスが直接通信した場合の結果を想像してみてください。

ユーザースペースは、システムコール(システムコールバック)を介してカーネルスペースと通信できます。カーネルスペースにデータ転送を完了できるモジュールがある場合、2つのプロセスは通信できますか?以下に示すように:

前述のように、ユーザースペースとカーネルスペースのいくつかの概念はユーザースペースから推測できますが、カーネルスペースはそれが非常に低レベルのものであることを認識しています。モジュールは、機能を実装するプログラムまたはハードウェア回路として簡単に理解できます。たとえば、シングルチップマイクロコンピュータを再生する場合、赤外線モジュール、Bluetoothモジュール、wifiモジュールなどがあります。これらの概念については百科事典を検索してください。

バインダードライバー
バインダードライバーはカーネル空間で実行され、カーネルモジュールです。バインダードライバーは非常に重要であり、プロセス間通信などのデータ転送を担当します。ドライバーに関しては、あなたはそれに精通しています。Uディスクを接続する場合は、ドライバーが必要です。また、バインダードライバーも同様ですが、名前は非常に優れていますが、機能は依然として非常に強力です。しかし、それも魔法のようなものではありません。

バインダークロスプロセス通信モデル
バインダーの通信モデルには、バインダークライアント、バインダーサーバー、バインダードライバー(バインダードライバー)、ServiceManagerの4つの役割があります。

ある状況を想像してみてください。私は北京に旅行していて、高校のクラスメートにハガキを送りたいのですが、ハガキには住所が必要です。それとも、どうすれば相手に送ることができますか?では、どうすればこのアドレスを取得できますか?非常に簡単です。卒業アルバムを確認するだけです。そして、学生の連絡先を記録したこの卒業写真集は、名簿に相当します。これは、バインダーの通信モデルでServiceManagerの役割を果たします。さて、あなたは郵送先住所を持っているので、郵便局を見つけてそれを送るだけです。数日後、生徒たちは喜んではがきを受け取りました。次に、この郵便局はバインダー通信モデルでバインダー主導の役割を果たします。送信者として私はバインダークライアントであり、受信者のクラスメートはバインダーサーバーです。

上記のシナリオを説明するために写真を撮りましょう:

ご覧のとおり、ServiceManager、Binder Client、およびBinder Serverは異なるプロセスにあり、3つすべてがユーザースペースにあり、Binderドライバーはカーネルスペースにあります。(バインダードライバーの効果が最も大きいため、意図的にバインダードライバーを大きくしました)


まず、通信モデルについて簡単に説明します。まず、ServiceManagerがあります。最初は、名簿が空白です。次に、サーバープロセスがマッピング関係テーブルをServiceManagerに登録します。たとえば、学生Xuは、広東省xx地区に住所を書き込みます。広東省市。名簿を入力すると、表が作成されます。

クライアントプロセスはサーバープロセスと通信する必要がある後、最初にServiceManagerにアドレスを照会します。ServiceManagerは照会要求を受信した後、照会結果をクライアントに返します。

サーバープロセス登録であろうとクライアントクエリであろうと、バインダーによって駆動されることに注意してください。これは実際にはバインダードライバーの役割です。心配しないでください。次の原則が分析されます。この時、私はその住所を取り、はがきを送り始めました。はがきをポストボックスに入れると、その後郵便局が作業を完了します。つまり、バインダードライバーが通信の転送を完了します。

バインダー通信の原理
はがきを送る例から、郵便ポストからはがきを取り出し、山や川を越えて配達します。この点から、バインダードライバーによる作業が非常に重要であるという事実も考えることができます。

バインダークロスプロセス通信のプロセスを復元しましょう。ケース:クライアントプロセスは、サーバープロセスのコンピューターオブジェクトのaddメソッドを呼び出します。

次の内容をよりよく理解するためにエージェントモデルを知る必要があるかもしれませんが、エージェントモデルを学習していなくても構いません。最初にそれを読んでから、エージェントモデルを作成してから、これに戻ることができます。論文。考え方ははるかに明確になります。

1.1。サーバープロセスはServiceManagerに登録し、ServiceManagerに私が誰であるか、何を持っているか、何ができるかを通知します。これは、学生のXu(サーバープロセス)にラップトップ(コンピューターオブジェクト)があり、このラップトップにaddメソッドがあるようなものです。このとき、マッピングテーブルが生成されます。
2.2。クライアントプロセスがServiceManagerにクエリを実行します。サーバープロセスのコンピューターオブジェクトのaddメソッドを呼び出します。このプロセスがバインダーによって駆動されていることがわかります。この時点で、バインダードライバーがその役割を果たし始めます。ServiceManagerへのクエリが完了したら、コンピューターオブジェクトをクライアントプロセスに返しますか?実際にはそうではありません。バインダードライバーは、コンピューターオブジェクトをcomputerProxyオブジェクトに変換し、それをClientプロセスに転送します。したがって、Clientプロセスが取得するのは、実際のコンピューターオブジェクトではなく、プロキシオブジェクトであるcomputerProxyオブジェクトです。computerProxyオブジェクトにもaddメソッドがあることは理解しやすいですが(addメソッドがない場合、クライアントを欺くのではないでしょうか?)、このaddメソッドは単なるパラメーターのパッケージです。
3.3。クライアントプロセスがaddメソッドを呼び出すと、このメッセージがBinderドライバーに送信されます。この時点で、ドライバーはそれがcomputerProxyであると判断するため、クライアントプロセスはコンピューターオブジェクトのaddメソッドを呼び出す必要があります。このとき、ドライバーはコンピュータオブジェクトを呼び出すようにサーバープロセスに通知します。addメソッド、結果を教えてください。次に、サーバープロセスが計算結果をドライバーに送信し、ドライバーがそれをクライアントプロセスに転送します。この時点では、クライアントプロセスはまだ暗闇の中にあります。彼は、実際のコンピューターオブジェクトのaddメソッドを呼び出していると考えていますが、実際、彼はエージェントに電話しただけです。しかし、最終的にクライアントは計算結果を得ました。

さて、通信プロセスは完了です。バインダードライバーは実際にはトランジットであることがわかりました。

要約と
要約:クライアントプロセスがServiceManagerにサーバープロセスを照会する場合(オブジェクトの1つのメソッドを呼び出したい)、このプロセスもプロセス間通信のプロセスであり、バインダーによって駆動されます。 。このとき、バインダーが駆動されます。その役割を果たすために、王子のシベット猫がやって来て、サーバープロセスの実際のオブジェクトをプロキシオブジェクトに変換し、プロキシオブジェクトをクライアントプロセスに返しました。クライアントプロセスはプロキシオブジェクトを取得し、プロキシオブジェクトのメソッドを呼び出します。バインダードライバーは引き続きそのミッションを実行します。サーバープロセスに計算を実行するよう通知し、サーバープロセスでの実際のオブジェクト実行の結果を次のように返します。クライアントプロセス。クライアントプロセスは、それでも必要なものを取得しました。クロスプロセス通信が完了しました

Linuxにはさまざまなプロセス通信方法がありますが、Androidが2つのバイアスでバインダー通信を使用しないのはなぜですか?

プロセスを維持する方法、維持率はどのくらいですか

他の面接の質問の分析

記事の長さのため、分析のためにいくつかの短い分析をランダムに選択しました。すべてのインタビューの質問の分析を参照したい場合は、私のGitHubにアクセスしてください:https://github.com/733gh/Android-表示するT3

おすすめ

転載: blog.csdn.net/u012165769/article/details/114273316