分类 android 中的文章

Web JavaScript调用Android原生应用代码

使WebView可以调用原生应用的代码,通过注册Event事件的形式 简单的调用方法是: <button id="btn_test_event">测试事件</button> <script type="text/javascript"> document.getElementById(btn_test_event).onclick = function () { var command = { 'action': 'test' }; Eagle.event(JSON.stringify(command)); } </script> 这其中的Eagle就是客户端指定的addJavascriptInterface(EagleWebInterface.create(this), "Eagle") 而event是指event()这个方法: @JavascriptInterface public String event(String params) { final String action = JSON.parseObject(params).getString("action"); final Event event = EventManager.getInstance().createEvent(action); Logger.d("event: " + params); if (event != null) { event.setAction(action); event.setDelegate(DELEGATE); event.setContext(DELEGATE.getContext()); event.setUrl(DELEGATE.getUrl()); return event.execute(params); } return null; } ……

阅读全文

Android Studio 使用笔记

下载链接 官方网站: developer.android.com/tools/studio 由于官网需要特殊方法才能正常访问,所以,我是从 这里下载 的; 问题汇总 Error:(2) Error retrieving parent for item: No resource found that matches the given name 'android:TextAppearance.Material.Widget.Button.Inverse' 跟踪链接: https://code.google.com/p/android/issues/detail?id=183122 依据#31: 修改app/build.gradle -compile 'com.android.support:appcompat-v7:23.0.0' +compile 'com.android.support:appcompat-v7:22.2.1' ……

阅读全文

Android 4.2.2 Emulate Sdcard

参考链接: source.android.com 由于官方提供的参考方法不能使用, 所以我把修改的配置贴了出来 init.hardware.rc on post-fs-data mkdir /data/media 0770 media_rw media_rw chown media_rw media_rw /data/media on init mkdir /mnt/shell/emulated 0771 system sdcard_rw mkdir /mnt/shell/test 0771 system sdcard_rw mkdir /storage/emulated 0775 root root export EXTERNAL_STORAGE /storage/emulated/0 export EMULATED_STORAGE_SOURCE /mnt/shell/emulated export EMULATED_STORAGE_TARGET /storage/emulated # Support legacy paths symlink /storage/emulated/0 /sdcard symlink /storage/emulated/0 /mnt/sdcard symlink /storage/emulated/0 /storage/sdcard0 symlink /mnt/shell/emulated/0 /storage/emulated/0 service sdcard /system/bin/sdcard /data/media /mnt/shell/emulated 1023 1023 disabled on property:dev.bootcomplete=1 start sdcard storage_list.……

阅读全文

CyanogenMod Code Search in Github

有些时候希望在Github上搜索源代码,包含字符串什么的 Github的响应速度比AndroidXref等等快得多了,值得推荐 https://github.com/search?q=user%3ACyanogenMod+%s&type=Code&ref=searchresults 或者,如果想包含android的源代码: https://github.com/search?q=user%3ACyanogenMod+user%3Aandroid+%s&ref=searchresults&type=Code 效果如下: {:target=“brank”}……

阅读全文

课程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.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.……

阅读全文

课程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.4. 边框过大的调整方法 cd /path/to/adt vi "$(find eclipse -name e4_default_gtk.css)" # 打开: plugins/org.……

阅读全文

课程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 即可 详情请参考: 链接 注意事项:采用是gtest,它提供了很多测试实例,我们可以去学习一下 Gtest模板 ####NDK覆盖率报告: 解决的问题:覆盖率报告可以让我们清楚的知道,哪一行代码被执行了多少次 使用方法:./gen_gcov_html.sh <源码目录> ./gen_gcov_html.sh sangfor_android 详情请参考: 链接 创新分享: 主要讲解一下思路来源,拿到问题之后怎么思考去解决它 分享一下思维,不具体深入讲解如何实现(具体实现包含在创新文章里边了)。……

阅读全文