2016-09-18 18:49:23 w71451000 阅读数 8250
  • 韦东山升级版嵌入式视频之快速入门

    韦东山老师为啥要录升级版嵌入式视频? 200x年左右,嵌入式Linux在全世界、在中国刚刚兴起。 我记得我2005年进入中兴时,全部门的人正在努力学习Linux。 在2008年,我写了一本书《嵌入式Linux应用开发完全手册》。 它的大概内容是:裸机、U-boot、Linux内核、Linux设备驱动。 那时还没有这样讲解整个系统的书, 芯片厂家Linux开发包也还不完善,从bootloader到内核,再到设备驱动都不完善。 有全系统开发能力的人也很少。 于是这书也就恰逢其时,变成了畅销书。 我也根据这个思路录制了视频:裸机、U-boot、Linux内核、Linux设备驱动。 收获些许名声,带领很多人进入Linux世界。 11年过去了,嵌入式Linux世界发生了翻天覆地的变化 ① 基本系统能用 芯片厂家都会提供完整的U-boot、Linux内核、芯片上硬件资源的驱动。 方案厂家会做一些定制,比如加上某个WIFI模块,会添加这个WIFI模块的驱动。 你可以使用厂家的原始方案,或是使用/借鉴方案商的方案,做出一个“能用”的产品。 ② 基础驱动弱化;高级驱动专业化 基础的驱动,比如GPIO、UART、SPI、I2C、LCD、MMC等,有了太多的书籍、视频、示例代码,修修改改总是可以用的。 很多所谓的驱动工程师,实际上就是“调参工程师”。 我们群里有名的火哥,提出了一个概念:这些驱动就起一个“hardware enable”的作用。 高级的驱动,比如USB、PCIE、HDMI、MIPI、GPU、WIFI、蓝牙、摄像头、声卡。 体系非常复杂,很少有人能讲清楚,很多时候只是一笔带过。 配置一下应用层工具就了事,能用就成。 这些高级驱动,工作中需要专门的人来负责,非常专业。 他们是某一块的专家,比如摄像头专家、音频专家。 ③ 项目为王 你到一个公司,目的是把产品做出来,会涉及APP到内核到驱动全流程。 中小公司玩不起华为中兴的配置,需要的是全面手。 大公司里,只负责很小很小一块的镙丝钉,位置也不太稳固啊。 所以,如果你不是立志成为某方面的专家,那就做一个全栈工程师吧。 ④ 调试很重要 都说代码是3分写7分调,各种调试调优技术,可以为你的升职加薪加一把火。 基于上述4点,我录制的全新视频将有这些特点: 1. 快速入门, 2. 实战项目, 3. 驱动大全, 4. 专题, 5. 授人以渔, 6. 要做任务 另外,我们会使用多款芯片同时录制,先讲通用的原理,再单独讲各个板子的操作。 这些芯片涵盖主流芯片公司的主流芯片,让你学习工作无缝对接。 1.快速入门 入门讲究的是快速,入门之后再慢慢深入, 特别是对于急着找工作的学生,对于业余时间挑灯夜读的工作了的人,一定要快! 再从裸机、U-boot、内核、驱动这样的路线学习就不适合了,时间就拉得太长了。 搞不好学了后面忘了前面。 并且实际工作中并不需要你去弄懂U-boot,会用就行:U-boot比驱动还复杂。 讲哪些内容? 怎么讲呢? 混着讲 比如先讲LED APP,知道APP怎么调用驱动,再讲LED硬件原理和裸机,最后讲驱动的编写。 这样可以快速掌握嵌入式Linux的整套开发流程, 不必像以前那样光学习裸机就花上1、2个月。 而里面的裸机课程,也会让你在掌握硬件操作的同时,把单片机也学会了。 讲基础技能 中断、休眠-唤醒、异步通知、阻塞、内存映射等等机制,会配合驱动和APP来讲解。 这些技能是嵌入式Linux开发的基础。 而这些驱动,只会涉及LED、按制、LCD等几个驱动。 掌握了这些输入、输出的驱动和对应的APP后,你已经具备基本的开发能力了。 讲配置 我们从厂家、从方案公司基本上都可以拿到一套完整的开发环境,怎么去配置它? 需要懂shell和python等配置脚本。 效果效率优先 以前我都是现场写代码、现场写文档,字写得慢,降低了学习效率。 这次,效果与效率统一考虑,不再追求所有东西都现场写。 容易的地方可先写好代码文档,难的地方现场写。 2.实战项目 会讲解这样的涉及linux网关/服务器相关项目(不限于,请多提建议):                      定位为:快速掌握项目开发经验,丰满简历。 涉及的每一部分都会讲,比如如果涉及蓝牙,在这里只会讲怎么使用,让你能写出程序;如果要深入,可以看后面的蓝牙专题。 3. 驱动大全 包括基础驱动、高级驱动。 这些驱动都是独立成章,深入讲解。 虽然基础驱动弱化了,但是作为Linux系统开发人员,这是必备技能,并且从驱动去理解内核是一个好方法。 在讲解这些驱动时,会把驱动的运行环境,比如内核调度,进程线程等概念也讲出来,这样就可以搭建一个知识体系。 没有这些知识体系的话,对驱动的理解就太肤浅了,等于在Linux框架下写裸机,一叶障目,不见泰山。 定位为:工具、字典,用到再学习。 4. 专题 想深入学习的任何内容,都可独立为专题。 比如U-boot专题、内核内存管理专题、systemtap调试专题。

    663 人正在学习 去看看 韦东山

