Android / iOS 开发异同概览

2017-07-04  本文已影响54人  carbs

0 系统概览

0.1 Android

0.1.1 起源

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

0.1.2 架构

Android 系统架构

0.1.2.1 应用层

主要使用java语言开发的应用程序,如通讯录、浏览器等各种应用app

0.1.2.2 应用框架层

视图(View):可以用来构建应用程序,如列表,文本框,WebView浏览器组件等。
内容提供器(Content Provider):对外部其他应用提供数据
资源管理器(Resource Manager):提供非代码资源的访问,如本地字符串,图形,布局文件等。
通知管理器(Notification Manager):使得应用程序可以在状态栏中显示自定义的提示信息。
活动管理器( Activity Manager):用来管理应用程序生命周期并提供常用的导航回退功能。

0.1.2.3 系统运行库

Android 包含一些C/C++库,这些库能被Android系统中不同的组件使用。它们通过 Android 应用程序框架为开发者提供服务。

0.1.2.3.1 程序库
0.1.2.3.2 Android 运行库

Android 包括了一个核心库,该核心库提供了JAVA编程语言核心库的大多数功能。
  每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。Dalvik被设计成一个设备可以同时高效地运行多个虚拟系统。 Dalvik虚拟机执行(.dex)的Dalvik可执行文件,该格式文件针对小内存使用做了优化。同时虚拟机是基于寄存器的,所有的类都经由JAVA编译器编译,然后通过SDK中 的 "dx" 工具转化成.dex格式由虚拟机执行。
  Dalvik虚拟机依赖于linux内核的一些功能,比如线程机制和底层内存管理机制。

0.1.2.4 Linux 内核

Android 的核心系统服务依赖于 Linux 2.6 内核,如安全性,内存管理,进程管理, 网络协议栈和驱动模型。 Linux 内核也同时作为硬件和软件栈之间的抽象层。

0.2 iOS

0.2.1 起源

iOS是由苹果公司开发的移动操作系统。苹果公司最早于2007年1月9日的Macworld大会上公布这个系统,最初是设计给iPhone使用的,后来陆续套用到iPod touch、iPad以及Apple TV等产品上。iOS与苹果的Mac OS X操作系统一样,属于类Unix的商业操作系统。

0.2.2 架构

iOS 系统架构

0.2.2.1 可触摸层

Cocoa Touch是可触摸层,这一层为我们的应用程序开发提供了各种有用的框架,并且大部分与用户界面有关,本质上来说它负责用户在iOS设备上的触摸交互操作。

0.2.2.2 多媒体层

Media是媒体层,通过它我们可以在应用程序中使用各种媒体文件,进行音频与视频的录制,图形的绘制,以及制作基础的动画效果。

0.2.2.3 核心服务层

Core Services是核心服务层,可以通过它来访问iOS的一些服务。

0.2.2.4 核心操作系统层

Core OS是位于iOS系统架构最下面的一层是核心操作系统层,它包括内存管理、文件系统、电源管理以及一些其他的操作系统任务。它可以直接和硬件设备进行交互。作为app开发者不需要与这一层打交道。

1 应用程序的开发语言及开发环境

1.1 Android

1.1.1 编程语言

Android使用的语言主要是Java,也可以通过jni来运行C语言编写的代码或者库,从而提高运行效率。
  Kotlin是Google推荐的新的编程语言

1.1.2 开发环境

上古时代:集成了 android 开发插件的 Eclipse,使用的是Ant构建工具
  摩登时代:Android Studio,源自 jetbrain 的 idea开发工具 ,使用gradle构建项目

1.1.3 操作系统要求

windows / linux / mac

Android Studio

1.2 iOS

1.2.1 编程语言

iOS使用的语言主要是objective-c语言,发明于上世纪八十年代
  Swift是这几年开始推荐的语言

1.2.2 开发环境

Xcode开发环境,必须使用mac系统才能开发。

1.1.3 操作系统要求

mac

Xcode

2 项目代码组成概览

2.1 Android

