2015年5月20日
相关技术文章 首先参阅一下别人写得很不错的文章,个人感觉还是有很多可以借鉴的内容
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.rc启动类似adbd, debuggerd, rild等核心后台进程,用于监听指定信息 Zygote是用于初始化虚拟机的进程,监听请求创建虚拟机实例的socket,算是App的“鼻祖” Android 启动分析:Daemons和Zygote ####2. Services Manager
在 init.rc 有这么一段内容
service servicemanager /system/bin/servicemanager class core user system group system critical onrestart restart healthd onrestart restart zygote onrestart restart media onrestart restart surfaceflinger onrestart restart drm init.……
阅读全文
2015年5月11日
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等案例的设计;……
阅读全文
2015年5月10日
总有些时候我们会遇到非必现场景,若未及时抓取日志,可能为时已晚
抓取日志 抓取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卡占用过快)……
阅读全文
2015年5月9日
很久没有撸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即可;
历史提交记录……
阅读全文
2015年5月9日
配置自动补全:
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.4. 边框过大的调整方法
cd /path/to/adt vi "$(find eclipse -name e4_default_gtk.css)" # 打开: plugins/org.……
阅读全文
2015年5月7日
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 即可 详情请参考: 链接
注意事项:采用是gtest,它提供了很多测试实例,我们可以去学习一下 Gtest模板
####NDK覆盖率报告:
解决的问题:覆盖率报告可以让我们清楚的知道,哪一行代码被执行了多少次
使用方法:./gen_gcov_html.sh <源码目录>
./gen_gcov_html.sh sangfor_android 详情请参考: 链接
创新分享: 主要讲解一下思路来源,拿到问题之后怎么思考去解决它
分享一下思维,不具体深入讲解如何实现(具体实现包含在创新文章里边了)。……
阅读全文
2015年4月28日
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!……
阅读全文
2015年4月16日
常用工具 主题:主要讲解一些常用的一些命令行,及定位问题的方法
抓图: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输出信息查看及分析(各列定义及问题排查见另一篇文档):
adb shell vmstat -d 3 -n 100 | busybox awk '{now=strftime("%Y-%M-%d %T "); print now $0}' 网络分析:……
阅读全文
2015年4月16日
Bug定位技巧 今天比较匆忙,准备得不算很多;
首先来针对一些普通的Bug来分析一下如何定位一个Bug的问题;
一些方法运用好,可以更好的重现一些难以重现的问题,并或许还可以提供有效的Bug解决方法。
日志输出,依据logcat输出的进程号来定位问题(如EasyConnect,以下截图仅举例):
日志输出,依据Logcat输出的详细时间来定位问题(如发现问题的那一分钟内、以下截图仅举例):
输出报告,adb bugreport
善于使用索引工具,如OpenGrok
外网可以参考:AndroidXRef
内网可以参考:AndroidOS4C, 内网有权限控制……
阅读全文
2015年1月18日
生成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.apk release.……
阅读全文