课程3: Android启动过程分析

相关技术文章 首先参阅一下别人写得很不错的文章,个人感觉还是有很多可以借鉴的内容 1. Android启动过程深入解析 原文链接 当然,小伙伴们若是英文足够好,可以直接查看:英文原文 我们先来粗略查看一下文章要点 ####第一步:启动电源以及系统启动 当电源按下,引导芯片代码开始从预定义的地方(固化在ROM)开始执行。 ####第二步:引导程序 引导程序是运行的第一个程序,因此它是针对特定的主板与芯片的; 引导程序是OEM厂商或者运营商加锁和限制的地方; ####第三步:内核 Android内核与桌面linux内核启动的方式差不多。 ####第四步:init进程 init进程有两个责任,一是挂载目录,比如/sys、/dev、/proc,二是运行init.rc脚本 ####第五步:Zygote Zygote让Dalvik虚拟机共享代码、低内存占用以及最小的启动时间成为可能。 Zygote是一个虚拟器进程,正如我们在前一个步骤所说的在系统引导的时候启动。Zygote预加载以及初始化核心库类。 ####第六步:系统服务或服务 系统服务同时使用native以及java编写,系统服务可以认为是一个进程。 系统服务包含了所有的System Services。 Zygote创建新的进程去启动系统服务。你可以在ZygoteInit类的”startSystemServer”方法中找到源代码。 ####第七步:引导完成 ACTION_BOOT_COMPLETED 启动已完成的广播 备注:在init.rc上还可以使用on property:dev.bootcomplete=1来处理你期望开机完成后做爱做的事情 2. Android启动分析 原文链接 由于前一篇文章,在system_server或services上讲解不够深入,现在利用这一篇文章来粗略讲解一下 关于这个文章的英文原文: 链接: Android Start Up 接下来这一段,我是依据 链接: 2.3服务启动过程 来讲解有关 system_server和Services的内容 ####1. daemons和Zygote init.……

阅读全文

课程3: Android系统知识(一)

Android系统知识 这一部分主要针对Androi系统整个框架,列出几个重要的Android系统关系图,进行讲解一下; 因为Android基于Linux内核,所以先从Linux基础开始讲解,然后再逐渐引入Android系统框架; Linux Kernel Map Linux Kernel Map这一张图主要是针对开发人员提供的,有兴趣的童鞋可以大致了解一下; 源链接 若对Android Kernel与Linux Kernel的差异感兴趣,可以参考这里 ANDROID LINUX KERNEL ADDITIONS 简单列举如下: binder: 进程通信驱动 ashmem: 匿名共享内存驱动 pmem: process memory allocator logger: 打印日志驱动 wake locks: 一但有用户层、或Kernel拿到此锁就阻止手机进入低功耗状态 early suspend: Linux电源管理的扩展,LCD、重力感应、传感器依赖于它才能在睡眠时工作; oom handling: android out of memory killer, 内存管理(以前Android手机内存很小,这个很有必要) android alarm: 闹钟服务,允许用户空间控制闹钟 android paranoid network security: 通过uid控制网络访问权限 android timed output/gpio: 暴露定时gpio模块到用户空间,供震动模块调用 android ram console: 允许保存一部分printk信息到一小段内存上/proc/last_kmsg,方便调试 other android differences: yaffs2, bluetooth, scheduleer, adb Map of GNU/Linux OS Internals 这是一张GNU/Linux系统各层调用关系图,利用它,我们可以进一步完善SSLVPN、VMP和VDC等案例的设计;……

阅读全文

Android抓取所有日志