首先需要在Androidmanifest中添加权限

<uses-permission  android:name = "android.permission.GET_TASKS"/>

然后代码如下:

ActivityManager mAm = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
String activity_name = mAm.getRunningTasks(1).get(0).topActivity.getClassName();

activity_name就是我们获取到的activity的名称

2016-03-11 15:02:22 zhangphil 阅读数 14303
  • 韦东山升级版嵌入式视频之快速入门

    韦东山老师为啥要录升级版嵌入式视频? 200x年左右,嵌入式Linux在全世界、在中国刚刚兴起。 我记得我2005年进入中兴时,全部门的人正在努力学习Linux。 在2008年,我写了一本书《嵌入式Linux应用开发完全手册》。 它的大概内容是:裸机、U-boot、Linux内核、Linux设备驱动。 那时还没有这样讲解整个系统的书, 芯片厂家Linux开发包也还不完善,从bootloader到内核,再到设备驱动都不完善。 有全系统开发能力的人也很少。 于是这书也就恰逢其时,变成了畅销书。 我也根据这个思路录制了视频:裸机、U-boot、Linux内核、Linux设备驱动。 收获些许名声,带领很多人进入Linux世界。 11年过去了,嵌入式Linux世界发生了翻天覆地的变化 ① 基本系统能用 芯片厂家都会提供完整的U-boot、Linux内核、芯片上硬件资源的驱动。 方案厂家会做一些定制,比如加上某个WIFI模块,会添加这个WIFI模块的驱动。 你可以使用厂家的原始方案,或是使用/借鉴方案商的方案,做出一个“能用”的产品。 ② 基础驱动弱化;高级驱动专业化 基础的驱动,比如GPIO、UART、SPI、I2C、LCD、MMC等,有了太多的书籍、视频、示例代码,修修改改总是可以用的。 很多所谓的驱动工程师,实际上就是“调参工程师”。 我们群里有名的火哥,提出了一个概念:这些驱动就起一个“hardware enable”的作用。 高级的驱动,比如USB、PCIE、HDMI、MIPI、GPU、WIFI、蓝牙、摄像头、声卡。 体系非常复杂,很少有人能讲清楚,很多时候只是一笔带过。 配置一下应用层工具就了事,能用就成。 这些高级驱动,工作中需要专门的人来负责,非常专业。 他们是某一块的专家,比如摄像头专家、音频专家。 ③ 项目为王 你到一个公司,目的是把产品做出来,会涉及APP到内核到驱动全流程。 中小公司玩不起华为中兴的配置,需要的是全面手。 大公司里,只负责很小很小一块的镙丝钉,位置也不太稳固啊。 所以,如果你不是立志成为某方面的专家,那就做一个全栈工程师吧。 ④ 调试很重要 都说代码是3分写7分调,各种调试调优技术,可以为你的升职加薪加一把火。 基于上述4点,我录制的全新视频将有这些特点: 1. 快速入门, 2. 实战项目, 3. 驱动大全, 4. 专题, 5. 授人以渔, 6. 要做任务 另外,我们会使用多款芯片同时录制,先讲通用的原理,再单独讲各个板子的操作。 这些芯片涵盖主流芯片公司的主流芯片,让你学习工作无缝对接。 1.快速入门 入门讲究的是快速,入门之后再慢慢深入, 特别是对于急着找工作的学生,对于业余时间挑灯夜读的工作了的人,一定要快! 再从裸机、U-boot、内核、驱动这样的路线学习就不适合了,时间就拉得太长了。 搞不好学了后面忘了前面。 并且实际工作中并不需要你去弄懂U-boot,会用就行:U-boot比驱动还复杂。 讲哪些内容? 怎么讲呢? 混着讲 比如先讲LED APP,知道APP怎么调用驱动,再讲LED硬件原理和裸机,最后讲驱动的编写。 这样可以快速掌握嵌入式Linux的整套开发流程, 不必像以前那样光学习裸机就花上1、2个月。 而里面的裸机课程,也会让你在掌握硬件操作的同时,把单片机也学会了。 讲基础技能 中断、休眠-唤醒、异步通知、阻塞、内存映射等等机制,会配合驱动和APP来讲解。 这些技能是嵌入式Linux开发的基础。 而这些驱动,只会涉及LED、按制、LCD等几个驱动。 掌握了这些输入、输出的驱动和对应的APP后,你已经具备基本的开发能力了。 讲配置 我们从厂家、从方案公司基本上都可以拿到一套完整的开发环境,怎么去配置它? 需要懂shell和python等配置脚本。 效果效率优先 以前我都是现场写代码、现场写文档,字写得慢,降低了学习效率。 这次,效果与效率统一考虑,不再追求所有东西都现场写。 容易的地方可先写好代码文档,难的地方现场写。 2.实战项目 会讲解这样的涉及linux网关/服务器相关项目(不限于,请多提建议):                      定位为:快速掌握项目开发经验,丰满简历。 涉及的每一部分都会讲,比如如果涉及蓝牙,在这里只会讲怎么使用,让你能写出程序;如果要深入,可以看后面的蓝牙专题。 3. 驱动大全 包括基础驱动、高级驱动。 这些驱动都是独立成章,深入讲解。 虽然基础驱动弱化了,但是作为Linux系统开发人员,这是必备技能,并且从驱动去理解内核是一个好方法。 在讲解这些驱动时,会把驱动的运行环境,比如内核调度,进程线程等概念也讲出来,这样就可以搭建一个知识体系。 没有这些知识体系的话,对驱动的理解就太肤浅了,等于在Linux框架下写裸机,一叶障目,不见泰山。 定位为:工具、字典,用到再学习。 4. 专题 想深入学习的任何内容,都可独立为专题。 比如U-boot专题、内核内存管理专题、systemtap调试专题。

    663 人正在学习 去看看 韦东山
