一、主流移动操作系统介绍

最早的智能手机是1993年IBM推出的IBM Simon;而后相继出现Symbian、BlackBerry等操作系统;
2007年初,苹果推出了iPhone,搭载iOS操作系统;
2007年9月,Google推出Android操作系统并开源;
2010年,微软发布Windows Phone 7.0。早期为Windows Mobile 系列。2015年发布Window 10 移动版。
中国市场上的小米MIUI、华为Emotion UI、锤子Smartisan OS、魅族Flyme OS、中国移动OMS等都属于Android操作系统的深度定制版。
基于云服务加持的还有百度云操作系统、阿里云OS等,搭载的设备很少,市场份额很低。

移动开发基础介绍 - 图1

移动开发基础介绍 - 图2
在IOT领域,国内的阿里的AliOS Things、华为的鸿蒙OS、腾讯的 TencentOS tiny、小米的 Vela等都已经在布局发展。

Google正在研发的一个操作系统Fuchsia,设计目标之一是可运行在众多的设备上,包括移动电话和个人电脑。

二、Android开发

由美国Google公司和开放手机联盟领导及开发。基于Linux的移动设备操作系统,主要使用于移动设备,如智能手机和平板电脑。

1. 开发环境

Window、Linux、Mac OS 都可以用来开发Android应用。开发Android前需要准备的软件如下:

  • Java JDK 1.5及更高版本,推荐JDK1.8(含JRE)
  • Android SDK
  • Android Studio
  • Eclipse(可选,早期开发工具,需要安装ADT插件)

安装完JDK和SDK后,需要配置环境变量,配置完Android SDK环境后,可使用 adb 命令
如:

  1. $ adb shell getprop ro.product.cpu.abi
  • armeabi-v7a(32位ARM设备)
  • arm64-v8a(64位ARM设备)

2. 开发语言

目前开发Android的主流语言是Java和Kotlin,Kotlin时2017年Google I/0 大会上,被Google宣布在Android上为Kotlin提供一等支持,另外C++也是官方推荐的一门开发语言。

2.1. 程序入口

java

  1. public static void main(String[] args){
  2. System.out.println("hello world");
  3. }

kotlin

  1. fun main(args:Array<String>){
  2. println("hello world")
  3. }

2.2. 基本数据类型

Kotlin Java
Int int/Integer
Double double/Double
Float float/Float
Long long/Long
Short short/Short
Byte byte/Byte
Boolean boolean/Boolean

java 无需初始化,但有默认值

  1. private int b;
  2. private boolean c;
  3. private float d;
  4. private long e;

Kotlin 变量必须初始化

  1. var b:Int = 0
  2. var c:Boolean = false
  3. var d:Float = 0f
  4. var e:Long = 0L

2.3. 函数

java

  1. //有返回值
  2. public int add(int a,int b){
  3. return a+b;
  4. }
  5. //无返回值
  6. public void print(String s){
  7. System.out.println(s);
  8. }
  9. //可变长度
  10. public void vars(String... params){
  11. for(String s:params){
  12. System.out.println(s);
  13. }
  14. }

kotlin

  1. //有返回值
  2. public add(a:Int,b:Int):Int{
  3. return a.plus(b)
  4. }
  5. //无返回值
  6. public print(s:String){
  7. println(s)
  8. }
  9. //可变长度
  10. fun vars(vararg v:String){
  11. for(vt in v){
  12. println(vt)
  13. }
  14. }

2.4 类

  1. abstract class Human {
  2. protected String name;
  3. Human(String name) {
  4. this.name = name;
  5. }
  6. abstract void eat();
  7. }
  8. class Man extends Human {
  9. Man(String name) {
  10. super(name);
  11. }
  12. @Override
  13. void eat() {
  14. System.out.println(name + "在吃饭");
  15. }
  16. }
  17. class Woman extends Human {
  18. Woman(String name) {
  19. super(name);
  20. }
  21. @Override
  22. void eat() {
  23. System.out.println(name + "在吃饭");
  24. }
  25. }
  26. public class Test {
  27. public static void main(String[] args) {
  28. Human man = new Man("Test1");
  29. Human woman = new Woman("Test2");
  30. man.eat();
  31. woman.eat();
  32. }
  33. }
  1. abstract class Human(var name: String) {
  2. abstract fun eat()
  3. }
  4. class Man(name: String) : Human(name) {
  5. override fun eat() {
  6. println("${name}在吃饭")
  7. }
  8. }
  9. class Woman(name: String) : Human(name) {
  10. override fun eat() {
  11. println("${name}在吃饭")
  12. }
  13. }
  14. public class Test {
  15. fun main(args: Array<String>) {
  16. var man: Human = Man("Test1")
  17. var woman: Human = Woman("Test2")
  18. man.eat()
  19. woman.eat()
  20. }
  21. }