总有些时候我们会遇到非必现场景,若未及时抓取日志,可能为时已晚 抓取日志 抓取Logcat日志 这个是最简单的,使用-f重定向到一个文本文件即可,-v threadtime则显示详细时间和进程 # for logcat { log -t logcat_all "start logcat to file: $logcat_file" /system/bin/logcat -v threadtime -f $logcat_file } & 抓取Kmsg日志 通过抓取/proc/kmsg来完成 # for kmsg { log -t logcat_all "start kmsg to file: $kmsg_logfile" cat /proc/kmsg >$kmsg_logfile } & 抓取Top日志 通过抓取Top可以看到系统运行时,占用CPU的情况等等 # for top { while busybox true; do top_newtime=$(/system/bin/date +%F_%H-%M-%S) top_logfile=$logcat_dir/top_${top_newtime}.log && > $top_logfile log -t logcat_all "start top to file: $top_logfile" # 仅保留5个top日志文件 # 5*100*3=25分钟内的Top信息,避免Top日志文件过大 busybox rm -f $(busybox ls -1t ${logcat_dir}/top_* | busybox tail -n +6) for n in $(busybox seq 1 100) ; do # 每3秒打印一次top信息,并加入时间显示 top -m 5 -d 3 -t -n 1 | busybox awk '{now=strftime("%Y-%M-%d %T "); print now $0}' >>$top_logfile echo >>$top_logfile done done } & 为了方便分析结果,这里添加了详细时间,同时限定了Top输出大小(避免SD卡占用过快)……

阅读全文

Android Studio迁移闪退

很久没有撸Android App开发了~ 最近把一个月前通过反编译、二次修改的 Android SSHD 项目进行简单修改一下; 突然发现迁移项目时,报了一个错误,同时还出现了闪退情况: 04-29 20:20:11.493: W/dalvikvm(23964): threadid=1: thread exiting with uncaught exception (group=0x41b2cc50) 04-29 20:20:11.543: E/StubController(23964): service = null 感觉像是迁移过程中没完整导致的,解决方法很简单,就是把java目录重命名为src即可; 历史提交记录……

阅读全文

Eclipse ADT定制

配置自动补全: Windows -> preferences -> 搜索assist,修改 java xml自动触发补全: .abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_ 自动补全插件: Eclipse Tab自动补全 Windows -> Preference -> 搜索 Assist,C/C++、Java、XML都输入(或追加): .abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_ 直接替换文件方法: # 备份文件 find eclipse/plugins -name \*jface.text\* -exec mv -v {} {}.bak \; # 复制文件到 eclipse/plugins/org.eclipse.jface.text_3.8.2.v20121126-164145.jar #(要相同版本才可以) 修改边框过大以及颜色配置: 3.1. 修改提示框背景颜色: 路径:/usr/share/themes/Greybird/gtk-2.0/gtkrc 修改: gtk-color-scheme = "tooltip_bg_color:#f2edbc\ntooltip_fg_color:#000000" # Tooltips. 3.2. 修改全局背景颜色: gtk-color-scheme = "bg_color:#cce8cf\nselected_bg_color:#398ee7\nbase_color:#fcfcfc" # Background, base. 3.3. 修改eclispe背景颜色: windows->Preferences->General->Editor->Text Editors->Backgroud color修改成#fcfcfc 3.……

阅读全文

课程2: Android单元测试

Android单元测试 Java单元测试: 解决的问题:使用单元测试,对一个方法进行测试,通常包括 正确性、错误性、边界性等测试,从源头上解决缺陷引入; 使用方法:这只是一个Demo,我们部门还没有得到有力的推广(敏捷测试理论上更需要单元测试,但我们项目时间都比较紧); ./junit_gen.sh <项目目录> # 然后填写测试代码到Test.java ./test_on_android.sh 详情请参考: 链接 ####Java覆盖率报告: 解决的问题:看看到底我们测试到了哪里,哪些我们覆盖到了? 使用方法:emma,编译时应该输入参数 ant emma debug,这由Android SDK已实现; 详情请参考: 链接 ####Java单测总体报告: 解决的问题:现阶段的单元测试(Junit)并没有生成一份Jenkins可识别的报告,这里是解决Jenkins识别不到的问题; 详情请参考: 链接 ####Java单测 - 效果展示: [Java单测效果](http://200.200.0.36/28120/junit_test_android/tree/linux/ScreenShot) NDK单元测试:(C/C++) 解决的问题:与Java单元测试类似,但是针对的是NDK(C/C++),NDK的一个明显的好处是它的安全性要比Java的好; 使用方法:这是一个简单的Demo 注意到 sangfor_android目录 Jni代码放置到 sangfor_android/jni 测试代码添加到 demo_unit.cpp 然后执行 ./run_linux.sh 即可 详情请参考: 链接……