Android PDF开发:android-pdfview


Android平台自身没有直接可以阅读和处理pdf的方案,在github上面有一个第三方开源的pdf开发SDK,其主页地址是:

https://github.com/JoanZapata/android-pdfview 

android-pdfview使用比较简单,关键的地方是PDFView,将PDFView作为像Android的ImageView或者TextView一样写进xml布局文件:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
	xmlns:tools="http://schemas.android.com/tools"
	android:layout_width="match_parent"
	android:layout_height="match_parent" >

    <com.joanzapata.pdfview.PDFView
        android:id="@+id/pdfView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</FrameLayout>



然后在Java上层代码直接加载pdf文件资源装载进去即可:

package zhangphil.pdfview;

import com.joanzapata.pdfview.PDFView;
import com.joanzapata.pdfview.listener.OnPageChangeListener;

import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		PDFView pdfView = (PDFView) findViewById(R.id.pdfView);

		// 在我这个测试例子中,事先准备一个叫做sample.pdf的pdf大文件放到assets目录下。
		// 从assets文件目录下读取名为 sample.pdf的文件,缺省把该pdf定位到第一页。
		pdfView.fromAsset("sample.pdf").defaultPage(1).onPageChange(new OnPageChangeListener() {

			@Override
			public void onPageChanged(int page, int pageCount) {
				// 当用户在翻页时候将回调。
				Toast.makeText(getApplicationContext(), page + " / " + pageCount, Toast.LENGTH_SHORT).show();
			}
		}).load();
	}
}