3. Android应用开发

3.1. 系统架构图

移动开发基础介绍 - 图3

分别是:

  1. Linux 内核
  2. HAL(硬件抽象层,服务于非开源的硬件驱动)
  3. 系统库(原生 C/C++ 库,可以使用 Android NDK 直接从原生代码访问某些原生平台库,如OpenGL ES;Android运行时环境,包含Java核心库和Dalvik虚拟机)
  4. Java API 框架层(通过以 Java 语言编写的 API 使用 Android OS 的整个功能集,包含UI、资源管理、通知管理、Activity管理、内容提供程序)
  5. 应用层(内置应用,如电子邮件、短信、日历、互联网浏览和联系人等核心应用)

作为一般应用开发者,交互最多的就是Java API 框架层和应用层。作为音视频开发者,接触更多的是原生C/C++库。作为定制系统开发者,会触及虚拟机和Linux 内核。

3.2. 第一个Android - “Hello World”

Android 目前可以开发手机(平板)应用、手表应用、电视应用、汽车应用和IOT应用;

3.2.1 创建应用

Android Studio : Create New Project ,选择 Empty Activity。以此设置:

  • Name:应用名称,安装后应用图标下的名称。
  • Package name : 包名,非常重要,将成为应用的唯一标识,通用格式组织域名倒输.应用英文名,如 cn.leadchina.ilead
  • Save location : 源码保存的物理位置。
  • Language : 选择开发语言Java或Kotlin
  • Minmun SDK : 最小支持的Android系统版本。
    移动开发基础介绍 - 图4
  • 点击“FINISH”,等待片刻,就会自动进入代码编辑界面。

3.2.2 代码结构介绍

初次进入开发界面会以Android视图的形式展示代码:
移动开发基础介绍 - 图5
可以在Project窗口中切换代码视图,我习惯于用Project视图:
移动开发基础介绍 - 图6

开启虚拟机或者连接Android手机(需要打开USB调试模式),就可以运行这个“Hello World”应用了。

3.3.3. Android需要掌握的基础知识

  1. Java或Kotlin语言基础,面向对象的思想。
  2. 常用布局,基本UI组件的使用,常见界面布局的设计和实现。
  3. Android四大组件(Activity、Server、ContentProvider、BroadcastReceiver)
  4. 数据存储(文件、SharedPreferences、SQLite、ContentProvider)
  5. XML和Json数据解析(现在只需要会使用第三方库即可)
  6. 异步编程、网络编程、异常处理等
  7. 了解屏幕适配、消息推送、移动支付、第三方登录等

三、IOS开发

iOS是苹果公司为其移动设备所开发的专有移动操作系统,为其公司的许多移动设备提供操作界面,支持设备包括iPhone、iPad和iPod touch。iOS在iOS 3.2发布前名为iPhone OS,iPad版本则于iOS 13起独立为iPadOS。

1. 开发环境

只能在Mac OS X 操作系统上开发。

  • 准备一台苹果电脑(黑苹果的主机或者虚拟机也可以进行基本的开发)
  • Apple ID:可在Apple官网免费申请一个账户(必须)
  • 安装 XCode开发工具(必须)
  • 一部iPhone手机(定位、照相机、蓝牙等开发需要)

2. 开发iOS程序

  • 目前可用于IOS开发语言有Objective-C和Swift,同样也可以用C++进行开发,目前主流的开发语言已经变成Swift,OC为辅。
  • XCode目前也是可以开发手机、平板、电视、桌面、手表端应用,不过都只局限于苹果的操作系统之上。