Android程序主要有以下几个部分组成:

2.1.1 activity

  1. 作为一个“窗体/页面”,承载着不同的 view / fragment等组件,是可见组件的承载者
  2. 一个有界面的程序,会在配置文件中指定系统入口窗体。
  3. 一般来说,activity finish掉之后,其中的代码也就运行结束了。
  4. activity需要注册到程序的声明文件中,才可以被使用
  5. activity的跳转可使用startActivity(intent)的方式。跳转方式有显式指定和隐式指定,可以打开其他应用程序的activity,做到应用程序之间的数据交互,intent也可以携带数据。
  6. activity是通过系统来调用的,不可以进行new的操作。
  7. 一般可以在activity的生命周期的回调函数中,添加代码,如在onCreate函数中添加布局文件

2.1.2 service

  1. 不可见组件,一些常驻后台的功能,可以添加到service中运行,从而减小被后台杀死的几率。

2.1.3 content provider

  1. 内容提供者,可以对其它程序提供数据,通过在配置文件中声明+代码的方式,应用程序可以向外部提供数据

2.1.4 application

  1. 一个应用程序只有一个application
  2. 可以在此application的回调函数中进行编码,如初始化某些数据等。

2.1.5 R

  1. R文件一般存放于特定的文件夹中,如图片、字符串、尺寸等都放置在一定格式的xml下,这些xml资源文件在打包时,会被生成的R.java文件所引用,并生成对应的int型的id值,程序运行时,可以通过R.xx.xxx这样的方式,找到资源文件,并通过系统提供的如getString(R.xx.xxx)这样的api获取String等资源
  2. 布局文件存放在资源文件夹中的layout文件夹下,以R.layout.xxx的方式引用,activity或者view的显示,通常可以通过加载layout文件来解析显示界面
Android 工程 代码展开

2.2 iOS

iOS程序主要有以下几个部分组成:

2.1.1 UIViewController

  1. 作为一个“窗体/页面”,承载着不同的 UIView等组件,是可见组件的承载者
  2. 一个有界面的程序,可在AppDelegate中使用代码的方式指定程序第一个界面,也可以在配置界面中指定第一个storyboard,并在对应的storyboard中指定第一个UIViewController
  3. UIViewController具有生命周期回调函数,可以在对应的回调函数中添加相关代码,如布局,处理数据等,主要的回调函数有:
[UIViewController loadView]
[UIViewController viewDidLoad]
[UIViewController viewWillAppear:]
[UIViewController shouldAutorotateToInterfaceOrientation:]
[UIViewController viewWillLayoutSubviews]
[UIView layoutSubviews]
[UIViewController viewDidLayoutSubviews]
[UIViewController viewDidAppear:]
  1. 对于普通的UIViewController,可以使用下面的方法进行界面之间的跳转:
-(void) toMainViewControllerAfterSeconds{
    MainViewController *mainVC = [[MainViewController alloc] init];
    [self presentViewController:mainVC animated:YES completion:nil];
}

其中的数据可以通过UIViewController对象自定义属性/变量来传递

  1. 特殊的UINavigationController

UINavigationController用来管理视图控制器,在多视图控制器中常用。它以栈的形式管理视图控制器,管理视图控制器个数理论上不受限制(实际受内存限制),push和pop方法来弹入弹出控制器,最多只能显示一个视图控制器,那就是处于栈顶的视图控制器。
  一般情况下,UINavigationController最少管理一个控制器,即最少有一个根视图控制器或者叫做栈底视图控制器。当然也有例外,如果不给它添加视图控制器也不会报错,界面上也有视图,因为UINavigationController继承自UIViewController,也有自己的view,只不过默认情况下.view.backgroundColor为nil,即透明的。

2.1.2 程序入口

Android中,程序入口是由AndroidManifest.xml文件中响应的xml配置指定的application以及程序的activity入口。iOS中,程序的入口是main.h文件

#import <UIKit/UIKit.h>
#import "AppDelegate.h"

int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

在这里指定了程序的代理,AppDelegate类,相当于是android的application类。