我把该第三方开源库整理成Eclipse下可用的lib,上传到github上,地址链接:
https://github.com/zhangphil/android-pdfview-lib-for-eclipse 
使用时候,下载该lib,导入到eclipse作为lib,然后在项目中直接引用即可。
2016-05-04 10:24:22 zhangphil 阅读数 23087
  • 韦东山升级版嵌入式视频之快速入门

    韦东山老师为啥要录升级版嵌入式视频? 200x年左右,嵌入式Linux在全世界、在中国刚刚兴起。 我记得我2005年进入中兴时,全部门的人正在努力学习Linux。 在2008年,我写了一本书《嵌入式Linux应用开发完全手册》。 它的大概内容是:裸机、U-boot、Linux内核、Linux设备驱动。 那时还没有这样讲解整个系统的书, 芯片厂家Linux开发包也还不完善,从bootloader到内核,再到设备驱动都不完善。 有全系统开发能力的人也很少。 于是这书也就恰逢其时,变成了畅销书。 我也根据这个思路录制了视频:裸机、U-boot、Linux内核、Linux设备驱动。 收获些许名声,带领很多人进入Linux世界。 11年过去了,嵌入式Linux世界发生了翻天覆地的变化 ① 基本系统能用 芯片厂家都会提供完整的U-boot、Linux内核、芯片上硬件资源的驱动。 方案厂家会做一些定制,比如加上某个WIFI模块,会添加这个WIFI模块的驱动。 你可以使用厂家的原始方案,或是使用/借鉴方案商的方案,做出一个“能用”的产品。 ② 基础驱动弱化;高级驱动专业化 基础的驱动,比如GPIO、UART、SPI、I2C、LCD、MMC等,有了太多的书籍、视频、示例代码,修修改改总是可以用的。 很多所谓的驱动工程师,实际上就是“调参工程师”。 我们群里有名的火哥,提出了一个概念:这些驱动就起一个“hardware enable”的作用。 高级的驱动,比如USB、PCIE、HDMI、MIPI、GPU、WIFI、蓝牙、摄像头、声卡。 体系非常复杂,很少有人能讲清楚,很多时候只是一笔带过。 配置一下应用层工具就了事,能用就成。 这些高级驱动,工作中需要专门的人来负责,非常专业。 他们是某一块的专家,比如摄像头专家、音频专家。 ③ 项目为王 你到一个公司,目的是把产品做出来,会涉及APP到内核到驱动全流程。 中小公司玩不起华为中兴的配置,需要的是全面手。 大公司里,只负责很小很小一块的镙丝钉,位置也不太稳固啊。 所以,如果你不是立志成为某方面的专家,那就做一个全栈工程师吧。 ④ 调试很重要 都说代码是3分写7分调,各种调试调优技术,可以为你的升职加薪加一把火。 基于上述4点,我录制的全新视频将有这些特点: 1. 快速入门, 2. 实战项目, 3. 驱动大全, 4. 专题, 5. 授人以渔, 6. 要做任务 另外,我们会使用多款芯片同时录制,先讲通用的原理,再单独讲各个板子的操作。 这些芯片涵盖主流芯片公司的主流芯片,让你学习工作无缝对接。 1.快速入门 入门讲究的是快速,入门之后再慢慢深入, 特别是对于急着找工作的学生,对于业余时间挑灯夜读的工作了的人,一定要快! 再从裸机、U-boot、内核、驱动这样的路线学习就不适合了,时间就拉得太长了。 搞不好学了后面忘了前面。 并且实际工作中并不需要你去弄懂U-boot,会用就行:U-boot比驱动还复杂。 讲哪些内容? 怎么讲呢? 混着讲 比如先讲LED APP,知道APP怎么调用驱动,再讲LED硬件原理和裸机,最后讲驱动的编写。 这样可以快速掌握嵌入式Linux的整套开发流程, 不必像以前那样光学习裸机就花上1、2个月。 而里面的裸机课程,也会让你在掌握硬件操作的同时,把单片机也学会了。 讲基础技能 中断、休眠-唤醒、异步通知、阻塞、内存映射等等机制,会配合驱动和APP来讲解。 这些技能是嵌入式Linux开发的基础。 而这些驱动,只会涉及LED、按制、LCD等几个驱动。 掌握了这些输入、输出的驱动和对应的APP后,你已经具备基本的开发能力了。 讲配置 我们从厂家、从方案公司基本上都可以拿到一套完整的开发环境,怎么去配置它? 需要懂shell和python等配置脚本。 效果效率优先 以前我都是现场写代码、现场写文档,字写得慢,降低了学习效率。 这次,效果与效率统一考虑,不再追求所有东西都现场写。 容易的地方可先写好代码文档,难的地方现场写。 2.实战项目 会讲解这样的涉及linux网关/服务器相关项目(不限于,请多提建议):                      定位为:快速掌握项目开发经验,丰满简历。 涉及的每一部分都会讲,比如如果涉及蓝牙,在这里只会讲怎么使用,让你能写出程序;如果要深入,可以看后面的蓝牙专题。 3. 驱动大全 包括基础驱动、高级驱动。 这些驱动都是独立成章,深入讲解。 虽然基础驱动弱化了,但是作为Linux系统开发人员,这是必备技能,并且从驱动去理解内核是一个好方法。 在讲解这些驱动时,会把驱动的运行环境,比如内核调度,进程线程等概念也讲出来,这样就可以搭建一个知识体系。 没有这些知识体系的话,对驱动的理解就太肤浅了,等于在Linux框架下写裸机,一叶障目,不见泰山。 定位为:工具、字典,用到再学习。 4. 专题 想深入学习的任何内容,都可独立为专题。 比如U-boot专题、内核内存管理专题、systemtap调试专题。

    663 人正在学习 去看看 韦东山

Android控制文字水平间距android:letterSpacing

附录文章1实现的是Android的文字在水平方向的缩放,然而不是水平方向的文字间距。如果要想实现Android TextView之类的文字保持间距,那么需要设置android:letterSpacing,android:letterSpacing的值是一个浮点数,为标准字体的倍数作为间距。写一个小demo示例。
Xml布局代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Zhang Phil CSDN 默认" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:letterSpacing="0.1"
        android:text="Zhang Phil CSDN 0.1" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:letterSpacing="0.2"
        android:text="Zhang Phil CSDN 0.2" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:letterSpacing="0.3"
        android:text="Zhang Phil CSDN 0.3" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:letterSpacing="0.4"
        android:text="Zhang Phil CSDN 0.4" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:letterSpacing="0.5"
        android:text="Zhang Phil CSDN 0.5" />

</LinearLayout>


代码运行结果:


附录文章:
1,《Android控制水平方向字体缩放android:textScaleX》链接地址:http://blog.csdn.net/zhangphil/article/details/51306064

