android实战培训课程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android实战培训课程相关的知识,希望对你有一定的参考价值。

参考技术A ⑴ 安卓培训主要学习哪儿些内容

每个人准备培训情况和基础都是不一样的,但是看了你的问题之后觉得咱俩的情况还是很相似的,我是去年毕业的,当时我学的是计算机专业,当时在学校的时候开的各门的课程都是以理论基础为主要的,我也不是说大学的教育不好,可是当时的课程一般都是教授级别的给我们讲一般的模式就是老师讲课在上面念PPT我们在下面拍照,等最后考试的时候老师直接给我们划题答案背过基本这一年就这样过去了,技术类的东西是真心没学到,后来华清远见到我们学校和我们学校合作,给我们弄得安卓方面的实训课程,觉得自己欠缺的很多的,也是怕和你这种情况一样找不到理想的工作,所以我就在华清远见进行的安卓培训,当时我们的学习内容主要有以下几点,其实各种的培训班的课程都是大同小异的老师属于一部分的因素最关键的还是要靠自己的。
第一阶段的课程一般都是Java编程开发,这一部分应该会和Java后台有相关联的地方,但是比Java后台简单,这一阶段一般要学习Java语法和Java面向对象思想、Java数据结构及算法、GUI界面编程、Java进程与线程、Java网络通信与流、设计模式、数据库和Javaweb,安卓在这一阶段的学习内容看似和后台关联性很大,但是这一部分我们只学习后台一些基础的东西和日后会用到的东西,我们要把基础奠定好。

第二阶段要学习的内容是安卓基础开发,主要的课程内容为android界面编程(界面编程是Android入门的核心技术,内容纵多,涉及四大组件之一Activity、Wedget、自定义View、事件处理、动画处理、列表、图片处理、国际化、资源文件、菜单、通知、对话框、Tools/ActionBar/Fragment、样式/主题、Intent。)、进程与线程、服务与广播、数据存储、网络通信、多媒体以及硬件相关,这一阶段更注重安卓入门基础的培训,一定要好好的把握。
接下来学习的内容是一个进阶阶段,主要学习的是安卓的高级开发,一般的课程内容为HOME开发、NDK开发等、地图开发项目发布等等,以上就算是安卓培训的所有学习内容,但是你掌握了学习内容之后还是远远不够的,一般的培训班都会给我们安排项目实战的,这是一种思想的锻炼,我们做什么就要有什么的思维做后台的有做后台的思维,做前端的有做前段的思维,我们学安卓的进行手机端APP开发的就要有安卓的思维,这一阶段也是很重要的,就好比我们在华清远见学完整体的内容之后也参与了一些项目的实战。

我把每一阶段要学习的课程都给你整理了,你可以现在有准备的去看一些基础的视频或者相关的书籍了。

⑵ 我想学习安卓开发,哪个培训机构靠谱呢

没什么好与不好,建议对比师资选择,管理团队拥有平均10年以上IT培训行业从业经验,核心讲师团队由Mars、老罗、饼干等移动互联网传奇名师领衔,以良知教学为本、责任心强,平均8年的执教经验,在业内首屈一指,教学方面可以不用担心。

⑶ 现在的安卓教育培训是真的吗

当然是真的,首先国内移动互联时代是移动应用App的爆发式增长,人们的消费与使回用倾向正逐渐向移动答端转移,这种趋势就如同当初的互联网一样势不可挡。从各项统计来看,现在App的大行其道,正慢慢的吞噬着软件业。都说互联网改变了我们的生活,不过短短的数年时间,带来的却是一整个属于移动端的时代。
其次移动开发行业的人才供不应求,缺口逐渐加大,所以除了专业的开发者,也吸引了一大群尝试择业的在职者和优秀毕业生。与此同时,移动端的教育培训缺口也被打开,一些经典的如Android开发培训课程受到了学员们热烈的追捧。

数据表明,当前Android已经占到移动系统的80%以上。因而越来越多的应届毕业生与在职者从原来的专业或职业中走出来,拥抱IT,拥抱移动互联网这个朝气蓬勃的产业。首选就是学Android开发,因而选择好的线上或线下Android培训机构就显得极为重要。