#import "AppDelegate.h"
#import "SplashViewController.h"
@interface AppDelegate ()
@end
@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    SplashViewController *appStartController = [[SplashViewController alloc] init];
    self.window.rootViewController = appStartController;
    [self.window makeKeyAndVisible];
    return YES;
}
- (void)applicationWillResignActive:(UIApplication *)application {
}
- (void)applicationDidEnterBackground:(UIApplication *)application {   
}
- (void)applicationWillEnterForeground:(UIApplication *)application {   
}
- (void)applicationDidBecomeActive:(UIApplication *)application { 
}
- (void)applicationWillTerminate:(UIApplication *)application {   
}
@end

AppDelegate的头文件:

#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@end

2.1.3 资源文件

iOS中的资源文件可以放在任意一个文件夹下,但特点是整个工程不能有重复的文件名。在图片适配方面,iOS采用图片名称+@2x.png 的方式,适配大屏手机。Android采用的是放置在不同的资源文件夹下,如drawable drawable-hdpi drawable-xxhdpi等,同一个相同图片文件的名称必须相同。

2.1.4 添加view

Android添加view采用的是使用layout文件的方式,也可以使用代码的方式,即addView()。
  iOS可以使用xcode提供的storyboard工具,来拖动调整控件,并通过在storyboard文件中指定对应的viewcontroller类,来对viewcontroller进行view的布局,也可以使用代码addSubView的方式进行添加,由于iOS的布局代码布局方式比较繁琐,一般采用第三方的代码布局方案,如masonry:

    [_statusBarView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(self.view).offset(0);
        make.size.mas_equalTo(CGSizeMake(self.view.frame.size.width, UI_STATUS_BAR_HEIGHT));
    }];

3. 引用开源库的方式

3.1 iOS

可采用pod的方式引用

  1. 在项目根目录下新建一个Podfile
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
target 'TestOC' do
    pod 'AFNetworking', '~> 2.6.3’
    pod 'Masonry'
    pod 'Toast', '~> 3.1.0'
    pod 'JSONModel'
    pod 'SDWebImage', '~>3.8'
end
  1. 在命令行下使用pod install即可安装,然后使用xcode打开 iosProjectName.xcworkspace文件

3.2 Android

可采用gradle的方式引用

  1. 在项目的build.gradle文件中,添加dependencies、插件等
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
target 'TestOC' do
    pod 'AFNetworking', '~> 2.6.3’
    pod 'Masonry'
    pod 'Toast', '~> 3.1.0'
    pod 'JSONModel'
    pod 'SDWebImage', '~>3.8'
end
  1. 在命令行下使用pod install即可安装,然后使用xcode打开 iosProjectName.xcworkspace文件
apply plugin: 'com.android.application'
apply plugin: 'io.fabric'
apply plugin: 'com.neenbedankt.android-apt'

android {
    useLibrary 'org.apache.http.legacy'

    dexOptions {
        jumboMode = true
        javaMaxHeapSize = "6g"
        dexInProcess = true
    }

    compileSdkVersion 25
    buildToolsVersion "25.0.3"

    defaultConfig {
        applicationId "org.wordpress.android"
        versionName "alpha-62"
        versionCode 426
        minSdkVersion 16
        targetSdkVersion 25

        multiDexEnabled true
        vectorDrawables.useSupportLibrary = true

        buildConfigField "boolean", "AZTEC_EDITOR_AVAILABLE", "true"
        buildConfigField "boolean", "SHARING_FEATURE_AVAILABLE", "false"
        buildConfigField "boolean", "VIDEO_OPTIMIZATION_AVAILABLE", "false"
    }

    productFlavors {
        vanilla { // used for release and beta
            buildConfigField "boolean", "AZTEC_EDITOR_AVAILABLE", "false"
        }

        zalpha { // alpha version - enable experimental features
            applicationId "org.wordpress.android"
            buildConfigField "boolean", "SHARING_FEATURE_AVAILABLE", "true"
            buildConfigField "boolean", "VIDEO_OPTIMIZATION_AVAILABLE", "true"
        }

        wasabi { // "hot" version, can be installed along release, alpha or beta versions
            applicationId "org.wordpress.android.beta"
            minSdkVersion 21 // to take advantage of "fast" multi dex (pre-dex each module)
            buildConfigField "boolean", "SHARING_FEATURE_AVAILABLE", "true"
        }
    }

    buildTypes {
        release {
            // Proguard is used to shrink our apk, and reduce the number of methods in our final apk,
            // but we don't obfuscate the bytecode.
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard.cfg'
        }

        debug {
            minifyEnabled false
            buildConfigField "String", "APP_PN_KEY", "\"org.wordpress.android.debug.build\""
            buildConfigField "boolean", "VIDEO_OPTIMIZATION_AVAILABLE", "true"
            ext.enableCrashlytics = false
        }
    }
}