2016-06-14 22:03:05 u014529755 阅读数 5487
  • 韦东山升级版嵌入式视频之快速入门

    韦东山老师为啥要录升级版嵌入式视频? 200x年左右,嵌入式Linux在全世界、在中国刚刚兴起。 我记得我2005年进入中兴时,全部门的人正在努力学习Linux。 在2008年,我写了一本书《嵌入式Linux应用开发完全手册》。 它的大概内容是:裸机、U-boot、Linux内核、Linux设备驱动。 那时还没有这样讲解整个系统的书, 芯片厂家Linux开发包也还不完善,从bootloader到内核,再到设备驱动都不完善。 有全系统开发能力的人也很少。 于是这书也就恰逢其时,变成了畅销书。 我也根据这个思路录制了视频:裸机、U-boot、Linux内核、Linux设备驱动。 收获些许名声,带领很多人进入Linux世界。 11年过去了,嵌入式Linux世界发生了翻天覆地的变化 ① 基本系统能用 芯片厂家都会提供完整的U-boot、Linux内核、芯片上硬件资源的驱动。 方案厂家会做一些定制,比如加上某个WIFI模块,会添加这个WIFI模块的驱动。 你可以使用厂家的原始方案,或是使用/借鉴方案商的方案,做出一个“能用”的产品。 ② 基础驱动弱化;高级驱动专业化 基础的驱动,比如GPIO、UART、SPI、I2C、LCD、MMC等,有了太多的书籍、视频、示例代码,修修改改总是可以用的。 很多所谓的驱动工程师,实际上就是“调参工程师”。 我们群里有名的火哥,提出了一个概念:这些驱动就起一个“hardware enable”的作用。 高级的驱动,比如USB、PCIE、HDMI、MIPI、GPU、WIFI、蓝牙、摄像头、声卡。 体系非常复杂,很少有人能讲清楚,很多时候只是一笔带过。 配置一下应用层工具就了事,能用就成。 这些高级驱动,工作中需要专门的人来负责,非常专业。 他们是某一块的专家,比如摄像头专家、音频专家。 ③ 项目为王 你到一个公司,目的是把产品做出来,会涉及APP到内核到驱动全流程。 中小公司玩不起华为中兴的配置,需要的是全面手。 大公司里,只负责很小很小一块的镙丝钉,位置也不太稳固啊。 所以,如果你不是立志成为某方面的专家,那就做一个全栈工程师吧。 ④ 调试很重要 都说代码是3分写7分调,各种调试调优技术,可以为你的升职加薪加一把火。 基于上述4点,我录制的全新视频将有这些特点: 1. 快速入门, 2. 实战项目, 3. 驱动大全, 4. 专题, 5. 授人以渔, 6. 要做任务 另外,我们会使用多款芯片同时录制,先讲通用的原理,再单独讲各个板子的操作。 这些芯片涵盖主流芯片公司的主流芯片,让你学习工作无缝对接。 1.快速入门 入门讲究的是快速,入门之后再慢慢深入, 特别是对于急着找工作的学生,对于业余时间挑灯夜读的工作了的人,一定要快! 再从裸机、U-boot、内核、驱动这样的路线学习就不适合了,时间就拉得太长了。 搞不好学了后面忘了前面。 并且实际工作中并不需要你去弄懂U-boot,会用就行:U-boot比驱动还复杂。 讲哪些内容? 怎么讲呢? 混着讲 比如先讲LED APP,知道APP怎么调用驱动,再讲LED硬件原理和裸机,最后讲驱动的编写。 这样可以快速掌握嵌入式Linux的整套开发流程, 不必像以前那样光学习裸机就花上1、2个月。 而里面的裸机课程,也会让你在掌握硬件操作的同时,把单片机也学会了。 讲基础技能 中断、休眠-唤醒、异步通知、阻塞、内存映射等等机制,会配合驱动和APP来讲解。 这些技能是嵌入式Linux开发的基础。 而这些驱动,只会涉及LED、按制、LCD等几个驱动。 掌握了这些输入、输出的驱动和对应的APP后,你已经具备基本的开发能力了。 讲配置 我们从厂家、从方案公司基本上都可以拿到一套完整的开发环境,怎么去配置它? 需要懂shell和python等配置脚本。 效果效率优先 以前我都是现场写代码、现场写文档,字写得慢,降低了学习效率。 这次,效果与效率统一考虑,不再追求所有东西都现场写。 容易的地方可先写好代码文档,难的地方现场写。 2.实战项目 会讲解这样的涉及linux网关/服务器相关项目(不限于,请多提建议):                      定位为:快速掌握项目开发经验,丰满简历。 涉及的每一部分都会讲,比如如果涉及蓝牙,在这里只会讲怎么使用,让你能写出程序;如果要深入,可以看后面的蓝牙专题。 3. 驱动大全 包括基础驱动、高级驱动。 这些驱动都是独立成章,深入讲解。 虽然基础驱动弱化了,但是作为Linux系统开发人员,这是必备技能,并且从驱动去理解内核是一个好方法。 在讲解这些驱动时,会把驱动的运行环境,比如内核调度,进程线程等概念也讲出来,这样就可以搭建一个知识体系。 没有这些知识体系的话,对驱动的理解就太肤浅了,等于在Linux框架下写裸机,一叶障目,不见泰山。 定位为:工具、字典,用到再学习。 4. 专题 想深入学习的任何内容,都可独立为专题。 比如U-boot专题、内核内存管理专题、systemtap调试专题。

    663 人正在学习 去看看 韦东山

系统启动进程

android设备的启动分为三个阶段:Boot Loader, Linux Kernel,Android 系统服务。Android系统实际上是运行在Linux Kernel之上的一系列系统服务进程。init进程是Android中被启动的第一个进程,PID = 0 。它通过解析init.rc脚本来构建出android运行初始化形态(android系统服务程序大多是在这个脚本中被启动)
系统启动流程图可以从这个图里面看出,这个网上找的一张,这里是出处
这里写图片描述

init.rc初始化脚本

脚本包括actions、commands、services、options四种类型声明。
actions实际上是响应某个触发(也叫事件),当触发(事件)发生时运行action,格式如下:

on <trigger>##触发条件
    <command>##要执行的命令
    <command>##要执行的命令
    ...

常见触发有下面几种:

  • boot 。这是init程序启动后触发的第一个事件
  • device-added-< path>。当设备节点添加或者删除时触发事件
  • device-removed-< path>。
  • service-exited-< name>。当指定的name服务存在时触发事件

services是可执行程序,形式如下