最后好的Android开发培训课程,必然来自好的Android开发培训机构。尚硅谷教育通过全日制小班授课与项目实战相结合的形式,全方位的服务学员,专注于移动互联网领域高端课程的研发。

⑷ Android培训课程有什么内容

今后,业界将有两种移动开发课程体系:一种是其他机构Android课程,一种是尚硅谷Android+html5混合开发课程。

尚硅谷Android课程全面升级为《Android+HTML5混合开发》,让学员如虎添翼!在原Android课程基础上加入HTML、CSS、javascript、React核心,React Native跨平台混合开发、豆瓣搜索项目实战等H5前端技术。

当前,同时掌握“Android原生开发”+“H5跨平台开发”两大核心技术的复合型移动开发人才严重供不应求,薪资节节攀升,就业及未来职业发展都极具竞争力。

⑸ 安卓系统 培训 有什么课题可以选

只要写GUI开发就可以了,这本身就很深奥了。可以从以下着眼: 1.GUI框架 2.各个控键的重复使用 3.高扩展性 4.性能优化 可以参考一下《Java Swing ...

⑹ 安卓培训多少钱,安卓培训课程有哪些

Android培训周期一般都是4个月,至于培训费用大部分培训机构的收费标准都不相上下,部分Android高端培训费用会偏高一点,费用2W+。选择Android培训除了看培训机构外也要看自身条件,适合参加什么样的培训,例如普通还是高端,普通的Android培训零基础也可以,但高端Android培训就需要计算机语言基础了。