dependencies {
    compile('com.crashlytics.sdk.android:crashlytics:2.5.5@aar') {
        transitive = true;
    }

    // Provided by maven central
    compile 'com.google.code.gson:gson:2.6.+'
    compile 'org.ccil.cowan.tagsoup:tagsoup:1.2.1'

    compile 'com.android.support:support-compat:25.3.1'
    compile 'com.android.support:support-core-ui:25.3.1'
    compile 'com.android.support:support-fragment:25.3.1'

    compile 'com.android.support:multidex:1.0.1'
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support:cardview-v7:25.3.1'
}

4. 著名的开源项目

1. ios

项目名称 项目信息
AFNetworking 作者是 NSHipster 的博主, iOS 开发界的大神级人物, 毕业于卡内基·梅隆大学, 开源了许多牛逼的项目, 这个便是其中之一, AFNetworking 采用 NSURLConnection + NSOperation, 主要方便与服务端 API 进行数据交换, 操作简单, 功能强大, 现在许多人都用它取代 ASIHTTPRequest
GPUImage 一款强大的图片滤镜工具, 支持自定义滤镜, 可用来实时处理图片和视频流, 作者是 SonoPlot 公司的 CTO, 在很小的时候便开始接触编程, 他在 SO 上面的回答也有很多值得阅读, GPUImage 这个项目从 2012 年开始, 使用 OpenGL 图形程序接口编写, 性能非常好, 现在很多 iOS 程序员都用它来实现 iOS 的模糊效果
SDWebImage 作者 Olivier Poitrey 是 Dailymotion 的 CTO, 拥有多个不错的开源项目, 此项目常用于对从 Web 端接受到的图片进行缓存, 是 UIImageView 的扩展, 应用起来比较简单
RestKit 主要用于 iOS 上网络通信, 允许与 RESTful Web 服务交互, 常用于处理 API, 解析 JSON, 映射响应对象等操作, 简单易用, 方便你把所有精力都放在对数据的操作上
ReactiveCocoa 由 GitHub 工程师们开发的一个应用于 iOS 和 OS X 开发的函数响应式编程新框架, Matt 称其为 "An open source project that exemplifies this brave new era for Objective-C", 也有人说它是 Cocoa 的未来, 具体可看唐巧写的这篇文章
three20 由 Facebook iOS 客户端衍生出的一款 iPhone 框架, 内置许多丰富的功能, 有丰富的界面, 对底层的操作便捷, 为开发者省下了很多时间, 但现在已经停止了更新, 一个 PR 把代码删得干干净净, 不要好奇去点开 Files changed, 我点开后该页面直接卡死, three20 当中的一位作者创建了 Nimbus, 算是 three20 的一个替代品
MBProgressHUD 作者 Matej Bukovinski 是一位全栈工程师, UI/UX 设计师, 此项目是一款提示框第三方库, 帮助开发者快速应用到项目中)
MagicalRecord 作者是 Coursera 的 iOS 工程师, 该项目创作灵感来自于 Ruby on Rails 的 Active Record, 主要为方便操作 CoreData 而生, 帮助清除 CoreData 引用的代码, 协助方便 CoreData 的工作
FMDB 一个对 SQLite 进行封装的库, 使用起来方便, 简单
Mantle 作者是 GitHub 的员工, 文档写的很清楚: Mantle makes it easy to write a simple model layer for your Cocoa or Cocoa Touch application, 主要用来将 JSON 数据模型化为 Model 对象, 唱吧在前段时间也改用 Mantle 了.
FlatUIKit 收集了很多扁平化 UI 的 iOS 组件, 方便使用
ASIHTTPRequest 一个轻量级的 iOS 网络通信类库, 基于 CFNetwork 框架开发, 但现在已经停止更新, 多数开发者改用 AFNetworking 替代)
FastImageCache Path 公司出品的 iOS 库, 作者 Mallory Paine 是苹果前员工, 此类库适用于在滚动时快速显示图像, 高速持久是其最大的特点
Masonry 一个轻量级的布局框架, 同时支持 iOS 和 Mac OS X, 语法优雅, 帮助开发者快速适配不同分辨率的 iOS 设备
Shimmer Facebook 推出的一款具有闪烁效果的第三方控件, 供它旗下一款名为 Paper 的应用使用, 安装使用整个过程都十分简单
SVProgressHUD 又一款轻量级的 iOS 第三方控件, 用于显示任务加载时的动画, 非常轻便, 容易使用
Slate 一款窗口管理应用程序, 但在两年前就已经停止更新了
JSONKit 主要用于解析 JSON, 适用于 iOS6 以下环境, 自从 iOS5 开始 Apple 官方给出了 NSJSONSerialization API, 自此大家都用官方的了