四、跨平台开发技术

早期App开发,在国内一般以Android为先进行开发,发照到一定规模后再进行IOS的开发,当然实力雄厚的公司,会有两端的开发团队同步进行。但移动这个生态发展过于迅速,在激烈的市场竞争中,各方都在探索更高效的开发模式。跨平台技术也就应运而生,而且能实现跨平台开发的技术框架也是层出不穷,但大部分都是昙花一现,难有发展。

1. 跨平台技术发展

移动互联网发展了十余年,现在来讲跨平台技术,已经不单单是Android手机和IOS手机两端而已,还包括Web端,手表端,平板端,电视端,更扩展到了桌面端应用。
从技术层面上,跨平台方案可分为4大流派:

  • Web技术:主要依赖WebView的技术,如一些Web App、小程序,实力雄厚的会自研浏览器内核,将小程序运行在自研的浏览器内核之上,如腾讯的X5、阿里的UC浏览器内核;
  • 原生渲染:使用JavaScript作为编程语言,通过中间层转化为原生控件来渲染UI界面,比如React Native、Weex;
  • 语言编译转换技术:直接将某个语言编译为一个平台下的二进制文件。比较有名的是Xamarin框架,利用C#代码编写;
  • 自渲染技术:通过在不同平台实现一个统一接口的渲染引擎来绘制UI,而不依赖系统平台的原生控件,这样做可以保证不同平台UI的一致性。不用像React Native一样,随着不同平台系统版本的变化,开发者还需要处理不同平台的差异,甚至有些特性只能在单个平台上实现,这样无法保证不同平台UI的一致性。具有代表性的如Qt、Flutter

小程序的跨平台方案,主要依赖于几大移动巨头,自研App实现小程序成本较高;

原生渲染的跨平台技术方案,应用最为广泛,大部分跨平台技术选型都会选择此技术,如银行、购物、新闻类多半都是采用这种技术活着混合技术,我们公司的iWork据我判断就是用的原生渲染里面的React Native技术;

自渲染技术具具有代表性的如Qt、Flutter;我个人认为最牛逼的跨平台技术,是Qt框架,其开发语言为C++,代表作WPS。

不过我们iLead选择的技术框架是Flutter框架,因为它最适合。

2. Flutter开发框架

先看一下官方的一则简介:

Flutter is Google’s UI toolkit for building beautiful, natively compiled applications for mobile, web, and desktop from a single codebase.

简单翻译一下:

Flutter是谷歌主导研发的一个UI工具包,可以利用它,使用非常简洁的代码开发出漂亮的、原生的应用程序,无论是在移动端、Web端还是桌面端。

Ps:Web端和桌面端尚未发布正式版,开发版上体验还很差,Flutter主要还是活跃于移动端。

2.1. Flutter分层结构

移动开发基础介绍 - 图7

Flutter 在设计之初,就是一个可扩展的分层架构系统。 它是各个独立的组件的系列合集,这些组件各自依赖了底层。 组件们无法越权访问更底层的内容,并且它们每一个都是可选且可替代的。

Engine毫无疑问是Flutter的核心,它基本使用 C++ 进行编写,支持所有 Flutter 应用所需的原语[1]。 当需要绘制新一帧的内容时,引擎将负责对需要合成的场景进行栅格化。 它提供了 Flutter 核心 API 的底层实现,包括图形(通过 Skia)、 文本布局、文件及网络 IO、辅助功能支持、插件架构和 Dart 运行环境及编译环境的工具链。

引擎将底层 C++ 代码包装成 Dart 代码,通过 dart:ui 暴露给 Flutter 框架层。 该库暴露了最底层的原语, 包括驱动输入、图形、和文本渲染的子系统的类。

一般而言,开发者会使用以现代语言(Dart语言)及响应式框架编写的Framework来与 Flutter进行交互。

2.2 Dart语言

2.2.1 简介

Google主导开发,于2011年10月公开,开发源码的编程语言。早期定位是成为下一代结构化Web开发语言。

从技术上来说,Dart已经支持移动端、Web端和服务器端开发;
移动开发基础介绍 - 图8