程序员Android高端班课程,是一套涵盖 Java 语言强化、Java Web 开发、Android 应用开发、Android 游戏开发的专业课程。本套课程真正围绕Android知识体系制订,绝非由Java EE课程、Java ME课程或者Symbian课程改造而成。每一阶段课程涵盖多个实战项目,每个知识点均对应项目中实际功能,学习新知识的同时不断向项目中添加新功能,独特的教学方法帮助学员强化学习目标,迅速提升学习能力。致力于培养Android 高端开发人才,旨在培养真正的 Android 应用和游戏开发能力的高素质人才,学员毕业即具备行业前沿开发技术。
第一阶段 Java面向对象高级编程——java编程语法进阶
该阶段课程重点讲解了面向对象设计原则与设计模式;智能家居之远程监控。
Java面向对象编程
1、面向对象设计原则
2、面向对象设计模式概要
3、面向对象设计模式a.创建型设计模式b.结构型设计模式c.行为模式4、数据结构与常用算法
第二阶段 高级JDK API开发技术 —— Java Web编程
该阶段课程重点讲解了JDK当中的高级API的使用方法,包括新的并发线程库和反射机制。手机安全卫士
Java Web编程
1、并发线程库介绍
2、线程本地变量的使用方法
3、信号量与可重入锁
4、读写锁的使用方法
5、阻塞队列与同步 *** 库使用方法
6、Java反射机制介绍
7、Class、Field和Method的使用方法
8、动态代理模式的使用方法
9、Java框架开发原理
第三阶段 Android基础阶段大纲
一、UI基础
1.Android环境搭建及工程目录介绍:1.1 Android开发(版本:SDK21及以上版本)环境搭建1.2 Android发展史、移动设备操作系统、四层系统架构等理论知识1.3 HelloWorld程序1.4 adb shell简介(install uninstall)
2.常用UI布局及主要控件2.1 LinearLayout2.2 RelativeLayout2.3 FrameLayout2.4 GridLayout2.5 TextView基本用法
3.表单UI控件及相应控件的事件处理3.1 EditText、Button、ImageView3.2 RadioButton及RadioGroup的用法3.3 CheckBox的多选效果及监听3.4 Toast的基本用法
4.Spinner、AutoCompleteTextView、ScrollView及适配器、数组资源4.1 Spinner4.2 适配器4.3 数组资源4.4 AutoCompleteTextView4.5 ScrollView4.6 ProgressBar、SeekBar、RatingBar
5.UI美化及Android资源5.1 Style的简单用法5.2 Android资源汇总
二、应用核心组件初识
1.Activity生命周期及页面跳转传值1.1 Activity的声明和使用1.2 Activity生命周期1.3 Activity现场保护1.4 Activity基本页面跳转及传值1.5 Activity具有返回值的页面跳转
2.Activity启动模式及Intent七大属性2.1 Task和Back Stack的基本概念2.2 Activity的启动模式2.3 Intent属性的特点及用法
3.AsyncTask异步任务3.1 使用异步任务的必要性3.2 异步任务的用法
4.ListView基本用法及适配器介绍4.1 ListView基本用法4.2 SimpleAdapter4.3 BaseAdapter
5.ListView优化及分页加载数据、GridView加载网络图片、ExpandableListView5.1 ListView优化5.2 ListView滚动监听实现分页加载数据5.3 GridView加载图片
三、数据存储
1.菜单及对话框1.1 OptionsMenu1.2 ContextMenu1.3 PopupMenu1.4 PopupWindow1.5 AlertDialog1.6 ProgressDialog1.7 列表对话框1.8 自定义Dialog
2.数据存储2.1 SharedPreferences2.2 内部存储2.3 外部存储2.4 存储Bitmap图片到外部存储
3.SQLite数据库与CursorAdapter适配器3.1 回顾SQLite3.2 SQLiteOpenHelper的用法3.3 CursorAdapter
4.ContentProvider4.1 ContentResolver实现系统数据库的操作4.2 自定义ContentProvider
5.Loader5.1 CursorLoader的用法5.2 AsyncTaskLoader加载本地数据
四、移动开发主流界面实现
1.动画资源1.1 帧动画1.2 补间动画1.3 属性动画
2.Fragment2.1 Fragment基本用法2.2 Fragment传值2.3 Fragment性能优化
3.ViewPager3.1 ViewPager与适配器3.2 ViewPager加载网络图片3.3 PagerAdapter的优化
4.书签导航4.1 书签导航多种实现方式(无需代码实现)4.2 RadioGroup + ViewPager + Fragment实现导航4.3 HorizontalScrollView + ViewPager + Fragment实现导航
5.Handler、Looper消息传递机制5.1 Handler、Looper消息传递机制的原理5.2 Handler、Looper源码
五、应用核心组件进阶(Android Studio开发环境教学)
1.ActionBar (Action View、SearchView)+ ToolBar1.1 ActionBar1.2 ToolBar
2.BroadcastReceiver及Notification2.1 Notification (普通通知、大视图通知、进度条通知、自定义通知)2.2 广播接收器2.3 自定义发送广播
3.Service基础3.1 Service介绍3.2 Start Service3.3 IntentService3.4 Bind Service3.5 两种服务混合使用实现MediaPlayer音乐播放
4.跨进程的Service4.1 AIDL4.2 Messenger
5.LruCache与Bitmap二次采样、WebView与HTML5混合开发5.1 LruCache5.2 二次采样5.3 WebView5.4 HTML5混合开发
六、View深入探究
1.网络地图1.1 网络地图基本用法1.2 网络地图搜索
2. 事件分发消费机制2.1 事件分发消费机制原理2.2 事件分发消费机制的应用场景
3.自定义View(一)3.1 自定义View介绍3.2 自绘制的自定义View
4.自定义View(二)4.1 具有接口回调的自定义View4.2 继承于ViewGroup的自定义View
5.机型适配及SVN搭建5.1 机型适配介绍5.2 屏幕相关重要概念回顾5.3 机型适配的解决方案5.4 SVN搭建
第四阶段 Android项目实战阶段大纲
一、项目实战第一阶段
1.TabLayout及SlidingPaneLayout1.1 TabLayout(5.0Material Design新技术)与ViewPager配合自定义Tab1.2 SlidingPaneLayout左侧或右侧滑动1.3 NavigationView(5.0Material Design新技术)HeaderLayoutMenu xml配置Navigation监听事件
2.okHttp网络访问框架及Picasso2.1 okHttp框架的介绍2.2 okHttp框架的用法Http请求方法:get,post同步请求,异步请求(回调在非UI线程中)2.3 Picasso加载网络图片的用法简单图片请求Picasso通用配置:内存缓存大小,磁盘缓存大小及位置图片加载配置:下载尺寸,填充模式,加载中图片,错误图片2.4 第三方侧滑菜单:SlidingMenu菜单设置
3.Fresco(壁画异步加载图片框架)3.1 Fresco框架的介绍3.2 Fresco框架的用法(中文文档)简单图片请求Fresco通用配置:内存缓存大小,磁盘缓存大小及位置图片加载配置:下载尺寸,填充模式,加载中图片,错误图片,顶层,底层,图片变形
4.PullToRefresh、SwipeRefreshLayout及Ultra PullToRefresh4.1 PullToRefresh框架配置事件回调多种控件PullToRefreshBase重写4.2 SwipeRefreshLayout配置事件回调4.3 Ultra PullToRefresh(中文文档)配置事件回调多种下拉效果
5.打包(按渠道打包)、混淆及数字签名5.1 按渠道打包基本打包多渠道:资源,清单文件,代码,调试5.2 混淆开启混淆混淆配置:保留类,保留方法,忽略错误5.3 数字签名生成keystore配置签名
二、项目实战第二阶段——Android新技术
1.RecyclerView1.1 5.0新技术介绍(Material Design)设计理念、新增控件1.2 RecyclerView的用法、CardView的用法1.3 RecyclerView与ListView比较
2.5.0Material Design新技术2.1 CoordinatorLayoutToolbar与Layout2.2 TextInputLayout错误监听2.3 Snackbar监听Action2.4 FloatingActionButton属性介绍onClick
3.媒体播放器3.1 视频播放器VideoView3.2 SurfaceView及MediaPlayerSurfaceView介绍与View区别SurfaceHolder与CallBackMediaPlayer.setDisplayMediaPlayer加载网络视频3.3 获取视频缩略图使用Fresco3.4 ListView的item实现视频播放Item显示视频单Item播放Item滚出时停止播放3.5 播放器全屏显示与恢复3.6 Vitamio(维他密播放器)
4.摄像头、传感器、ZXing二维码4.1 利用Intent实现摄像头两种模式,存文件和缩略图4.2 加速度传感器实现《摇一摇》传感器获取传感器监听注册加速度传感 摇一摇4.3 ZXing实现生成二维码(容错等级、二维码正中心Logo)生成BitMatrix转Bitmap容错等级中心Logo4.4 ZXing实现二维码扫描导包
5.JPush推送、ShareSDK一键分享及第三方登录5.1 JPush极光推送的原理及用法通知推送消息推送推送原理5.2 ShareSDK一键分享及第三方登录注册集成分享第三方登录APIOAuth介绍
三、项目实战第三阶段
1.加密解密1.1 对称加密(AES 、DES、3DES)1.2 非对称加密(RSA)1.3 消息摘要(MD5、 SHA-1 )1.4 编码解码(Base64、URLEncode、URLDecode)
2.网络支付2.1 Alipay支付2.2 微信支付
3.ButterKnife(反转注入框架)、EventBus、ActiveAndroid(数据库ORM框架)及Retrofit(网络访问框架)3.1 ButterKnife(反转注入框架)3.2 EventBus的用法3.3 ActiveAndroid(数据库ORM框架)3.4 Retrofit(网络访问框架)
4.项目实战需知4.1Git、UML4.2XMPP4.3常见面试题4.4移动端与服务器端的交互流程4.5移动开发工程师与web工程师工作配合的流程4.6面试常用技巧(面试禁忌)4.7开发规范(代码规范)
第五阶段 就业指导及职业规划