service <name><pathname>[<argument>]*
    <option>
    <option>
    ...

pathname表示service程序所在路径,里面有程序源码。因为是可执行程序,所有必须有路径。
commandsoptions比较多,不一一介绍。

由于还没有编译源码,所有在source中找不到代码路径:\system\core\init\init.c,此处盗用网上一般的init.c分析,下次找到了再自己具体分析。

int main(int argc, char **argv)
{
// 1、设置子进程退出的信号处理函数:sigchld_handler
...
// 2、创建文件夹,并挂载设备
mkdir("/dev", 0755);
mkdir("/proc", 0755);
....
// 3、重定向标准输入输出错误到 /dev/__null__
...
// 4、解析 init.rc 脚本
parse_config_file("/init.rc");
// 5、解析机器相关的配置文件,一般相关的放在init.rc中利用service action调过去
snprintf(tmp, sizeof(tmp), "/init.%s.rc", hardware);
parse_config_file(tmp);
// 6、建立 uevent,用于与linux kernel交互的socket
...
// 7、初始化及加载属性相关资源
...
// 8、执行 on init 、early-boot 及 boot 片段动作,这些定义于 init.rc 中
/* execute all the boot actions to get us started */
action_for_each_trigger("init", action_add_queue_tail);
drain_action_queue();
/* execute all the boot actions to get us started */
action_for_each_trigger("early-boot", action_add_queue_tail);
action_for_each_trigger("boot", action_add_queue_tail);

9.init进程的处理循环
for(;;) {
// I、执行init.rc 脚本中的动作
drain_action_queue();
// II、执行标志为SVC_RESTARTING的进程,利用fork+execve启动新的进程
restart_processes();
...
}
return 0;
}

系统关键服务的启动简介

在上述init程序启动中,通过解析init.rc,实际上也就陆续启动了其他关键服务,这些服务中最重要的就是ServiceManager,Zygote,SystemServer三个系统服务进程。例如在启动boot触发事件中就有启动Zygote服务。

ServiceManger–DNS服务器

ServiceManager简称SM,是Android Binder机制中的”DNS服务器”,负责域名(某个Binder服务在SM中注册时提供的名字)到IP地址(由底层Binder驱动分配的值)的解析。SM在init.rc中的描述如下所示

service serviceManager /system/bin/servicemanager
    class core #同一个class名(此处为core)的所有服务进程同时启动/停止
    user system
    group system
    critical 
    onrestart restart zygote
    onrestart restart media
    onrestart restart surfaceflinger
    onrestart restart drm

/system/bin/servicemanager路径表示该服务真正的执行程序在该路径下。当SM每次重启时,其他关键进程如zygote , media, surfaceflinger, drm也会重启。

Zygote–受精卵孕育新线程/进程

Android中大多数应用进程和系统进程都是通过Zygote来生成的。zygote进程在内部会先启动虚拟机,继而加载一些必要的系统资源和系统类,最后进入一种监听状态。在后续的运作中,当其他系统模块(比如AMS)希望创建新进程时,只需向zygote进程发出请求,zygote进程监听到该请求后,会相应地“分裂”出新的进程,于是这个新进程在初生之时,就先天具有了自己的Dalvik虚拟机以及系统资源。出自这里。Zygote在init.rc中的描述如下所示

service zygote /system/bin/app_process /system/bin --zygote --start-system-server
    class main
    socket zygote stream 660 root system 
    onrestart write /sys/android_power/request_state wake
    onrestart write /sys/power/state on
    onrestart restart media
    onreatart restart netd

在app_process程序中,最核心的代码是下面这句

...
runtime.start("com.android.internal.os.zygoteInit",startSystemServer?"start-system -server":"");
...

runtime 运行时环境变量启动了虚拟机,让ZygoteInit在虚拟机上运行。Zygote.java文件提供几个static方法在ZygoteInit.java等类中被使用。例如ZygoteInit中的startSystemServer方法调用了 Zygote.forkSystemServer()方法。(实际上startSystemServer方法也是ZygoteInit主要作用之一)。
ZygoteInit的作用:

  • 启动SystemServer。该服务也是由Zygote fork而来。
  • 利用preload,预装载各种系统类,main()方法如下所示
    static void main() {
        Log.d(TAG, "begin preload");
        registerZygoteSocket();
        preloadClasses();
        preloadResources();
        startSystemServer();
        runSelectLoop();
        closeServerSocket();
    }

SystemServer–Android的系统服务

SystemServer是Android进入Launcher之前的最后准备,它提供了众多的java语言系统服务。由ZygoteInit中的startSystemServer经过层层调用(包括native code),最后到达SystemServer中的run()方法。在run()方法中:

...
 // Create the system service manager.
mSystemServiceManager = new SystemServiceManager(mSystemContext);
//应该是添加的第一个LocalService,SSM本身也是服务
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
try{
     startBootstrapServices();
     startCoreServices();
     startOtherServices();
}

在startBootstarpServices()中启动并注册了下面几种服务:

  • ActivityManagerService
  • PowerManagerService
  • DisplayManagerService
  • LightsService
  • PackageManagerService
  • UserManagerService
  • SensorService(native)

在startCoreServices()中启动并注册了下面几种服务:

  • BatteryService
  • UsageStatsService
  • WebViewUpdateService

