Android / iOS 开发异同概览
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 程序库
- 系统C库 - 标准C系统函数库Libc,它是专门为基于Embedded linux的设备定制的。
- 媒体库 - 基于PacketVideo OpenCORE。该库支持多种常用的音频、视频格式回放和录制,同时支持静态图像文件。编码格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。
- SQLite - 一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。
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 Studio1.2 iOS
1.2.1 编程语言
iOS使用的语言主要是objective-c语言,发明于上世纪八十年代
Swift是这几年开始推荐的语言
1.2.2 开发环境
Xcode开发环境,必须使用mac系统才能开发。
1.1.3 操作系统要求
mac
Xcode2 项目代码组成概览
2.1 Android
Android程序主要有以下几个部分组成:
2.1.1 activity
- 作为一个“窗体/页面”,承载着不同的 view / fragment等组件,是可见组件的承载者
- 一个有界面的程序,会在配置文件中指定系统入口窗体。
- 一般来说,activity finish掉之后,其中的代码也就运行结束了。
- activity需要注册到程序的声明文件中,才可以被使用
- activity的跳转可使用startActivity(intent)的方式。跳转方式有显式指定和隐式指定,可以打开其他应用程序的activity,做到应用程序之间的数据交互,intent也可以携带数据。
- activity是通过系统来调用的,不可以进行new的操作。
- 一般可以在activity的生命周期的回调函数中,添加代码,如在onCreate函数中添加布局文件
2.1.2 service
- 不可见组件,一些常驻后台的功能,可以添加到service中运行,从而减小被后台杀死的几率。
2.1.3 content provider
- 内容提供者,可以对其它程序提供数据,通过在配置文件中声明+代码的方式,应用程序可以向外部提供数据
2.1.4 application
- 一个应用程序只有一个application
- 可以在此application的回调函数中进行编码,如初始化某些数据等。
2.1.5 R
- R文件一般存放于特定的文件夹中,如图片、字符串、尺寸等都放置在一定格式的xml下,这些xml资源文件在打包时,会被生成的R.java文件所引用,并生成对应的int型的id值,程序运行时,可以通过R.xx.xxx这样的方式,找到资源文件,并通过系统提供的如getString(R.xx.xxx)这样的api获取String等资源
- 布局文件存放在资源文件夹中的layout文件夹下,以R.layout.xxx的方式引用,activity或者view的显示,通常可以通过加载layout文件来解析显示界面
2.2 iOS
iOS程序主要有以下几个部分组成:
2.1.1 UIViewController
- 作为一个“窗体/页面”,承载着不同的 UIView等组件,是可见组件的承载者
- 一个有界面的程序,可在AppDelegate中使用代码的方式指定程序第一个界面,也可以在配置界面中指定第一个storyboard,并在对应的storyboard中指定第一个UIViewController
- UIViewController具有生命周期回调函数,可以在对应的回调函数中添加相关代码,如布局,处理数据等,主要的回调函数有:
[UIViewController loadView]
[UIViewController viewDidLoad]
[UIViewController viewWillAppear:]
[UIViewController shouldAutorotateToInterfaceOrientation:]
[UIViewController viewWillLayoutSubviews]
[UIView layoutSubviews]
[UIViewController viewDidLayoutSubviews]
[UIViewController viewDidAppear:]
- 对于普通的UIViewController,可以使用下面的方法进行界面之间的跳转:
-(void) toMainViewControllerAfterSeconds{
MainViewController *mainVC = [[MainViewController alloc] init];
[self presentViewController:mainVC animated:YES completion:nil];
}
其中的数据可以通过UIViewController对象自定义属性/变量来传递
- 特殊的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的方式引用
- 在项目根目录下新建一个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
- 在命令行下使用pod install即可安装,然后使用xcode打开 iosProjectName.xcworkspace文件
3.2 Android
可采用gradle的方式引用
- 在项目的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
- 在命令行下使用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 开发 |
未完待续