⑺ 求比较好的android培训的课程

可以看看android培训学习课程大纲了解下,课程分阶段进行,不同阶段学习的详细内容可以看下。

第一阶段:Android编程基础--JavaSE阶段()
Java语言入门
1、介绍计算机的基本使用和DOS常用命令 2、Java概述和开发环境 3、关键字、标识符、常量与变量 4、数据类型和运算符
5、流程控制与数组 6、方法的定义及格式、正确的调用方法
OOP编程
1、面向对象编程(OOP)、类和对象 2、成员变量和局部变量、方法(方法重载)、匿名对象 3、构造方法、封装、this关键字
4、方法参数的传递(传值、传址)、static关键字 5、继承、super关键字、方法的重写、访问修饰符权限 6、抽象类与抽象方法、接口
7、多态(对象的多态,对象的转型) 内部类和常用的设计模式
Java核心API
1、异常、异常处理,自定义异常
2、java基础类库:Object类、Scanner类、String类、StringBuffer类、
StringBuilder类、Arrays类、基本包装类(拆箱、装箱)、正则表达式、Math类、Random类、System类、Date类、DateFormate类、Calendar类,及其常用方法
3、 *** 框架:Collcetion接口、List接口、Set接口、Iterator接口、Map接口
4、List接口:ArrayList类、LinkedList类、Vector类、Stack类 Set接口:HashSet类、TreeSet类、Map接口: HashMap类、HashTable类、LinkedHashMap类、TreeMap类
5、泛型的使用
6、File类、File类的常用方法
7、I/O操作:IO流的种类,IO流的使用(字节输入/输出流、字符输入/输出流、 字节(字符)缓存流、转换流、打印流、内存流、对象流、随机读取流) 多线程的使用(Thread类的常用方法、线程的生命周期,线程的实现、线程的安全问题)
网络与Web应用
1、Socket编程
2、HTML(结构,form表单)、Servlet简介
3、SQLite数据库的使用
4、HTTP网络访问(URL类、HttpURLConnection类、HttpClient类)
5、JSON解析(JSON的格式、JSON的常用解析:JSON、Gson、fastJson)
6、XML解析(XML简介、两种常用的解析方式: PULL解析、SAX解析) 反射机制