Ps. 借助于Flutter开发框架的大热,Dart才进入大部分开发者视野之中,其表现最优异的还是在移动端上。

2.2.2. 简单入门

入口函数

  1. void main(){
  2. print("Hello World!");
  3. }

变量

  1. var name = 'Voyager I';
  2. int year = 1977;
  3. var antennaDiameter = 3.7;
  4. var flybyObjects = ['Jupiter', 'Saturn', 'Uranus', 'Neptune'];
  5. var image = {
  6. 'tags': ['saturn'],
  7. 'url': '//path/to/saturn.jpg'
  8. };

函数

  1. int fibonacci(int n) {
  2. if (n == 0 || n == 1) return n;
  3. return fibonacci(n - 1) + fibonacci(n - 2);
  4. }
  5. var result = fibonacci(20);
  6. void functionTest(String name ,{int age, bool sex = false }){
  7. // 处理逻辑
  8. print("$name,${age??''},$sex")
  9. }
  10. functionTest("张三", sex = true, age = 3);// 张三,3,true
  11. functionTest("李四", age = 4); // 李四,4,false
  12. functionTest("王五"); // 王五,,false

控制语句

  1. if (year >= 2001) {
  2. print('21st century');
  3. } else if (year >= 1901) {
  4. print('20th century');
  5. }
  6. for (var object in flybyObjects) {
  7. print(object);
  8. }
  9. for (int month = 1; month <= 12; month++) {
  10. print(month);
  11. }
  12. while (year < 2016) {
  13. year += 1;
  14. }

  1. /// 航天器
  2. class Spacecraft {
  3. /// 名称
  4. String name;
  5. /// 起飞时间
  6. DateTime launchDate;
  7. // 构造函数,使用语法糖设置成员变量。
  8. Spacecraft(this.name, this.launchDate) {
  9. // 这里编写初始化代码。
  10. }
  11. // 命名构造函数,最终调用默认构造函数。
  12. Spacecraft.unlaunched(String name) : this(name, null);
  13. int get launchYear => launchDate?.year; // read-only non-final 属性
  14. // 方法。
  15. void describe() {
  16. print('飞行器: $name');
  17. if (launchDate != null) {
  18. int years =
  19. DateTime.now().difference(launchDate).inDays ~/
  20. 365;
  21. print('已起飞: $launchYear (已经飞行 $years 年)');
  22. } else {
  23. print('未起飞');
  24. }
  25. }
  26. }
  27. // 创建对象
  28. var shengZhou11 = Spacecraft("神舟十一号",DateTime(2016,10,17));
  29. shengZhou11.describe();
  30. var shengZhou12 = Spacecraft.unlaunched("神舟十二号");
  31. shengZhou12.describe();

2.3. 搭建Flutter开发环境

  • 配置Android开发环境
  • 配置XCode开发环境
  • 安装Flutter开发环境
  • 选择VS CodeAndroid Studio 作为开发工具,并安装 Flutter 插件

Flutter目前支持在Windows、Linux、MacOS、Chrome OS 四个操作系统上进行开发。大体安装类似,前提都是需要安装Git。

flutter开源地址:https://github.com/flutter/flutter.git

1. 需要用 git 或手动下载 stable 分支
  1. git clone https://github.com/flutter/flutter.git -b stable

2. 配置环境变量

flutter bin 目录加入环境变量;如果是国内网络,可再配置下国内镜像,以便下载相关类库。

  1. export PUB_HOSTED_URL=https://pub.flutter-io.cn
  2. export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn

3. 打开命令行工具进行安装
  1. flutter doctor

2.4. 创建Flutter应用程序

2.4.1. 创建应用

命令进创建

  1. flutter create flutter_project_name

详细的命令参数,可使用 flutter create -h查看。

Android Studio
Create New Flutter Project -> Flutter Application(设置项目名称,代码存放位置) -> 设置Package Name;

2.4.2. Flutter代码结构

移动开发基础介绍 - 图9

2.5 Flutter需要掌握的基础知识

  1. 计算机进程的控制通常由原语完成。所谓原语,一般是指由若干条指令组成的程序段,用来实现某个特定功能,在执行过程中不可被中断。 ↩︎