阅读全文

Android字符串资源检查

Android项目开发过程中,容易出现缺少对应中英文翻译的情况,这个Python脚本是用于检查字符串是否缺少了对应的翻译 脚本链接: Android字符串资源检查 使用方法: ./check_string_res.py packages/apps/Settings/ ./check_string_res.py packages/apps/Settings/ packages/apps/QuickSearchBox/ .. 效果如下: $ ./check_string_res.py packages/apps/Bluetooth/ ###正在检查项目packages/apps/Bluetooth/ >>> Checking res/values/strings.xml file .. - Warning: string name 'auth_notif_message' not found!!! - Warning: string name 'auth_notif_ticker' not found!!! - Warning: string name 'auth_notif_title' not found!!! - Warning: string name 'cancel' not found!!! - Warning: string name 'defaultname' not found!!! - Warning: string name 'localPhoneName' not found!!! - Warning: string name 'ok' not found!!! - Warning: string name 'pbap_authentication_timeout_message' not found!……

阅读全文

课程1: Android测试技巧(一)

常用工具 主题:主要讲解一些常用的一些命令行,及定位问题的方法 抓图:screencap screencap -p /sdcard/Pictures/ScreenShot_$(date +%F_%H-%M-%S).png Kernel版本信息: cat /proc/version Kernel接收传入参数: cat /proc/cmdline 清空并抓取Logcat日志: adb logcat -c && adb logcat -v threadtime Logcat日志显示详细时间、进程名称: adb logcat -v threadtime Top显示占用CPU、内存最多的应用程序: adb shell for n in $(busybox seq 1 100); do top -m 5 -d 3 -t -n 1 | \ busybox awk '{now=strftime("%Y-%M-%d %T "); print now $0}’ done Vmstat输出信息查看及分析(各列定义及问题排查见另一篇文档):……

阅读全文

课程1: Android测试技巧(二)

Bug定位技巧 今天比较匆忙,准备得不算很多; 首先来针对一些普通的Bug来分析一下如何定位一个Bug的问题; 一些方法运用好,可以更好的重现一些难以重现的问题,并或许还可以提供有效的Bug解决方法。 日志输出,依据logcat输出的进程号来定位问题(如EasyConnect,以下截图仅举例): 日志输出,依据Logcat输出的详细时间来定位问题(如发现问题的那一分钟内、以下截图仅举例): 输出报告,adb bugreport 善于使用索引工具,如OpenGrok 外网可以参考:AndroidXRef 内网可以参考:AndroidOS4C, 内网有权限控制 ……

阅读全文

Android Keystore 那些事儿

生成Keystore 一键生成 Keystore keytool -genkey -v -keystore scue15K.keystore -alias scue15K \ -keyalg RSA -keysize 2048 -validity 15000 \ -keypass scue15 -storepass scue15 \ -dname 'CN=scue.github.io, OU=SDET, O=Android, L=ShenZhen, S=GuangDong, C=CN' 得到scue15K.keystore这个文件,keypass和storepass密码都是scue15 检验Keystore 使用一行命令检查Keystore信息 keytool -list -v -keystore scue15K.keystore # 需键入 storepass 使用Keystore签名 重新签名的步骤,同样适用于正常签名 zip -d in.apk 'META-INF/*' # 先清理旧的签名,假如你是重新签名的话 jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore /tmp/scue15K.keystore \ -keypass scue15 -storepass scue15 -signedjar out.apk in.apk scue15K zipalign -v 4 out.……

阅读全文