第二阶段:Android开发初级阶段

UI基础
1、Android发展史及四层系统架构
2、Android环境搭建及SDK介绍
3、创建第一个Android程序
4、Eclipse开发APP的目录结构
5、Android Studio开发APP的目录结构
6、adb shell简介
7、View常用属性
8、Android长度相关单位的概念、区别及转换运算(sp、dp、dip、px、dpi)
9、LinearLayout及RelativeLayout特有属性
10、FrameLayout及GridLayout特有属性
11、TextView、EditText、Button、ImageView基本用法
12、RadioButton及RadioGroup的用法
13、CheckBox的多选效果及监听
14、Spinner常用属性及适配器
15、AutoCompleteTextView、ScrollView、ProgressBar、SeekBar、RatingBar的基本用法
16、Style的作用及基本用法
17、Android常用资源(id、字符串资源、颜色资源、尺寸资源、布局资源、数组资源、样式和主题资源 、菜单资源、图像资源、动画资源、原生xml资源、raw资源、特殊Drawable资源、自定义属性资源)
应用核心组件初识
1、Activity生命周期及页面跳转传值
2、ctivity启动模式及Intent七大属性
3、AsyncTask异步任务 ListView常用属性、方法及监听器ListView与ArrayAdapter的使用
4、ListView与SimpleAdapter的使用
5、SimpleAdapter与ViewBinder结合使用
6、ListView与BaseAdapter
7、ListView优化(内存空间优化、运行时间优化、ListView中item多布局的复用)
8、ListView滚动监听实现分页加载数据
9、GridView加载图片
10、ExpandableListView的用法
数据存储及相关组件
1、菜单及对话框 (OptionsMenu、ContextMenu、PopupMenu、PopupWindow、AlertDialog、ProgressDialog、列表对话框、自定义Dialog)
2、SharedPreferences
3、内部存储的概念及用法
4、外部存储的概念、存储目录及用法
5、存储Bitmap图片到外部存储
6、SQLite数据库与CursorAdapter适配器
7、ContentProvider与ContentResolver的概念及关系
8、ContentResolver实现系统数据的操作(联系人、媒体库文件、通话记录、短信记录)
9、自定义ContentProvider
10、CursorLoader的使用场景及用法
11、AsyncTaskLoader的用法以及与CursorLoader的对比
移动开发主流界面实现
1、动画资源(帧动画、补间动画、属性动画)
2、Fragment基本用法
3、Fragment传值
4、Fragment性能优化
5、EventBus的作用以及在Fragment中的应用
6、ViewPager基本使用(ViewPager实现欢迎引导页)
7、ViewPager的适配器PagerAdapter、FragmentPagerAdapter、FragmentStatePagerAdapter
8、ViewPager加载网络图片
9、PagerAdapter优化
10、TAB书签导航的多种实现方式
11、RadioGroup + ViewPager + Fragment实现TAB导航HorizontalScrollView + ViewPager + Fragment实现TAB导航
应用核心组件进阶
1、ActionBar基本用法(ActionBar显示和隐藏、ActionBar添加动作项、ActionBar启动图标导航、分离式ActionBar、
ActionBar导航模式、ActionBar现场保护 Action View的介绍、ActionProvider)
2、ActionBar上SearchView的用法
3、ToolBar的基本用法
4、ToolBar的Standalone用法
5、Notification (普通通知、大视图通知、进度条通知、自定义通知)
6、广播接收器的概念、作用、分类及注册
7、广播接收器实现系统监听(开机监听、短信监听、电话监听、耳机插拔监听、网络状态改变监听、电量改变监听)
8、自定义发送广播(发送无序广播、有序广播、发送本地广播、注册本地广播接收器 )
9、Service的概念、分类、生命周期、注册及使用场景
10、Start Service实现音乐播放器
11、IntentService实现网络视频文件下载
12、DownloadManager实现网络视频文件下载
13、Bind Service实现音乐播放器
14、两种服务混合使用实现MediaPlayer音乐播放
15、AIDL跨进程Service的概念及用法
16、Messenger的概念及用法
17、Handler、Looper消息传递机制的原理
18、Handler、Looper源码分析
19、LruCache与Bitmap二次采样
20、WebView基本用法以及与5交互
View深入探究
1、事件分发消费机制的原理分析及应用场景
2、自定义View的常规做法
3、自绘制的自定义View(画布Canvas、画笔Paint、重写onDraw()方法、重写onMeasure()方法、自定义属性)
4、组合式自定义View
5、具有手势监听的自定义View
6、继承于ViewGroup的自定义布局
7、Android中机型适配出现的原因(系统碎片和屏幕碎片)
8、机型适配的解决方案(屏幕适配:相对布局、尺寸限定符、最小宽度限定符、屏幕方向限定符、自动拉伸位图,版本适配,语言自适应)