2 Android

项目名称 项目简介
react-native 这个是 Facebook 在 React.js Conf 2015 大会上推出的基于 JavaScript 的开源框架 React Native, 该框架结合了 Web 应用和 Native 应用的优势, 可以使用 JavaScript 来开发 iOS 和 Android 原生应用
Android-Universal-Image-Loader ImageLoader 是最早开源的 Android 图片缓存库, 强大的缓存机制, 早期被广泛 Android 应用使用, 至今仍然有很多 Android 开发者在使用
RxJava RxJava 是一个在 Java VM 上使用可观测的序列来组成异步的, 基于事件的程序的库, 简单来说它就是一个实现异步操作的库, RxJava 的优点在于一个词 "简洁", 使用它就算你程序逻辑有多么复杂, 它依然能够保持简洁易懂
retrofit Retrofit 是 Square 公司出品的 HTTP 请求库, 同时是 Square 是最早开源项目之一, Retrofit 是目前 Android 最流行的 Http Client 库之一, 目前版本是 Retrofit2.0 Beta4, 越来越多 Android 开发者开始使用这个请求库了
okhttp OkHttp 是 Square 公司出品的 HTTP 另一个请求库, Google 不推荐人们使用 HttpClient, 可是 HttpURLConnection 实在是太难用了, 因此很多人使用了 OkHttp 来解决这问题, 据说 Android4.4 的源码中可以看到 HttpURLConnection 已经替换成 OkHttp 实现呢
SlidingMenu(不建议使用) 一个侧滑菜单开源库, 在 Google 自己原生态的侧滑菜单 NavigationDrawer 没有出现之前, 这个库就已经被广泛使用, 可是到现在这个库已经被放弃了
picasso Picasso 是 Square 公司出品的一款图片缓存库, 主导者是 JakeWharton 大神
android-best-practices Android 开发最佳实践, 里面所介绍的经验都是来自于 Futurice 公司 Android 开发者, 介绍内容有 Android 开发规范, 架构, 布局技巧, 以及使用一些有助于快速开发相关工具等等, 非常适合新手去学习
EventBus EventBus 是 Android 事件管理总线, 使用它可以替带 Android BroadCast, BroadCastReceiver, Handler 在 Activity, Fragment, Service, 线程之间传递消息, 大大简化了事件传递逻辑
android-async-http Android-Async-Http 是 Android 一款老牌异步请求库, 专门对 Android 在 Apache 的 HttpClient 基础上构建的异步 http 连接, 该库有很多特征, 例如: 库的 size 小, 支持文件上传不需使用第三方库支持, 内部使用线程池来处理并发, 等等
fresco Fresco 是 FaceBook 公司出品的一款图片缓存库, Fresco 是一个强大的图片加载组件, 支持加载 Gif 图和 WebP 格式, 支持 Android2.3(API level 9) 及其以上系统, Fresco 中设计了 Image pipeline 和 Drawees 两个模块各施其职, 使得图片完美加载出来, 想知道更多 image pipeline 和 Drawees 有关于它的特性, 可以到它官方平台看介绍
zxing ZXing 是二维码领域中名气最大的开源项目, 它提供了多个平台的二维码/条形码扫描解决方案, 拥有扫描快, 识别率高, 使用简单等特点
leakcanary LeakCanary 是 Square 公司出的一款检测内存泄露工具, 该工具能帮助你在开发阶段方便的检测出内存泄露的问题, 使用起来非常简单方便
butterknife 由 JakeWharton 大神开发出来的, ButterKnife 是 View 注入框架, 使用它为了简写很多 findViewById 代码, 同时还支持 View 的一些事件处理函数
MPAndroidChart MPAndroidChart 是一款强大的 Android 图表库, 支持各种各样图表显示, 能想到的图表样式这里几乎都有, 图表还支持选择, 拖放和缩放动画效果
ActionBarSherlock (不建议使用) ActionBarSherlock 这个库是 JakeWharton 大神开发出来支持 Android3.0 以下版本的, 后来慢慢的 Google 也提供了 AppCompat 库来支持 Android3.0 以下版本使用 ActionBar, 因此作者不建议我们再使用这个库了
androidannotations AndroidAnnotations 是一个能够让你快速进行 Android 开发的开源框架, 它能让你专注于真正重要的地方, 使代码更加精简, 使项目更加容易维护, 它的目标就是 "Fast Android Development.Easy maintainance"
ViewPagerIndicator 由 JakeWharton 大神开发出来的一个 ViewPager 指示器, 使用起来简单方便, 可高度定制, 开发出各种各样动画效果
glide Glide 是 Google 员工的开源项目, 广泛应用于 Google 一些 App 上, 在2014年 Google I/O 大会上被推荐使用, Glide 和 Picasso 被人拿来比较研究过, Glide 与 Picasso 有 90% 的相似度, 但在一些细节上还是有点区别的, 各有各优缺点看君选择
HomeMirror 开发者是由一名程序媛 Hannah Mittelstaedt , HomeMirror 是一款 Android 镜子应用, 目前它能实现日期, 时间, 天气, 生日信息, 事件提醒器, 骑车天气的推荐, 股票信息, XKCD 漫画网站的新帖等等
Android-PullToRefresh(不建议使用) 一个强大的拉动刷新开源项目, 支持各种控件下拉刷新, ListView, ViewPager, WebView, ExpandableListView, GridView, ScrollView, Horizontal ScrollView, Fragment 上下左右拉动刷新, 不过现在这个项目已经停止维护更新了, 推荐使用 Android-Ultra-Pull-To-Refresh
MaterialDesignLibrary 这个库控件都是遵循了 Google Material Design 设计规范开发出来, 例如有: Flat Button, Rectangle Button, CheckBox, Switch, Progress bar circular indeterminate 等等
PhotoView PhotoView 是 ImageView 的子类, 支持所有 ImageView 的源生行为, 例如: 支持 Pinch 手势自由缩放, 支持双击放大/还原, 支持平滑滚动等等, 并且非常方便的与 ImageLoader/Picasso 之类的网络图片读取库集成使用, 还方便的与 ViewPager 等同样支持滑动手势的控件集成
RxAndroid 由 JakeWharton 大神主导开发的项目, RxAndroid 是 RxJava 的一个针对 Android 平台的扩展, 主要用于 Android 开发

未完待续

上一篇下一篇

猜你喜欢

热点阅读