これらの人気のあるAndroidの開発者は、あなたが心配もありません2020年に、最先端の知識を学びます!

序文

Androidのは、前の年前のように暑い、もはや、そのピーク時には年間ません。新しい産業が非常に人気が経験した場合、我々は急速に上昇することを学ぶサインカーブのような曲線が存在する必要があり、その後、トップに到達し、その後低下し、最終的には安定した値に達しました。そして、今年はすでにので、この形で、私たちは要件の一部の個々の開発者のための対応する高を有していてもよく、飽和値の間で浮いています。Androidは時代は、人間とコンピュータの相互作用の経験を要件に、合格したとして、限り、あなたは四つの成分の肉とジャガイモているようにするために使用、アプリケーションを体験することをユーザに要求、流暢さなど、それはかなり異なっています。この環境では、それは私たちのAndroidの開発エンジニアに同じ変更です。私の知る限り理解し、ミドルとシニアエンジニア、まだ非常に人気の、私はそれが適切なキャリアプランニングのピラミッドであるべきだと思うので、コアコンピタンスは、固体でなければなりません!

今のところ、Androidとモバイルインターネットは、我々は技術を習得する必要があり、私は、問題(#^ O ^#)とは思わない2020を十分に把握を持っているこれらのリストを作りました。

一般的な原理ディアンディアンJava仮想マシン反射原理原則原理ディアンディアンスレッドプールの
注釈の原則ディアンディアンシーケンス注釈の原則
活動の知識(タスクスタックの活動のライフサイクルディアンディアンフラグメントソースを表示カーネル関連ディアンのディアンディアン活動活動のスタートアップモード以下のような) -サービス原理
コード最適化フレームワーク(データ構造のデザインモード淀淀ソートアルゴリズム)
APPのパフォーマンスの最適化(淀は、ユーザーエクスペリエンスに淀チューニングコードを最適化するようになって)
修正プログラムフック技術淀淀淀熱アップグレードIOCアーキテクチャ
NDK(Cプログラミング淀C ++ JNIディアンディアンLINUX)は
どのように開発効率を向上させるには?
MVC MVPディアンディアンMVVM
マイクロ手紙アプレット
ハイブリッド
フラッター

1. Androidのアーキテクチャ設計パターン

  • MVCデザインパターン:MVCフルネームはモデルビューコントローラで、モデル(モデル)である - ビュー(ビュー) - 略語コントローラ(コントローラ)があります。
  • MVPアーキテクチャ設計パターン:MVCフルネームはモデルビューPersenterであるが、MVPは、MVCの進化から来た、それは今主流の開発モデルです。
  • MVVMアーキテクチャデザインパターン:MVVMフルネームは、モデル - ビュー - ViewModelにあり、それは基本的にMVCの改良版です。

様々なモデルを主要目的ビュー(ビュー)とモデル(モデル)を単離する、UIインターフェースディスプレイとビジネスロジックを分離するために約あります。

1.1アーキテクチャ設計パターン-MVC

これらの人気のあるAndroidの開発者は、あなたが心配もありません2020年に、最先端の知識を学びます!

(1)定義:

Androidの開発プロセスでは、より人気の開発フレームワークは、MVCフレームワークモードを使用しています。

  • M(モデル)層:モック処理します业务逻辑以下のような:複雑な操作と時間のかかる作業のようなデータベース操作、ネットワークオペレーション、I / O操作、。
  • V(ビュー)レイヤー:処理数据显示一般的に対応してAndroidの開発では、XMLレイアウトファイル。
  • C(コントローラ)レイヤー:処理用户交互一般的に対応するAndroidの開発における活性/ Feagmentアンドロイドの活動は、主にユーザーとの対話とビジネスロジックの処理によって、ユーザの入力を受け入れ、ユーザーのニーズを満たすためにモデルとビューを呼び出します。

(2)機能

  • 低カップリング
  • 再利用可能と拡大しやすいです
  • 責任のモジュールの明確な区分

(3)実施例

android本身的设计结构符合 MVC 模式。

(4)MVCの長所と短所

  • MVCの利点:モデルビュー表示の変更から分離しながら、MVCパターンは、コントローラを介して状況を制御し、
  • MVCにも限界があります。

XMLレイアウトファイルが行うことができますビュー層の対応は非常に見る関連事業活動コントローラ層の大部分を移動させる必要があるので、限られています。ビジネスロジックに対処するために、だけでなく、UIを操作するだけではなく、2つの文字(表示層とコントローラ層)として機能する同等の活性が得られ。ビジネス、多くの複雑な言葉のページたら、アクティビティコードが肥大化し、複雑になります。

1.2アーキテクチャ設計パターン-MVP

これらの人気のあるAndroidの開発者は、あなたが心配もありません2020年に、最先端の知識を学びます!

MVPは、古典的なMVCモデルは進化から、彼らの基本的な考え方は共通の場所で持っている:論理処理を担当するコントローラ/プレゼンターは、モデルがデータを提供し、ビューが表示するための責任があります。Androidの開発では、MVPの特定の実装プロセスは、要求が受信されたときにビュー、プレゼンター、モデル層は、データを取得し、データが処理されて始まることです。インタフェースを介して、その後、コールバックのアクティビティビュー層またはフラグメントに処理されたデータ。このようなMVPアクティビティまたはフラグメントは、他のビジネスプロセスを処理せず、唯一のUI関連のものを実際の表示となります。

(1)の定義

  • M(モデル)層:モック処理します业务逻辑以下のような:複雑な操作と時間のかかる作業のようなデータベース操作、ネットワークオペレーション、I / O操作、。
  • V(ビュー)層:責任View的绘制以及与用户交互一般的に対応するAndroidの開発におけるXMLファイルレイアウトとアクティビティ/フラグメント
  • P(プレゼンター)層:層とモデルビュー層の間でデータの完全な担当交互业务逻辑

(2)実施例

(3)MVCとMVPとの間の差

MVPが直接モデルビューで使用されていない、それらの間の通信は、すべての相互作用がプレゼンタ内部で発生プレゼンタによって実行され、そして無しを通してMVCモデルビューコントローラから直接データを読み出します

  • MVC和MVP的最大区别:MVC的Model层和View层能够直接交互;MVP的Model层和View层不能直接交互,需通过Presenter层来进行交互。
  • Activity职责不同:Activity在MVC中属于Controller层,在MVP中属于View层,这是MVC和MVP很主要的一个区别。可以说Android从MVC转向MVP开发也主要是优化Activity的代码,避免Activity的代码臃肿庞大
  • View层不同:MVC的View层指的是XML布局文件(或用Java自定义的View);MVP的View层是Activity(或Fragment)
  • 控制层不同:MVC的控制层是Activity(或Fragment);MVP的控制层是Presenter,里面没有很多的实际东西,主要负责Model层和View层的交互。

(4) MVP优缺点

  • MVP的优点如下:

模型与视图完全分离,我们可以修改视图而不影响模型;项目代码结构清晰,一看就知道什么类干什么事情;我们可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑,这个特性非常的有用,因为视图的变化总是比模型的变化更频繁 ;协同工作(例如在设计师没出图之前可以先写一些业务逻辑代码)

  • MVP也有不足之处:

接口过多,一定程度影响了编码效率。一定程度上导致Presenter的代码量过大。
为了降低Presenter中业务繁多的问题,Google又推出了MVVM,试图通过数据驱动来减少Presenter的代码量。

1.3 架构设计模式-MVVM

これらの人気のあるAndroidの開発者は、あなたが心配もありません2020年に、最先端の知識を学びます!

(1) 定义

  • M(Model)层:仍然是实体模型(但是不同于之前定义的Model层),主要负责数据获取、存储和变化,提供数据接口供 ViewModel 层调用。
  • V(View)层:对应Activity/Feagmentxml布局文件 ,负责View的绘制以及与用户交互
    说明:View层仅能操作UI(数据绑定来实现 UI 更新);不能做任何和业务逻辑有关的数据操作
  • VM(ViewModel)层:负责完成Model层和View层间的数据交互业务逻辑
    说明:ViewModel层仅能做和业务逻辑有关的数据操作;不能做UI相关的操作

2. android插件化

插件化来由:随着业务的增多,业务逻辑代码越来越多,apk包也逐渐增大,不利于维护和升级。通过插件化开发可将功能模块解耦,不同的维护团队仅维护某模块的业务,同时当app升级时可仅对某功能模块进行升级而不需整体升级。

2.1 插件化要解决的问题—如何动态加载apk

(1) android类加载器及区别

类加载器作用:java字节码通过类加载器加载到java虚拟器。

  • PathClassLoader:仅能加载文件目录下的apk。
  • DexClassLoader:可以加载apk文件中的字节码(从dex实体jar文件中加载java字节码)。主要用于动态加载和代码热更新等。

(2)反射: java中的反射使我们在运行时获得这个类的属性、方法和class内部的信息机制,最重要的是我们可以在运行时实例化这个对象调用方法,这也是java反射的最大优点。
(3) 实现动态加载apk

什么是动态加载apk:android中有一个速度程序会主动到指定的sd卡中去加载apk,并通过代理activity去执行。

实现:需要一个代理activity去执行apk中的activity,主要通过反射去获得它的属性和方法,从而进行apk的调用。
实现原理:类加载器(加载类)+反射(获取属性和方法)+动态代理(执行)

これらの人気のあるAndroidの開発者は、あなたが心配もありません2020年に、最先端の知識を学びます!

如:

これらの人気のあるAndroidの開発者は、あなたが心配もありません2020年に、最先端の知識を学びます!

2.2 插件化要解决的问题—如何加载资源

通过android中ServiceManager类的隐藏方法来加载资源。

2.3 插件化要解决的问题—如何加载代码

使用java中的类加载机制,但是android和java也有一点不一样,android比java多了组件和生命周期,所以并不是类加载进来就能使用(不能管理生命周期)。

3. Android热更新(在线热修复技术)

(1) 热更新流程

  • 检测到线上严重的crash(参考:app检测crash并发送日志到服务器的实现)
  • 线上版本拉出bugfix分支并在分支上修复问题
  • jenkins构建及生成补丁
  • app在合适时机通过推送或主动拉取补丁文件
  • 将bugfix代码合并到master上

これらの人気のあるAndroidの開発者は、あなたが心配もありません2020年に、最先端の知識を学びます!

(2) 热更新主流框架

  • Dexposed
  • AndFix
  • NuWa

(3) 热更新原理

  • Android类加载机制(类加载器)

PathClassLoader类:用来加载系统类
DexClassLoader:用来加载dex文件、jar文件包和apk包等

  • 热修复机制(原理)

原理:在ClassLoader中创建一个dexElements数组,根据线上的crash定位找到对应的类文件,然后把这个类文件修复完成后打包成一个dex文件并放到dexElements数组的最前方。那么当ClassLoader遍历dexElements数组(加载数组中的dex文件)时,因为ClassLoader会优先加载最前方的dex文件,所以不会加载线上有crash的dex文件,只会加载修复完的dex文件,从而完成热修复过程。

これらの人気のあるAndroidの開発者は、あなたが心配もありません2020年に、最先端の知識を学びます!

4. Android进程保活

(1) 进程保活概念

进程保活:让进程在内存中永远存在且无法杀死,就算被杀死也能保活。
进程被杀死的原因:人为地调用kill;被第三方安全软件杀死。

进程保活并非是一种流氓手段,在很多场景下我们需要一个常驻进程来为用户提供服务,如:

  • 接收屏幕开关的系统广播:因为广播接收者不支持静态注册,必须在进程中动态注册广播接收者来接收,如果没有常驻进程,那么锁屏应用无法为用户正常提供服务。
  • 定位服务:需要在后台维护一个长连接,以便及时地将信息(推送的信息/定位信息等)传达给用户。

缺点:进程保活在内存,不管如何优化,或多或少都会增加性能的开销。所以需在进程保活内存消耗之间寻找平衡点来为用户进程保活。

(2) android进程优先级和回收策略

  • android进程优先级:前台进程 > 可见进程 > 服务进程 > 后台进程 > 空进程
  • android进程的回收策略:主要依靠LMK ( Low Memory Killer )机制来完成。LMK机制通过 oom_adj 这个阀值来判断进程的优先级,oom_adj 的值越高,优先级越低,越容易被杀死。
    拓展:LMK ( Low Memory Killer ) 机制基于Linux的OOM(Out Of Memery)机制,通过一些比较复杂的评分机制,对进程进行打分,将分数高的进程判定为bad进程,杀死并释放内存。LMS机制和OOM机制的不同之处在于:OOM只有当系统内存不足时才会启动检查,而LMS机制是定时进行检查。

(3) android进程保活方案

  • 利用系统广播拉活

在发生系统事件时,系统会发出相对响应的广播(常用的广播事件如:开机、网络状态变化、文件或sd卡的卸载等),我们可以在mainfest.xml文件中静态注册广播监听器
缺点(无法拉活的情形):广播接收者被管理软件或系统软件通过自启动管理等功能禁用的场景下是无法接受广播的,从而无法自启动进行系统拉活;系统广播事件是不可控制的,只有在发生事件时才能进行拉活,无法保证进程被杀死后立即被拉活。

  • 利用系统Service机制拉活

将Service中的onStartCommand()回调方法的返回值设为START_STICKY,就可以利用系统机制在Service挂掉后自动拉活。
拓展:onStartCommand()的返回值表明当Service由于系统内存不足而被系统杀掉之后,在未来的某个时间段内当系统内存足够的情况下,系统会尝试创建这个Service,一旦创建成功就又会回调onStartCommand()方法。
缺点(无法拉活的情形):Service第一次被异常杀死后会在5s内重启,第二次会在10s内重启,第三次会在20s内重启,若Service在短时间内被杀死的次数超过3次以上系统就会不惊醒拉活;进程被取得root权限的管理工具或系统工具通过强制stop时,通过Service机制无法重启进程。

  • 利用Native进程拉活

思想:利用Linux中的fork机制创建一个Native进程,在Native进程可以监控主进程的存活,当主进程挂掉之后,Native进程可以立即对主进程进行拉活。
在Native进程中如何监听主进程被杀死:可在Native进程中通过死循环或定时器,轮询地判断主进程被杀死,但是此方案会耗时耗资源;在主线程中创建一个监控文件,并且在主进程中持有文件锁,在拉活进程启动后申请文件锁将会被阻塞,一旦成功获取到锁说明主进程挂掉了。
如何在Native进程中拉活主进程:主要通过一个am命令即可拉活。
说明:android5.0后系统对Native进程加强了管理,利用Native进程拉活的方式已失效。

  • 利用JobScheduler机制拉活

说明:android在5.0后提供了JobScheduler接口,这个接口能够监听主进程的存活,然后拉活进程。

  • 利用账号同步机制拉活(已失效)

说明:android系统的账号同步机制会定期同步账号信息,这个方案主要是利用账号同步机制进行进程拉活。不过最新的android版本对账号同步机制做了改动,该方法可能不再生效。

学习宝典

对我们开发者来说,一定要打好基础,随时准备战斗。不论寒冬是否到来,都要把自己的技术做精做深。虽然目前移动端的招聘量确实变少了,但中高端的职位还是很多的,这说明行业只是变得成熟规范起来了。竞争越激烈,产品质量与留存就变得更加重要,我们进入了技术赋能业务的时代。

不论遇到什么困难,都不应该成为我们放弃的理由!

時間やボトルネックに直面してこの業界に新しい多くの人々は、常に、このような時間の期間を学ぶとして、いくつかの問題を、そこに遭遇する方向音痴を感じていない、私は学ぶために開始する場所から知っていない、と私は、Androidのためにしていますプログラマ、私は一緒に入れて皆のためにここにいる学習書を技術のあらゆる側面を含むが、高レベルUI、パフォーマンスの最適化、モバイルの建築家、NDK、ハイブリッド開発(ReactNative + Weex)マイクロ文字のアプレット、フラッターAndroidやその他の高度な実践に限定されるものではなく、あなたを助けることを望んで、あなたがインターネット上で検索を保存します情報が学習する時間は、あなたも親しい友人が一緒にダイナミックな学習を共有することができます!

[Androidの詳細な知識の思考脳マップ(スキルツリー)]

これらの人気のあるAndroidの開発者は、あなたが心配もありません2020年に、最先端の知識を学びます!

研究ノート[アンドロイド]

これらの人気のあるAndroidの開発者は、あなたが心配もありません2020年に、最先端の知識を学びます!

面接の経験のために、私たちは経験を仕事に同じ質問が異なるだろう聞かないが、面接ライトバックいくつかのメーカーは非常に困難である思想上の質問に直面しています。すでに同社の開発の強さに近づいてお気に入りを持っている場合しかし、あなたは面接を終えAndroidの独自の開発によると、すべての種類で、I攻略面接の経験と権限のサイトを見てしたいと思うかもしれ

私はそれがあなたの収穫の多くをもたらすと信じて:

これらの人気のあるAndroidの開発者は、あなたが心配もありません2020年に、最先端の知識を学びます!

[上記のHD脳図]、および私を追加することができ、[サポート] PDF技術アーキテクチャは、WX:X1524478394の無料アクセスを

ときに簡単にプログラマ、優れたプログラマがシニアアーキテクトへのプライマリから上級プログラマー、建築家にジュニアプログラマから学ぶ必要があるとき、または技術的な管理から管理、テクニカルディレクターの各段階に私たちは、さまざまな機能を持っている必要があります。初期の研究では、キャパシティビルディングで仲間を投げるためには、自分のキャリアの方向性を決定します。

おすすめ

転載: blog.51cto.com/14332859/2456735