第三阶段:Android开发高级阶段

常用第三方框架
1、网络地图(网络地图API及配置、网络地图定位及覆盖物、网络POI检索、出行线路规划、公交路线查询)
2、第三方侧滑菜单SlidingMenu及与原生DrawerLayout、SlidingPaneLayout的对比
3、UIL(universal-image-loader)图片加载框架
4、okHttp网络访问框架
5、Picasso加载网络图片框架
6、Fresco加载图片框架
7、xUtils3、0框架
8、PullToRefresh下拉刷新框架
9、Ultra PullToRefresh下拉刷新框架
10、ButterKnife(反转注入框架)
11、ActiveAndroid(数据库ORM框架)
12、Retrofit(网络访问框架)
Android5.0新技术
1、RecyclerView及CardView
2、ExpandableRecyclerView CoordinatorLayout协调AppBarLayout、CollapsingToolbarLayout、NestedScrollView、 Toolbar、RecyclerView等控件实现特殊滚动效果
3、TextInputLayout与TextWatcher
4、FloatingActionButton
5、Snackbar
6、TabLayout介绍以及与ViewPager、Fragment配合实现TAB导航效果
7、NavigationView介绍以及结合DrawerLayout使用SwipeRefreshLayout下拉刷新控件
其他高级技术
1、媒体播放器(MediaPlayer、VideoView、SurfaceView及MediaPlayer)
2、Vitamio第三方播放器
3、摄像头
4、传感器
5、ZXing二维码
6、JPush极光推送
7、ShareSDK一键分享及
8、第三方登录
9、Alipay支付及微信支付
10、加密解密(编码解码、对称加密、非对称加密、消息摘要)/p>

第四阶段:Android项目实战阶段
APP开发
1、商业应用项目模拟(项目结构分析及设计、UML、Git、SVN、打包混淆及数字签名)
2、移动开发工程师与web工程师工作配合的流程
3、常见面试题
4、面试常用技巧(面试禁忌)
5、开发规范(代码规范)

⑻ google android官方培训课程中文版这个学完够吗

不够啊,你在多拿几个项目练练手

千里马Android Framework实战课程-应用程序app的Binder启动篇

csdn在线学习课程,课程咨询答疑和新课信息:QQ交流群:422901085进行课程讨论

android跨进程通信实战视频课程(加群获取优惠)
上一个学习专题zygote启动app进程时候,有简单讲过一下binder启动,但没有详细进行分析。这一节进行重点详细分析。