在startOtherServices()中启动并注册了下面几种服务:

  • WindowManagerService
  • NetworkStatsService
  • InputManagerService
  • AudioService
  • CameraService

将java层的开机流程大致的画在一张图上,如下:
这里写图片描述

对于zygote,作为一个最原始的“受精卵”,它必须在合适的时机进行必要的细胞分裂。分裂动作也没什么大的花样,不过就是fork()新进程而已。如果fork()出的新进程是system server,那么其最终执行的就是SystemServer类的main()函数,而如果fork()出的新进程是普通的用户进程的话,那么其最终执行的就是ActivityThread类的main()函数。有关ActivityThread的细节,我们有时间再深入探讨,这里就不细说了。上述一段话引用自这里

至此,android启动差不多完成了,原来开机时系统竟然做了这么多事情,66666。下章分析ActivityManagerService,AMS是导致Launcher被启动的关键所在。

2017-09-01 11:42:16 qq_27061049 阅读数 4956
  • 韦东山升级版嵌入式视频之快速入门

    韦东山老师为啥要录升级版嵌入式视频? 200x年左右,嵌入式Linux在全世界、在中国刚刚兴起。 我记得我2005年进入中兴时,全部门的人正在努力学习Linux。 在2008年,我写了一本书《嵌入式Linux应用开发完全手册》。 它的大概内容是:裸机、U-boot、Linux内核、Linux设备驱动。 那时还没有这样讲解整个系统的书, 芯片厂家Linux开发包也还不完善,从bootloader到内核,再到设备驱动都不完善。 有全系统开发能力的人也很少。 于是这书也就恰逢其时,变成了畅销书。 我也根据这个思路录制了视频:裸机、U-boot、Linux内核、Linux设备驱动。 收获些许名声,带领很多人进入Linux世界。 11年过去了,嵌入式Linux世界发生了翻天覆地的变化 ① 基本系统能用 芯片厂家都会提供完整的U-boot、Linux内核、芯片上硬件资源的驱动。 方案厂家会做一些定制,比如加上某个WIFI模块,会添加这个WIFI模块的驱动。 你可以使用厂家的原始方案,或是使用/借鉴方案商的方案,做出一个“能用”的产品。 ② 基础驱动弱化;高级驱动专业化 基础的驱动,比如GPIO、UART、SPI、I2C、LCD、MMC等,有了太多的书籍、视频、示例代码,修修改改总是可以用的。 很多所谓的驱动工程师,实际上就是“调参工程师”。 我们群里有名的火哥,提出了一个概念:这些驱动就起一个“hardware enable”的作用。 高级的驱动,比如USB、PCIE、HDMI、MIPI、GPU、WIFI、蓝牙、摄像头、声卡。 体系非常复杂,很少有人能讲清楚,很多时候只是一笔带过。 配置一下应用层工具就了事,能用就成。 这些高级驱动,工作中需要专门的人来负责,非常专业。 他们是某一块的专家,比如摄像头专家、音频专家。 ③ 项目为王 你到一个公司,目的是把产品做出来,会涉及APP到内核到驱动全流程。 中小公司玩不起华为中兴的配置,需要的是全面手。 大公司里,只负责很小很小一块的镙丝钉,位置也不太稳固啊。 所以,如果你不是立志成为某方面的专家,那就做一个全栈工程师吧。 ④ 调试很重要 都说代码是3分写7分调,各种调试调优技术,可以为你的升职加薪加一把火。 基于上述4点,我录制的全新视频将有这些特点: 1. 快速入门, 2. 实战项目, 3. 驱动大全, 4. 专题, 5. 授人以渔, 6. 要做任务 另外,我们会使用多款芯片同时录制,先讲通用的原理,再单独讲各个板子的操作。 这些芯片涵盖主流芯片公司的主流芯片,让你学习工作无缝对接。 1.快速入门 入门讲究的是快速,入门之后再慢慢深入, 特别是对于急着找工作的学生,对于业余时间挑灯夜读的工作了的人,一定要快! 再从裸机、U-boot、内核、驱动这样的路线学习就不适合了,时间就拉得太长了。 搞不好学了后面忘了前面。 并且实际工作中并不需要你去弄懂U-boot,会用就行:U-boot比驱动还复杂。 讲哪些内容? 怎么讲呢? 混着讲 比如先讲LED APP,知道APP怎么调用驱动,再讲LED硬件原理和裸机,最后讲驱动的编写。 这样可以快速掌握嵌入式Linux的整套开发流程, 不必像以前那样光学习裸机就花上1、2个月。 而里面的裸机课程,也会让你在掌握硬件操作的同时,把单片机也学会了。 讲基础技能 中断、休眠-唤醒、异步通知、阻塞、内存映射等等机制,会配合驱动和APP来讲解。 这些技能是嵌入式Linux开发的基础。 而这些驱动,只会涉及LED、按制、LCD等几个驱动。 掌握了这些输入、输出的驱动和对应的APP后,你已经具备基本的开发能力了。 讲配置 我们从厂家、从方案公司基本上都可以拿到一套完整的开发环境,怎么去配置它? 需要懂shell和python等配置脚本。 效果效率优先 以前我都是现场写代码、现场写文档,字写得慢,降低了学习效率。 这次,效果与效率统一考虑,不再追求所有东西都现场写。 容易的地方可先写好代码文档,难的地方现场写。 2.实战项目 会讲解这样的涉及linux网关/服务器相关项目(不限于,请多提建议):                      定位为:快速掌握项目开发经验,丰满简历。 涉及的每一部分都会讲,比如如果涉及蓝牙,在这里只会讲怎么使用,让你能写出程序;如果要深入,可以看后面的蓝牙专题。 3. 驱动大全 包括基础驱动、高级驱动。 这些驱动都是独立成章,深入讲解。 虽然基础驱动弱化了,但是作为Linux系统开发人员,这是必备技能,并且从驱动去理解内核是一个好方法。 在讲解这些驱动时,会把驱动的运行环境,比如内核调度,进程线程等概念也讲出来,这样就可以搭建一个知识体系。 没有这些知识体系的话,对驱动的理解就太肤浅了,等于在Linux框架下写裸机,一叶障目,不见泰山。 定位为:工具、字典,用到再学习。 4. 专题 想深入学习的任何内容,都可独立为专题。 比如U-boot专题、内核内存管理专题、systemtap调试专题。

    663 人正在学习 去看看 韦东山