Android Framework实战视频–SystemServer启动篇
进程通过zygote进行fork后调用ZygoteInit.nativeZygoteInit(),是一个native方法,实现在AndroidRuntime里面,最后调到app_main.cpp的onZygoteInit,来启动binder线程池

virtual void onZygoteInit()
    {
        sp<ProcessState> proc = ProcessState::self();
        ALOGV("App process: starting thread pool.\\n");
        proc->startThreadPool();
    }

1、先主要来详细看看ProcessState的启动

sp<ProcessState> ProcessState::self()
{
    Mutex::Autolock _l(gProcessMutex);
    if (gProcess != nullptr) {
        return gProcess;
    }
    gProcess = new ProcessState(kDefaultDriver);
    return gProcess;
}

实际是构造一个ProcessState对象

ProcessState::ProcessState(const char *driver)
    : mDriverName(String8(driver))
    , mDriverFD(open_driver(driver))//这里有调用open_driver
    , mVMStart(MAP_FAILED)
    , mThreadCountLock(PTHREAD_MUTEX_INITIALIZER)
    , mThreadCountDecrement(PTHREAD_COND_INITIALIZER)
    , mExecutingThreadsCount(0)
    , mMaxThreads(DEFAULT_MAX_BINDER_THREADS)
    , mStarvationStartTimeMs(0)
    , mManagesContexts(false)
    , mBinderContextCheckFunc(NULL)
    , mBinderContextUserData(NULL)
    , mThreadPoolStarted(false)
    , mThreadPoolSeq(1)
{
    if (mDriverFD >= 0) {
        // mmap the binder, providing a chunk of virtual address space to receive transactions.
        mVMStart = mmap(0, BINDER_VM_SIZE, PROT_READ, MAP_PRIVATE | MAP_NORESERVE, mDriverFD, 0);
        if (mVMStart == MAP_FAILED) {
            // *sigh*
            ALOGE("Using /dev/binder failed: unable to mmap transaction memory.\\n");
            close(mDriverFD);
            mDriverFD = -1;
            mDriverName.clear();
        }
    }

    LOG_ALWAYS_FATAL_IF(mDriverFD < 0, "Binder driver could not be opened.  Terminating.");
}

这里主要就是做了2件事:1.open了binder驱动 2.调用了binder的mmap方法申请对应的内存

注意这里的映射的内存大小是多少呢?BINDER_VM_SIZE:

#define BINDER_VM_SIZE ((1 * 1024 * 1024) - sysconf(_SC_PAGE_SIZE) * 2)
这里sysconf(_SC_PAGE_SIZE) 代表是一页内存大小一般为:4096个字节也就是4K

2、接下来在分析startThreadPool()

void ProcessState::startThreadPool()
{
    AutoMutex _l(mLock);
    if (!mThreadPoolStarted) {
        mThreadPoolStarted = true;
        spawnPooledThread(true);
    }
}

这里刚开始mThreadPoolStarted应该为false,在接下来是spawnPooledThread

void ProcessState::spawnPooledThread(bool isMain)
{
    if (mThreadPoolStarted) {
        String8 name = makeBinderThreadName();
        ALOGV("Spawning new pooled thread, name=%s\\n", name.string());
        sp<Thread> t = new PoolThread(isMain);
        t->run(name.string());
    }
}

在这里就启动了一个PoolThread线程,而且我们传递的isMain应该为true
再来看看PoolThread,这个就是在之前的专题已经讲过(native的thread篇),就不再重复了

class PoolThread : public Thread
{
public:
    explicit PoolThread(bool isMain)
        : mIsMain(isMain)
    {
    }
    
protected:
    virtual bool threadLoop()
    {
        IPCThreadState::self()->joinThreadPool(mIsMain);
        return false;
    }
    
    const bool mIsMain;
};

IPCThreadState* IPCThreadState::self()
{
// 判断gHaveTLS是true还是false,字面意思也可以知道是用来标记有无TLS(Thread Loacal Storage)的
    if (gHaveTLS) {
restart:
        const pthread_key_t k = gTLS;
        //如果存在TLS,则根据key:gTLS去获取存储指向IPCThreadState对象的指针值,
        //这是一个一对多的关系,所有线程使用相同的key,但是其每个线程存储的值(IPCThreadState对象)
        //是线程私有的,每个线程都有一个这样的对象
        IPCThreadState* st = (IPCThreadState*)pthread_getspecific(k); 
        if (st) return st;
        //如果此线程不存在这样的key:gTLS对应的值,则创建一个IPCThreadState新对象,
        //并在其构造函数中添加进key:gTLS对应的线程局部空间中TLS(thread local storage)
        return new IPCThreadState; 
    }

    pthread_mutex_lock(&gTLSMutex);
    if (!gHaveTLS) { //gHaveTLS为false表示进程中还没有TLS,则需要创建基于key:gTLS的线程局部存储
        //创建基于key:gTLS的线程局部空间
        int key_create_value = pthread_key_create(&gTLS, threadDestructor);
        if (key_create_value != 0) {
            pthread_mutex_unlock(&gTLSMutex);
            return NULL;
        }
        gHaveTLS = true; //此时已经有TLS了,固gHaveTLS赋值为ture
    }
    pthread_mutex_unlock(&gTLSMutex);
    goto restart;
}

这里可以看出这个对象是针对每个线程独立的,进程第一次启动会pthread_key_create创建,后面线程就会看看是否已经存在,如果没有存在则对线程进行构造new IPCThreadState,在构造函数中add自己这个IPCThreadState对象

IPCThreadState::IPCThreadState()
    : mProcess(ProcessState::self()),
      mStrictModePolicy(0),
      mLastTransactionBinderFlags(0)
{
    pthread_setspecific(gTLS, this);
    clearCaller();
    mIn.setDataCapacity(256);
    mOut.setDataCapacity(256);
}

接下来这里又会调用IPCThreadState::self()->joinThreadPool(mIsMain);
IPCThreadState::joinThreadPool()函数的目的是让线程进入到循环中,等待命令,解析命令,给出响应,函数体如下:
这里传递是isMain为true 所以会给驱动发送一个BC_ENTER_LOOPER 进入循环命令

void IPCThreadState::joinThreadPool(bool isMain)
{
    LOG_THREADPOOL("**** THREAD %p (PID %d) IS JOINING THE THREAD POOL\\n", (void*)pthread_self(), getpid());

    mOut.writeInt32(isMain ? BC_ENTER_LOOPER : BC_REGISTER_LOOPER);

    status_t result;
    do {
        processPendingDerefs();
        // now get the next command to be processed, waiting if necessary
        result = getAndExecuteCommand();

        if (result < NO_ERROR && result != TIMED_OUT && result != -ECONNREFUSED && result != -EBADF) {
            ALOGE("getAndExecuteCommand(fd=%d) returned unexpected error %d, aborting",
                  mProcess->mDriverFD, result);
            abort();
        }

        // Let this thread exit the thread pool if it is no longer
        // needed and it is not the main process thread.
        if(result == TIMED_OUT && !isMain) {
            break;
        }
    } while (result != -ECONNREFUSED && result != -EBADF);

    LOG_THREADPOOL("**** THREAD %p (PID %d) IS LEAVING THE THREAD POOL err=%d\\n",
        (void*)pthread_self(), getpid(), result);

    mOut.writeInt32(BC_EXIT_LOOPER);
    talkWithDriver(false);
}

IPCThreadState::joinThreadPool()函数主要是在一个do…while()循环里面不断的读取命令数据,然后解析命令数据,并给出相应的响应。

那么最后总结一下都干了什么app刚开始启动Binder时候:
1、打开binder驱动
2、binder映射对应的内存
3、启动binder线程
4、获取IPCThread对象
5、通知binder驱动已经进入循环

以上是关于android实战培训课程的主要内容,如果未能解决你的问题,请参考以下文章

Android Framework实战开发视频--跨进程通信之课程介绍

Android Framework实战开发视频--跨进程通信之课程介绍

第二版高仿Android网易云音乐企业级项目实战课程介绍

千里马Android Framework实战开发-native程序之间binder通信实战案例分析

千里马Android Framework实战开发-native程序之间binder通信实战案例分析

千里马Android Framework实战开发-native程序之间binder通信实战案例分析