android 系统裁剪

有时候编译android 镜像会用到一些不需要的app 和 系统服务,我们尝试将其裁剪出去。
####1、源码目录
build/target/product/*

在此下面有不少*.mk 文件,这一找到相应的app 进行规避修改:

diff --git a/target/product/core.mk b/target/product/core.mk
index afae7c0..7b1dae7 100644
--- a/target/product/core.mk
+++ b/target/product/core.mk
@@ -27,17 +27,12 @@ PRODUCT_PACKAGES += \
     org.simalliance.openmobileapi.xml \
     BasicDreams \
     BlockedNumberProvider \
-    BookmarkProvider \
-    Browser2 \
-    Calendar \
     CalendarProvider \
     CaptivePortalLogin \
     CertInstaller \
-    Contacts \
     DeskClock \
     DocumentsUI \
     DownloadProviderUi \
-    Email \
     ExactCalculator \
     ExternalStorageProvider \
     FusedLocation \
@@ -54,7 +49,6 @@ PRODUCT_PACKAGES += \
     PrintSpooler \
     PrintRecommendationService \
     ProxyHandler \
-    QuickSearchBox \
     Settings \
     SharedStorageBackup \
     Telecom \
diff --git a/target/product/full_base.mk b/target/product/full_base.mk
index 65bdf0f..da6eb4f 100644
--- a/target/product/full_base.mk
+++ b/target/product/full_base.mk
@@ -29,10 +29,6 @@ PRODUCT_PACKAGES := \
 
 PRODUCT_PACKAGES += \
     Galaxy4 \
-    HoloSpiralWallpaper \
-    LiveWallpapers \
-    LiveWallpapersPicker \
-    MagicSmokeWallpapers \
     NoiseField \
     PhaseBeam \
     PhotoTable
diff --git a/target/product/generic_no_telephony.mk b/target/product/generic_no_telephony.mk
index 5c48358..4f9b27a 100644
--- a/target/product/generic_no_telephony.mk
+++ b/target/product/generic_no_telephony.mk
@@ -20,10 +20,6 @@
 PRODUCT_PACKAGES := \
     Bluetooth \
     BluetoothMidiService \
-    Camera2 \
-    Gallery2 \
-    Music \
-    MusicFX \
     OneTimeInitializer \
     Provision \
     SystemUI \
diff --git a/target/product/sdk_base.mk b/target/product/sdk_base.mk
index fa257ae..13997ad 100644
--- a/target/product/sdk_base.mk
+++ b/target/product/sdk_base.mk
@@ -18,23 +18,16 @@ PRODUCT_PROPERTY_OVERRIDES :=
 
 PRODUCT_PACKAGES := \
 	ApiDemos \
-	CubeLiveWallpapers \
 	CustomLocale \
 	Development \
-	Dialer \
 	EmulatorSmokeTests \
 	Fallback \
-	Gallery \
 	GestureBuilder \
 	Launcher3 \
-	LegacyCamera \
 	librs_jni \
 	libwnndict \
 	libWnnEngDic \
 	libWnnJpnDic \
-	LiveWallpapersPicker \
-	Mms \
-	Music \
 	OpenWnn \
 	Protips \
 	rild \
diff --git a/target/product/telephony.mk b/target/product/telephony.mk
index e840ba1..5c05fa1 100644
--- a/target/product/telephony.mk
+++ b/target/product/telephony.mk
@@ -19,7 +19,6 @@
 
 PRODUCT_PACKAGES := \
     CarrierConfig \
-    Dialer \
     CallLogBackup \
     CellBroadcastReceiver \
     EmergencyInfo \

对于一些服务 可以修改 frameworks/base/services/java/com/android/server/SystemServer.java

将里面的相关的 systemserver.java 去掉。

例如:


            mContentResolver = context.getContentResolver();

//            Slog.i(TAG, "Camera Service");
            // mSystemServiceManager.startService(CameraService.class);

          
            traceBeginAndSlog("StartAccountManagerService");

Android屏幕抓取工具

博文 来自: jlminghui
没有更多推荐了,返回首页