Android/CyanogenMod 发烧笔记
(→XDA基础工具) |
(→安装Google Apps) |
||
(未显示1个用户的8个中间版本) | |||
第1行: | 第1行: | ||
+ | [[文件:Android-hack-header.jpg]] | ||
+ | |||
+ | |||
== 缘起 == | == 缘起 == | ||
第9行: | 第12行: | ||
Android上已有安全威胁,参考: http://cn.trustmobi.com/anquanzhongxin.php?number=1 | Android上已有安全威胁,参考: http://cn.trustmobi.com/anquanzhongxin.php?number=1 | ||
+ | |||
+ | 一个典型的 APK 包分析报告: https://anubis.iseclab.org/?action=result&format=html&task_id=185b2c2d9a1883854919318c92ffb5b4e | ||
<br><br> | <br><br> | ||
第42行: | 第47行: | ||
* 系统没有 sudo, su 这些有可能提升权限的应用程序 | * 系统没有 sudo, su 这些有可能提升权限的应用程序 | ||
− | |||
http://en.wikipedia.org/wiki/Android_rooting | http://en.wikipedia.org/wiki/Android_rooting | ||
+ | |||
+ | <br><br> | ||
+ | |||
+ | ==== MI2s ROOT ==== | ||
+ | |||
+ | 下载 ROOT 包:http://vdisk.weibo.com/s/dn5OZrwllvkJ | ||
+ | |||
+ | 运行“系统更新”-》菜单键-》“选择安装包”安装此ROOT包即可 | ||
<br><br> | <br><br> | ||
第628行: | 第640行: | ||
=== 概述 === | === 概述 === | ||
+ | |||
+ | Android 手机出厂后都有刷机模式和 Recovery 模式。 | ||
+ | |||
+ | 官方 Recovery 模式下只能刷入厂家认可的包,社区的包会校验失败,也就是不能刷入。因此要进入 Recovery 模式刷机,得先用三星官方的刷机工具 odin 或者社区的 heidall 直接写手机内部的 flash,用XDA社区开发的 CWM Recovery 替换原厂的、有限制的 Recovery 模式 | ||
+ | |||
+ | |||
+ | * T959 进入 Recovery 模式 | ||
+ | |||
+ | 关机状态下,长按音量上 + 音量下 + 电源键,看到开机画面后松开电源键并继续长按双音量键,直到成功进入恢复模式 | ||
+ | |||
+ | 如果不行,就试试:长按音量键下 + 电源键,看到开机第一画面时,松开电源键并继续保持长按音量键下,直到成功进入恢复模式 | ||
+ | |||
+ | |||
+ | * T959 进入 刷机模式(挖煤模式) | ||
+ | |||
+ | 先将 USB 线一头连接电脑,关机状态下长按双音量键 + 将USB另一头连接手机,看到黄色机器人在挖煤,即进入挖煤模式 | ||
+ | |||
+ | 如果不行,可试试:长按音量上 + 电源键,或可进入挖煤模式 | ||
+ | |||
+ | |||
+ | * I9300 进入 Recovery 模式 | ||
+ | |||
+ | 关机状态下,长按音量上 + HOME 键 + 电源键 | ||
+ | |||
+ | |||
+ | * I9300 进入 刷机模式 | ||
+ | |||
+ | 关机状态下,长按音量下 + HOME 键 + 电源键,出现提示界面后,按音量上确认 | ||
+ | |||
+ | |||
http://wiki.cyanogenmod.org/w/Install_CM_for_vibrantmtd?setlang=zh-cn | http://wiki.cyanogenmod.org/w/Install_CM_for_vibrantmtd?setlang=zh-cn | ||
第967行: | 第1,009行: | ||
=== 编译 === | === 编译 === | ||
+ | |||
+ | 命令行编译,原理与 google glass 相同,参考:http://wiki.jackslab.org/Google_Glass_%E7%AC%94%E8%AE%B0#.E7.BC.96.E8.AF.91.E6.B5.8B.E8.AF.95.E7.8E.AF.E5.A2.83 | ||
<br><br> | <br><br> | ||
第979行: | 第1,023行: | ||
<br><br> | <br><br> | ||
+ | |||
+ | == 去除讨厌的微博尾巴 == | ||
+ | |||
+ | ROOT 系统,打开 /system/build.prop,修改: | ||
+ | |||
+ | <source lang=bash> | ||
+ | ro.product.model=** | ||
+ | ro.product.brand=** | ||
+ | ro.product.manufacturer=** | ||
+ | </source> | ||
+ | |||
<br><br> | <br><br> | ||
<br><br> | <br><br> |
2015年3月22日 (日) 18:34的版本
目录 |
1 缘起
手上的三星 Android 机 T959 用了快三年了,一直用原生系统,挺好用,一直没有分析的动力。
最近刷了 MIUI V5,内置了一堆的吸流量、浪费系统资源的应用,开机后,可用内存只有 10% 左右(51MB前后),苦不堪言。内置的百度输入法,一个输入法,居然没事就去访问我的通讯录、通话记录和GPS坐标,要知道其是有网络通讯权限的,也就是说装了百度输入法的用户,他就会偷用户的通讯录、通话记录和当前地理位置(GPS坐标),并记录在其服务器上
另外,Android 系统上,各种安全威胁越来越严重,其很有可能重复当年PC上,流氓软件横扫WINDOWS用户的场景
Android上已有安全威胁,参考: http://cn.trustmobi.com/anquanzhongxin.php?number=1
一个典型的 APK 包分析报告: https://anubis.iseclab.org/?action=result&format=html&task_id=185b2c2d9a1883854919318c92ffb5b4e
2 探索你的手机系统
正常的系统里,您用“文件管理器”是看不到你整天用的手机系统的是个啥样的(类似看不到window 下的 C:\windows 文件夹的内容),也就看看管理管理“我的文档”下面的内容
要想看到、甚至精简你的整个系统,有两种主要方法:
1. ROOT 获取系统管理员权限,然后使用 Root Explorer 这个APP去访问根目录、去 /system/app 下删除出厂系统里删不了流氓APP(通过“设置”-->“系统设置”-->“应用”),比如 “米币”,“系统更新” 等等
2. 使用调试工具 ADB,ADB 是Android官方提供给开发者的一种调试工具,很容易使用,可以随心所欲地控制、修改你的手机系统。Android 的好处就是,人人都能通过简单的学习,自由地修改你的系统。当然,ADB 要发挥真正的威力,也得先 ROOT
2.1 ROOT
ROOT 就是获取手机的管理员权限,拥有控制、修改自己系统的自由
没有ROOT的系统,/system 目录是只读的,没有写权限,也就不能绞杀(删除)厂商预装在 /system/app 目录下的应用(多数为绑架用户的流氓应用)
出厂的手机系统,对 ROOT 权限的封锁,集中在:
- 默认使用非ROOT权限用户。“adb shell” 进入系统的,实际手机端运行了 /sbin/adbd 这个进程(Note2上对应用户是 shell,uid=2000);APP 运行时,其对应的用户则是 u0_aN(N是个整型值,动态分配),这些用户都没有管理员权限,也就不能修改系统
- 对关键系统目录(如 "/","/system")挂载为只读文件系统
- 对必须要进行读写的目录(比如 "/data"),虽将其挂载为可读写的文件系统,但也封杀普通用户的写权限,甚至读权限也不给
- 系统没有 sudo, su 这些有可能提升权限的应用程序
http://en.wikipedia.org/wiki/Android_rooting
2.1.1 MI2s ROOT
下载 ROOT 包:http://vdisk.weibo.com/s/dn5OZrwllvkJ
运行“系统更新”-》菜单键-》“选择安装包”安装此ROOT包即可
2.2 ADB
ADB 本是Android SDK(APP 开发环境)内置的调试工具,可以通过 USB/WiFi 连接手机,获取ROOT权限,执行 shell 命令,上传下载数据等。ADB 功能强大,是骨灰级发烧友杀人越货之必备良器
Google 有独立的包,1MB 左右,根据你的平台选用相应的包即可。
http://dl.google.com/android/repository/platform-tools_r19-linux.zip http://dl.google.com/android/repository/platform-tools_r19-windows.zip http://dl.google.com/android/repository/platform-tools_r19-macosx.zip
比如 WINDOWS 下,解压 zip 包后,把 adb.exe AdbWinApi.dll AdbWinUsbApi.dll 拷贝到 C:\WINDOWS 下 (省得改环境变量)
然后打开“运行”,输入cmd,回车,开启一个命令行窗口,输入 adb devices,如果你安装了手机的 USB 驱动,在手机里 “设置” --> “开发者选项” --> “USB调试模式” 打开的话,你就能看到
adb devices List of devices attached 32334071DA1D00EC device
表明 adb 已经发现手机设备了
运行 adb shell 则会获得一个 shell,你就可以像在 Linux 中一样了
adb shell root@android:/ # id uid=0(root) gid=0(root) root@android:/ # cat /proc/version Linux version 3.0.52-Semaphore_JB_2.6.1sv (stratosk@semaphore.gr) (gcc version 4.7.3 20121001 (prerelease) (crosstool-NG linaro-1.13.1-4.7-2012.10-20121022 - Linaro GCC 2012.10) ) #313 PREEMPT Sun Nov 25 20:47:09 EET 2012 root@android:/ # cat /proc/cpuinfo Processor : ARMv7 Processor rev 2 (v7l) BogoMIPS : 99.26 Features : swp half thumb fastmult vfp edsp thumbee neon vfpv3 CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x2 CPU part : 0xc08 CPU revision : 2 Hardware : aries Revision : 0030 Serial : 32334071da1d00ec root@android:/ # free -m total used free shared buffers Mem: 401084 395532 5552 0 1648 -/+ buffers: 393884 7200 Swap: 0 0 0
更多信息输出,可参考 MIUI V5 在老机三星 T959 上的第一眼
备份手机的装机应用到 t959-system-app/ 目录下(用户自己装的应用,位于 /data/app 下):
$ adb pull /system/app t959-system-app/ pull: building file list... pull: /system/app/YellowPage.apk -> t959-system-app/YellowPage.apk pull: /system/app/WeatherProvider.apk -> t959-system-app/WeatherProvider.apk pull: /system/app/Weather.apk -> t959-system-app/Weather.apk ...... ......
对于系统的装机应用,adb uninstall 是移除不了的,得直接进 shell,手动删除之:
$ adb uninstall /system/app/LiveWallpapers.apk Failure $ adb shell root@android:/ # cd /system/app/ root@android:/system/app # rm LiveWallpapers.apk root@android:/system/app # ls LiveWallpapers.apk LiveWallpapers.apk: No such file or directory
还有其他强大的命令:
adb shell am # 强大的 Activity Manager adb shell dumpstate adb shell dumpsys adb shell ime list adb reboot recovery # 进入恢复模式
2.3 fastboot
ADB 的连接需要手机启动进入系统,手机在进入 Android 系统后,启动了一个 adbd 的守护进程,PC端的 adb 就是通过 USB线或者WiFi 与 adbd 之间交互的。因此当手机不能进入Android系统后,比如只停留在bootloader(类似于PC的BIOS)阶段的时候咋办呢?
platform-tools 包里也提供一个非常有用的工具: fastboot,可以在手机进入 bootloader后与手机建立连接
$ adb reboot-bootloader $ fastboot devices $ fastboot oem unlock # 解锁 bootloader $ fastboot oem get-bootinfo
2.4 清理顽固流氓
ROM 中不能从正常途径卸载的装机应用(如米币,小米商城等),一般都可以ROOT后,用 RootExplorer 直接从 /system/app/ 中删除即可
但有些顽固的流氓应用隐藏很深,比如 MIUI V5 自带的病毒扫描(腾讯提供),你根本找不到他的APK包在哪,运行他实时用 adb shell ps 查看,你会发现:系统并没有新的可疑进程
2.4.1 MIUI V5的病毒扫描去除
连上USB线到PC,手机系统“设置”里打开 “USB调试”, 打开病毒扫描应用,只有在其扫描的过程中,你用 top 才能发现 com.android.settings 这个关键系统应用的CPU占有率太异常了:
$ adb shell top -n 1 -d 1 -m 10 -t User 27%, System 13%, IOW 0%, IRQ 0% User 29 + Nice 0 + Sys 14 + Idle 64 + IOW 0 + IRQ 0 + SIRQ 0 = 107 PID TID PR CPU% S VSS RSS PCY UID Thread Proc 3020 3020 0 21% S 334328K 75816K fg system ndroid.settings com.android.settings 6120 6120 0 7% R 1240K 600K root top top 185 332 0 3% S 44376K 23560K fg system SurfaceFlinger /system/bin/surfaceflinger 6109 6109 0 1% S 0K 0K root kworker/u:2 6114 6114 0 1% S 0K 0K root kworker/u:3 185 185 0 1% S 44376K 23560K fg system surfaceflinger /system/bin/surfaceflinger 185 765 0 0% S 44376K 23560K fg system Binder_3 /system/bin/surfaceflinger 4293 4293 0 0% S 0K 0K root kworker/0:0 185 360 0 0% S 44376K 23560K fg system Binder_1 /system/bin/surfaceflinger 185 358 0 0% S 44376K 23560K fg system EventThread /system/bin/surfaceflinger
在不开病毒扫描时,大部分情形下com.android.settings 的CPU占有为0%
因此,这个病毒扫描应该隐藏在 com.android.settings 这个关键系统应用中:
$ adb shell dumpstate | grep -i virusscan Service com.android.settings.VirusScanService: Service com.android.settings.VirusScanService: 4: [2013-12-13 19:26:08.228] executeForLastInsertedRowId took 1ms - succeeded, sql="INSERT INTO applications ('_id', 'name', 'description', 'package', 'class', 'icon', 'launch_count', 'last_resume_time') VALUES (?, ?, ?, ?, ?, ?, COALESCE(?, 0), COALESCE(?, 0));", bindArgs=[null, "病毒扫描", "应用", "com.android.settings", "com.android.settings.VirusScanActivity", "android.resource://com.android.settings/drawable/virus_scan_icon", 27,1386933816654] 41246fb8 com.android.settings/.VirusScanActivity filter 41247298 41247698 com.android.settings/.VirusScanService filter 41247898 41247698 com.android.settings/.VirusScanService filter 41247898 com.android.settings.VirusScanAppActivity com.android.settings.VirusScanActivity: 1 starts, 500-750ms=1 com.android.settings.VirusScanActivity: 22 starts, 500-750ms=10, 750-1000ms=4 com.android.settings.VirusScanAppActivity: 14 starts, 0-250ms=6, 250-500ms=5, 500-750ms=1, 750-1000ms=1, >=5000ms=1
原来确实丫是隐藏在核心应用 com.android.settings(设置)中的,真TM够毒的!
其是 com.android.settings 的一个 Activity,完整的 INTENT 为: "com.android.settings/.VirusScanAppActivity"
下面来探究探究:
# 启动病毒扫描 $ adb shell am start -n "com.android.settings/.VirusScanAppActivity" Starting: Intent { cmp=com.android.settings/.VirusScanAppActivity } # 启动对应的 Service $ adb shell am startservice -n "com.android.settings/.VirusScanService" Starting service: Intent { cmp=com.android.settings/.VirusScanService } $ adb shell am kill-all com.android.settings # 此两条命令执行后,病毒扫描图标就从桌面消失了 $ adb shell pm disable -n "com.android.settings/.VirusScanActivity" Component {com.android.settings/com.android.settings.VirusScanActivity} new state: disabled $ adb shell pm disable -n "com.android.settings/.VirusScanAppActivity" Component {com.android.settings/com.android.settings.VirusScanAppActivity} new state: disabled #再想启动的话就会: $ adb shell am start -n "com.android.settings/.VirusScanAppActivity" Starting: Intent { cmp=com.android.settings/.VirusScanAppActivity } Error type 3 Error: Activity class {com.android.settings/com.android.settings.VirusScanAppActivity} does not exist. #当然,这只是软件关闭,其代码还是在 /system/app/Settings.apk 这个 APK 包中,如要彻底清除,可尝试解开 APK 包,移除 VirusScanApp.java 的代码
更多 adb am 用法参考:http://developer.android.com/tools/help/adb.html#am
2.4.2 MIUI V5文件管理中的快盘
另外一个隐藏较深的是“快盘”,这也是一个怎么也找不到其 APK 文件的主,但点其图标运行后,会进入 “文件管理器“ 的一个界面,也是其 Activity
$ adb shell pm disable -n "com.android.fileexplorer/cn.kuaipan.android.activity.TaskManagerActivity" Component {com.android.fileexplorer/cn.kuaipan.android.activity.TaskManagerActivity} new state: disabled $ adb shell pm disable -n "com.android.fileexplorer/cn.kuaipan.android.activity.SettingActivity" Component {com.android.fileexplorer/cn.kuaipan.android.activity.SettingActivity} new state: disabled $ adb shell pm disable -n "com.android.fileexplorer/cn.kuaipan.android.activity.BindToKuaipanAccountActivity" Component {com.android.fileexplorer/cn.kuaipan.android.activity.BindToKuaipanAccountActivity} new state: disabled $ adb shell pm disable -n "com.android.fileexplorer/cn.kuaipan.android.activity.TrashBoxActivity" Component {com.android.fileexplorer/cn.kuaipan.android.activity.TrashBoxActivity} new state: disabled $ adb shell pm disable -n "com.android.fileexplorer/cn.kuaipan.android.activity.SignInSuccessActivity" Component {com.android.fileexplorer/cn.kuaipan.android.activity.SignInSuccessActivity} new state: disabled $ adb shell pm disable -n "com.android.fileexplorer/cn.kuaipan.android.common.TaskReceiver" Component {com.android.fileexplorer/cn.kuaipan.android.common.TaskReceiver} new state: disabled $ adb shell pm disable -n "com.android.fileexplorer/cn.kuaipan.android.common.TaskIntentService" Component {com.android.fileexplorer/cn.kuaipan.android.common.TaskIntentService} new state: disabled $ adb shell pm disable -n "com.android.fileexplorer/cn.kuaipan.android.service.MediaMountedReceiver" Component {com.android.fileexplorer/cn.kuaipan.android.service.MediaMountedReceiver} new state: disabled $ adb shell pm disable -n "com.android.fileexplorer/cn.kuaipan.android.service.NetChangeReceiver" Component {com.android.fileexplorer/cn.kuaipan.android.service.NetChangeReceiver} new state: disabled $ adb shell pm disable -n "com.android.fileexplorer/cn.kuaipan.android.provider.KssProvider" Component {com.android.fileexplorer/cn.kuaipan.android.provider.KssProvider} new state: disabled $ adb shell pm disable -n "com.android.fileexplorer/.push.PushReceiver" Component {com.android.fileexplorer/com.android.fileexplorer.push.PushReceiver} new state: disabled $ adb shell pm disable -n "com.android.fileexplorer/cn.kuaipan.android.service.KscService" Component {com.android.fileexplorer/cn.kuaipan.android.service.KscService} new state: disabled
2.4.3 MIUI V5 for T959 内存优化
先用 procrank 看一下系统内存消耗的标兵:
$ adb shell procrank PID Vss Rss Pss Uss cmdline 569 67964K 67640K 42262K 37880K com.miui.home 380 51772K 51664K 33407K 30756K system_server 466 54340K 54112K 30944K 25204K com.android.systemui 609 46116K 46016K 27193K 25420K android.process.acore 539 42080K 42000K 23471K 21508K com.android.phone 6567 38012K 37948K 17785K 15404K com.android.settings 7456 40488K 40400K 16591K 13972K com.android.deskclock 184 28088K 25088K 16134K 8316K /system/bin/surfaceflinger 526 26720K 26644K 12945K 12036K com.baidu.input 9315 32776K 32676K 11651K 9468K com.google.process.gapps 617 22164K 22068K 7656K 6668K com.lbe.security.miui:service 9635 28288K 28176K 7221K 5132K com.android.mms 8928 26444K 26324K 7100K 4324K com.android.systemui:screenshot 6469 25136K 25020K 6600K 5080K android.process.media 9682 26584K 26464K 5776K 3708K com.miui.weather2 9653 25740K 25628K 5580K 3756K com.miui.voiceassist:remote 932 17872K 17752K 5126K 4380K com.miui.providers.weather 9723 20892K 20776K 4514K 3308K com.android.thememanager 9704 24316K 24196K 4352K 2636K com.miui.providers.datahub 547 16220K 16100K 3790K 3040K com.lbe.security.miui 187 3756K 3756K 2889K 2756K /system/bin/mediaserver 185 15468K 15316K 2580K 1716K zygote 9750 1464K 1464K 1242K 1228K procrank 224 1548K 1548K 1064K 1048K /system/xbin/shelld 179 1532K 1532K 1057K 1036K /system/bin/servicemanager 193 1516K 1516K 1048K 1032K /system/bin/tvoutserver 362 1412K 1412K 966K 944K /system/bin/rild 186 1136K 1136K 787K 776K /system/bin/drmserver 182 1004K 1004K 732K 712K /system/bin/netd 189 712K 712K 390K 364K /system/bin/installd 190 652K 624K 388K 376K /system/bin/keystore 464 560K 560K 357K 352K /system/bin/bluetoothd 180 576K 576K 346K 336K /system/bin/vold 9748 428K 424K 214K 200K /system/bin/sh 196 212K 212K 192K 192K /sbin/adbd 188 368K 364K 177K 172K /system/bin/dbus-daemon 1 244K 244K 172K 128K /init 147 184K 184K 136K 92K /sbin/ueventd 183 308K 304K 124K 120K /system/bin/debuggerd 438 296K 296K 116K 112K /system/bin/brcm_patchram_plus 192 288K 288K 112K 108K /system/vendor/bin/geomagneticd 1224 244K 240K 91K 88K wdaemon ------ ------ ------ 305300K 255884K TOTAL RAM: 401084K total, 22256K free, 1256K buffers, 77896K cached, 3464K shmem, 12748K slab
主要参数解析如下:
- Vss = virtual set size
- Rss = resident set size
- Pss = proportional set size -----> 此进程与其他进程的共享内存
- Uss = unique set size -----> 这是进程独占内存,进程终止这个内存会被系统释放
Vss 和 Rss 的实际用途不大
可以将一些不用的进程,直接 kill 掉即可
2.5 构筑防火墙
严防非授权访问网络,上传敏感数据。防火墙这东西属于最后一道防线,不能信任任何APP市场上架的应用。最好自己编译,自己review 代码,防止后门。
主要的技术手段在内核层面,使用 iptables 进行控制
有自由版本的 Android 实现,代码在 github 上:
$ git clone git://github.com/ukanth/afwall
或者
$ git clone git://github.com/skullone/android_firewall
3 Android 手机系统结构
Android 手机是:手机硬件 + Linux 内核 + Android扩展库(/system/lib/*.so) + 类Java虚拟机(google自己实现的虚拟机Dalvik)+ Java应用(图形环境,手机桌面,应用程序等等)的混合体
手机硬件之上跑的是 Linux 内核(http://www.kernel.org/ ),掌控所有软硬件资源,类似触摸屏、GPS、摄像头、传感器等硬件外设的驱动都实现为 Linux Kernel 的一个模块
上层应用如要访问硬件外设,已不是传统的 GNU/Linux 访问设备方式(比如通过打开 /dev/radio 设备文件,调用 read/write/ioctl 函数与设备交互),Android 把对设备的访问都封装成了一个个的共享库(位于 /system/lib/hw/ 下),比如 camera.aries.so 封装有手机相机的操作,sensors.aries.so 封装有所有传感器访问的操作等,上层应用通过 libhardware.so 这个统一的入口(提供 id 参数,区分具体设备),调用具体设备的封装共享库
Android 是建立在 GNU/Linux 基础上的嵌入式 Linux 系统(裁减不必要的组件),因此其也吸纳了社区的优秀核心C/C++应用库,比如基础的libc(/system/lib/libc.so,使用的是Bionic C库,专用于嵌入式的C库),嵌入式关系数据库sqlite引擎库(/system/lib/libsqlite.so),web浏览器核心库webkit(/system/lib/libwebcore.so) 等。
在往上就是 Dalvik 虚拟机,google实现了这个类Java的虚拟机,为能运行 Java 程序,其也实现了一个Java核心库,提供Java语言API中的大多数功能,这个核心库同时也包含了Android的一些核心API,比如android.os、android.net、android.media 等
上层的 Application Framework 和 Applications (APP) 都运行在 Dalvik 虚拟机环境中
Application Framework 和 Applications 在 GNU/Linux 环境中,都表现为一个独立的进程/线程:
$ ps ...... system 180 1 11240 1448 c0720c44 4014eb94 S /system/bin/servicemanager radio 536 186 341380 43912 ffffffff 400f8a70 S com.android.phone system 376 186 411692 52192 ffffffff 400f7b94 S system_server $ pstree `-zygote-+-ceassist:remote-+-{Binder_1} | |- ...... | |- ...... | |-{SynthThread} | |-{Thread-2031} | `-{oPlaybackThrea} | |-system_server-+-{.ProcessManage} | |-{AccountManager} | |-{ActivityManage} | |-{AlarmManager} | |- ...... | |- ...... | |-{GpsLocationPro} | |-{LocationManage} | |- ...... | |-{PackageManager} | |- ...... | |-{UsbDeviceManag} | |- ...... | |-{WifiService} | |-{WindowManager} | |-{backup} | |-{gps_s5pc110} | |-{mDnsConnector} | `- ... |- ... `- ...
http://www.tbray.org/ongoing/When/201x/2010/11/14/What-Android-Is
3.1 GPS interface of Android
4 T959 硬件结构
4.1 主板图
4.2 主要芯片
AP: SANSUNG Exynos S5PC111 (S5PC110) -- ARM Cortex A8 1GHz + PowerVR SGX540 显示核心 --- Android 的系统实际是跑在这个处理器上
CP: Intel/Infineon 8824 (PMB9801, X-GOLD 616) --- 处理 2G/3G射频前端送来的数字信号,主要是 2G/3G 的通信协议处理 --- 刷机包中的 modem.bin 是个基带固件(一个实时OS + 协议处理进程),其是跑在这个处理器上的,内部一般就是一个 ARM 核心加一个 DSP 核心。X-GOLD616 属于 Intel/Infineon XMM6160 平台。
Intel/Infineon 5703 --- 2G/3G射频前端 + 模拟基带处理 --- 把天线过来的射频信号降频(down-conversion),模拟信号处理,模数转换后,输出数字信号,同时接受基带处理器的数字信号,处理成射频信号后送给天线发射 (RF Chip)。其与基带处理器之间的数字通信协议为 3G DigRF V3.09,详细可参考:基带处理器和射频前端的体系结构 和 http://www.mipi.org/specifications/digrfsm-specifications
Triquint TQM676021 --- Handset Tritium III PAD (power amplifier/duplexer) module for UMTS band I (IMT2100 band) --- 3G 射频功放,2100MHz 频段 (3G PAM)
Triquint TQM666022 --- Handset Tritium III PAD (power amplifier/duplexer) module for UMTS Band II --- 3G 射频功放,1900MHz 频段 (3G PAM)
Triquint TQM656024 --- Handset Tritium III PAD (power amplifier/duplexer) module for UMTS band IV --- 3G 射频功放,1800MHz 频段 (3G PAM)
2.5G 射频功放 (2.5G PAM)
射频频段切换芯片 (RF Switch chip)
Samsung KB100D00WM - KFG8GH6Q4M 8Gb OneNAND , K4X2G323PB, K4X1G323PB and another 1G package
Samsung KLM8G4DEDD - 8G of MoviNAND
Maxim MAX8998 – Power management IC
Broadcom BCM4751 - single-chip GPS Receiver Solution
Broadcom BCM4329 – 802.11n with Bluetooth 2.1 + EDR and FM receiver
NEC MC-10170 – Elpida Memory + Camera processor
Atmel MXT224 - a 224-node highly configurable touchscreen controller which is part of Atmel's maXTouch product platform
Hacking Boot Modes from Exynos 4210: http://www.techinsights.com/teardowns/samsung-galaxy-s-teardown/
Samsung I9000/T959 Teardown: http://forum.xda-developers.com/showthread.php?t=1372365
4.3 系统框图
5 Note II 硬件结构
SANSUNG Galaxy Note 2 (GT-N7102) 硬件结构,即国行联通双卡版。
移步: SANSUNG GT-N7102 Hardware Architecture
6 基带
6.1 基带体系结构
话题略大,为控制本页规模,保持良好的阅读体验,恭请移步:基带处理器和射频前端的体系结构
6.2 T959 基带固件
基带固件是刷机包中的 modem.bin 文件,是基带处理器 Intel/Infineon X-GOLD 616 (PMB9801) 所用文件系统的二进制镜像。X-GOLD616 属于 Intel/Infineon XMM6160 平台。
T959 原生系统的基带版本:T959UVKB1
更新到 MIUI V5 (3.9.27) 后,其自基带版本为 I9000XXJVT。我的是移动神州行 2G 卡,电话短信可用,但 GPRS 不能用
T959 有两片 NAND 存储芯片:集成于 AP 中的 4Gb OneNAND (512MB) 和外围 16GB 的 MoviNAND
在 Android 系统中,OneNAND 的设备文件为: /dev/mtdblock0-6,对应 7 个区:
root@android:/ # cat /proc/mtd dev: size erasesize name mtd0: 00780000 00040000 "boot" # 7.5MB,bootloader mtd1: 00780000 00040000 "recovery" # 7.5MB,刷机工具 recovery mtd2: 1a600000 00040000 "datadata" # 422MB, 挂载在 /datadata,用于存放系统APK的数据、配置等 mtd3: 01180000 00040000 "cache" # 17.5MB,挂载在 /cache mtd4: 00c80000 00040000 "efs" # 12.5MB,挂载在 /efs,存在手机无线电相关的核心配置数据,注意备份 mtd5: 01000000 00040000 "radio" # 16MB,挂载在 /radio,基带处理器所用文件系统的二进制镜像 modem.bin 就放在这个区 mtd6: 00b00000 00040000 "reservoir" # 貌似是保留区
详细参考:
如果需要修改 modem.bin 的话,找到新版本直接替换 /radio/modem.bin,然后重启即可。
T959 比较稳定的基带版本是 T959UVKB5:http://vdisk.weibo.com/s/dn5OZrwhV3k0 解压后直接用 adb push 替换:
$ adb push modem.bin /radio
重启手机即可
备份基带固件,可用如下命令:
$ adb pull /radio/modem.bin .
6.3 常用基带芯片
根据 XDA 社区网友搜集的信息,整理了一个页面: 手机基带芯片信息搜集
国内的主流机型我汇总了在这个页面里: 基带处理器和射频前端的体系结构
6.4 Android基带接口
基带部分在 Android 手机上被封装成了一个设备,叫做 modem,早期GSM/GPRS的时候,表现出来就是一个串口设备,只需向串口发送标准的AT命令字符串(形如 AT+CMGW="10086")就能控制 modem 进行发短息打电话等等操作,比如通过如下的AT命令序列就能向 1560_122_3272 发送一条短消息(Linux下可通过minicom直接读写串口,WINDOWS下可通过超级终端读写串口):
AT # 测试串口modem是否连接,正常的话modem会返回 OK AT+CMGF=1 # 进入 SMS Text 模式 AT+CMGW="+8615601223272" # SMS消息体,等号后面是接受方手机号,回车后,在 '>' 写上要发送的消息,Ctrl + z 结束输入 > A simple SMS text messaging. +CMGW: 1 # modem 返回短消息的计数,此处为1 AT+CMSS=1 # SMS发送 +CMSS: 20 # 成功,modem返回 '+CMSS: 20'
串口一般能用的最高速率也就115.2kbps,3G 时代串口速率远远跟不上数据网络需要的速度,因此如3G上网卡都是采用USB接口的方式在modem和主机之间交换数据。
回到手机上,modem 和 Android 系统间一般通过共享内存的方式交换大量数据。
在 Android 上,modem厂商一般都会把 modem 的访问封装成共享库,方便 Android 的应用使用。库的名字一般以 RIL (Radio Interface Layer) 为后缀,如:
Android 通用层面也实现有自己的 RIL 库:libreference-ril.so 是封装的 AT 命令访问方式。libril.so 实现有 RIL 抽象层。详细可参考这个非常不错的文档:http://www.slideshare.net/ssusere3af56/android-radio-layer-interface
modem厂商的RIL库一般是闭源的,这也激起了社区的极大兴趣,三星的相关探索参考:
- hardware_ril_samsung-ril: https://gitorious.org/replicant/hardware_ril_samsung-ril/source/master:+
- libsamsung-ipc: https://github.com/morphis/libsamsung-ipc
6.5 Hack
- [XMM6260][X-GOLD 626] Modem Hack-Pack: http://forum.xda-developers.com/showthread.php?t=1483053
- Qualcomm CDMA RTOS and Reverse:http://forum.xda-developers.com/showthread.php?t=1829915
- Reverse engineering a Qualcomm baseband: http://events.ccc.de/congress/2011/Fahrplan/events/4735.en.html
- Qualcomm AMSS: http://blog.csdn.net/yili_xie/article/details/5129469
7 刷机
7.1 概述
Android 手机出厂后都有刷机模式和 Recovery 模式。
官方 Recovery 模式下只能刷入厂家认可的包,社区的包会校验失败,也就是不能刷入。因此要进入 Recovery 模式刷机,得先用三星官方的刷机工具 odin 或者社区的 heidall 直接写手机内部的 flash,用XDA社区开发的 CWM Recovery 替换原厂的、有限制的 Recovery 模式
- T959 进入 Recovery 模式
关机状态下,长按音量上 + 音量下 + 电源键,看到开机画面后松开电源键并继续长按双音量键,直到成功进入恢复模式
如果不行,就试试:长按音量键下 + 电源键,看到开机第一画面时,松开电源键并继续保持长按音量键下,直到成功进入恢复模式
- T959 进入 刷机模式(挖煤模式)
先将 USB 线一头连接电脑,关机状态下长按双音量键 + 将USB另一头连接手机,看到黄色机器人在挖煤,即进入挖煤模式
如果不行,可试试:长按音量上 + 电源键,或可进入挖煤模式
- I9300 进入 Recovery 模式
关机状态下,长按音量上 + HOME 键 + 电源键
- I9300 进入 刷机模式
关机状态下,长按音量下 + HOME 键 + 电源键,出现提示界面后,按音量上确认
http://wiki.cyanogenmod.org/w/Install_CM_for_vibrantmtd?setlang=zh-cn
https://github.com/search?p=1&q=%40CyanogenMod+++kernel&type=Repositories
7.2 Flash刷写工具
7.2.1 Odin
Odin 是 Samsung 官方提供给维修中心的刷机工具
Importantly, it also has the ability to repartition the device storage based on a .pit file, which can save you from softbricking (when flashing goes wrong and recovery/the bootloader fail). It is not open source and to my knowledge they have not intentionally released it — a few versions have been leaked. For what it's worth, I have used the version posted here without issue.
7.2.2 heimdall
开源的 heimdall: http://glassechidna.com.au/heimdall/
声称较 odin 稳定,跨平台(WINDOWS/LINUX/MAC都可用)
Then turn off your phone, enter Download mode, connect the USB to phone. Next I used command like this to do the flashing itself
sudo heimdall flash --MDM modem.bin --verbose --no-reboot
Also to you can use to diagnose more with these, in case of issues
heimdall --version sudo heimdall detect sudo heimdall download-pit --output I9505.pit --verbose --no-reboot
7.3 XDA基础工具
- Semaphore CWM Recovery ----- 原厂的 Recovery 工具有校验,无法刷入社区的 ROM 包、更新包等。要刷机得先用 odin/heimdall 刷入 CWM Recovery
- AROMA Filemanager ----- Recovery 模式下的文件管理工具,方便不少
8 Dalvik虚拟机
Android 上的APP都是 Java 写的,使用 Java 编译器编译为 *.class 后再使用Android SDK提供的工具 DX 将其转化为 Dalvik 虚拟机可以执行的字节码文件 (*.dex)
Dalvik虚拟机是Android中APP的运行基础。其指令集基于寄存器架构,执行其特有的文件格式 ———— DEX字节码来完成对象生命周期管理、堆栈管理、线程管理、安全异常管理、垃圾回收等重要功能。
Dalvik VM 与 Java VM 的不同之处在于: Dalvik基于寄存器结构,而JVM基于栈结构;Dalvik执行的是特有的DEX文件格式,而JVM运行的是*.class文件格式
Dalvik 的优点在于:
- 在编译时提前优化代码而不是等到运行时,这会大大提升运行效率
- 虚拟机很小,使用的空间也小;被设计来满足可高效运行多种虚拟机实例
- 常量池已被修改为只使用32位的索引,以简化解释器
启动一个APP,就会有一个 Dalvik 虚拟机实例,每个APP都运行在自己的 Dalvik 虚拟机中,在系统中看,就是一个Linux进程,比如Android的系统设置:
$ adb shell ps | grep settings system 1382 185 310728 41252 ffffffff 40064a70 S com.android.settings
每一个Android应用都运行在一个Dalvik虚拟机实例里,而每一个虚拟机实例都是一个独立的进程空间。不同的应用在不同的进程空间里运行,当一个虚拟机关闭或意外中止时不会对其它虚拟机造成影响,可以最大程度的保护应用的安全和独立运行。
守护进程Zygote是Dalvik虚拟机实例的孵化器,其是所有APP的父进程。system_server是其孵化分裂出来的地一个虚拟机实例,他是和硬件沟通的桥梁,当其它APP启动时会向system_server申请服务。
Zygote是在系统启动时产生的,它会完成虚拟机的初始化,库的加载,预置类库的加载和初始化等等操作,而在系统需要一个新的虚拟机实例时,Zygote通过复制自身,最快速的提供个系统。另外,对于一些只读的系统库,所有虚拟机实例都和Zygote共享一块内存区域,大大节省了内存开销。
其与各APP进程的父子关系参考:http://wiki.jackslab.org/MIUI_V5_%E5%9C%A8%E8%80%81%E6%9C%BA%E4%B8%89%E6%98%9F_T959_%E4%B8%8A%E7%9A%84%E7%AC%AC%E4%B8%80%E7%9C%BC#Processes_Tree
Android 虚拟机启动流程,在启动脚本 /init.rc 里,与 zygote 相关的有:
...... service zygote /system/bin/app_process -Xzygote /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 onrestart restart netd ...... service surfaceflinger /system/bin/surfaceflinger class main user system group graphics onrestart restart zygote ...... service servicemanager /system/bin/servicemanager class core user system group system critical onrestart restart zygote onrestart restart media onrestart restart surfaceflinger onrestart restart drm 其中: service media /system/bin/mediaserver class main user media group audio camera inet net_bt net_bt_admin net_bw_acct drmrpc ioprio rt 4 ...... service netd /system/bin/netd class main socket netd stream 0660 root system socket dnsproxyd stream 0660 root inet socket mdns stream 0660 root system ...... service drm /system/bin/drmserver class main user drm group drm system inet drmrpc sdcard_r ......
参考: http://carvencao.blog.sohu.com/154325146.html
9 APP
9.1 APP包发烧
即:APP 的解包、修改、重新打包
使用社区工具 android-apktool: http://code.google.com/p/android-apktool/ ,LINUX/WINDOWS/MacOS 用户选择对应的包下载
XDA 社区还提供了一个不错的图形前端面,大大方便的使用:http://forum.xda-developers.com/showthread.php?t=2326604 该工具依赖 Powerpacks,如解压后执行 Android Multitool.exe 出现错误,得先下载安装Powerpacks:http://go.microsoft.com/fwlink/?LinkID=145727&clcid=0x804
为方便使用,把 apktool 的 WINDOWS 和 Linux 包都放微盘上了,WINDOWS: http://vdisk.weibo.com/s/dn5OZrwhNuPk LINUX: http://vdisk.weibo.com/s/dn5OZrwhNuOR
9.1.1 解包
以移除MIUI V5 系统设置(/system/app/Settings.apk) 中的病毒扫描为例,WINDOWS GUI解包示例如下:
先从刷机包/手机文件系统的 /system/app/ 目录下提取 Settings.apk 这个系统设置APP,放在 AndroidMultitool\Files 中 再从刷机包/手机文件系统的 /system/framwork/ 目录下提取 framework-res.apk 和 framework-miui-res.apk 这两个资源文件,放在 AndroidMultitool\Files 中 运行 Android Multitool.exe Installing Framework 选择 framework-res.apk 之所在,点“Install”;完成后再选择 framework-miui-res.apk 之所在,点“Install” Decompile 选择 Settings.apk 之所在,点“decompile",顺利的话就会在 Decompiled_apk 目录下出现一个 Settings 的文件夹, 反编译后的 Settings.apk 都在里面
GNU/Linux 下的过程如下:
apt-tool 是 java 写的,因此需要你的系统有 java 运行环境。工具集就是 aapt, apktool(bash脚本,实际使用 apktool.jar), apktool.jar, baksmali.jar, signapk.jar, smali.jar 这几个文件,拷贝到 /usr/local/bin 下即完成安装 $ ls /usr/local/bin/a* /usr/local/bin/aapt /usr/local/bin/apktool /usr/local/bin/apktool.jar $ ls /usr/local/bin/*.jar /usr/local/bin/apktool.jar /usr/local/bin/baksmali.jar /usr/local/bin/signapk.jar /usr/local/bin/smali.jar 从刷机包/手机文件系统的 /system/app/ 目录下提取 Settings.apk 这个系统设置APP 再从刷机包/手机文件系统的 /system/framwork/ 目录下提取 framework-res.apk 和 framework-miui-res.apk 这两个资源文件 $ apktool if /path/to/framework-res.apk # 先安装资源文件 $ apktool if /path/to/framework-miui-res.apk # 再安装资源文件 $ apktool d /path/to/Settings.apk I: Baksmaling... I: Loading resource table... I: Loaded. I: Decoding AndroidManifest.xml with resources... I: Loading resource table from file: /home/comcat/apktool/framework/1.apk I: Loaded. I: Loading resource table from file: /home/comcat/apktool/framework/6.apk I: Loaded. I: Regular manifest package... I: Decoding file-resources... I: Decoding values */* XMLs... I: Done. I: Copying assets and libs... 至此当前目录下就会产生一个 Settings 的文件夹,反编译解包后数据都在里面: $ ls Settings AndroidManifest.xml apktool.yml res smali
AndroidManifest.xml 为APP主框架文件,res/ 下是一些资源文件(如字符串,PNG图片等),smali/ 下才是主角,里面都是 Dalvik 虚拟机的“汇编语言“文件
当Android启动一个APP时,它必须要知道这个APP有那些组件。所以,所有APP解包后都有一个 AndroidManifest.xml的文件,其中写有这个APP的所有组件,当然还有一些其他信息,比如指明该APP所需要的各种权限(访问通话记录、访问网络...),以及声明该APP所需链接到的库名称
9.1.2 重打包
即把APK解包、修改后,再重新做成 APK 包,安装于系统中
使用 platform_tools 包中的 aapt 工具,aapt 实际是 android SDK 官方带的打包工具,也是自由的,可自由修改
MIUI 为改善APP在各种不同分辨率下的显示效果,都在 res/ 资源目录下加入了 values-largeui/ values-mediumui/ 目录,官方 aapt 处理时会出现错误:
$ apktool b Settings stk.apk I: Checking whether sources has changed... I: Smaling... I: Checking whether resources has changed... I: Building resources... invalid resource directory name: /work/android/apktool/miui-v5/Settings/res/values-largeui invalid resource directory name: /work/android/apktool/miui-v5/Settings/res/values-mediumui Exception in thread "main" brut.androlib.AndrolibException: brut.androlib.AndrolibException: brut.common.BrutException: could not exec command: [aapt, p, --min-sdk-version, 16, --target-sdk-version, 16, -F, /tmp/APKTOOL4702058949499100030.tmp, -0, arsc, -I, /home/comcat/apktool/framework/1.apk, -I, /home/comcat/apktool/framework/6.apk, -S, /work/android/apktool/miui-v5/Settings/res, -M, /work/android/apktool/miui-v5/Settings/AndroidManifest.xml] ...... ......
MIUI 开放了ROM制作的工具,位于:http://github.com/MiCode/patchrom_tools
因此需要使用一个修改后的 aapt 替换原来的:
$ wget http://github.com/MiCode/patchrom_tools/raw/ics/aapt $ sudo cp aapt /usr/local/bin/
WINDOWS 下取: http://github.com/MiCode/patchrom_tools/raw/ics/aapt.exe 替换原来的即可
再次执行,stk.apk 已经生成了,虽有一些警告,但没关系:
$ apktool b Settings stk.apk I: Checking whether sources has changed... I: Checking whether resources has changed... I: Building resources... aapt: warning: string 'bluetooth_dun_connection_permission_request' has no default translation in /work/android/apktool/miui-v5/Settings/res; found: zh_CN zh_TW ...... aapt: warning: string 'perm_privacy_app_count_trust_summary' has no default translation in /work/android/apktool/miui-v5/Settings/res; found: zh_TW aapt: warning: string 'safe_relative' has no default translation in /work/android/apktool/miui-v5/Settings/res; found: zh_TW aapt: warning: string 'sim_pin_enabled' has no default translation in /work/android/apktool/miui-v5/Settings/res; found: zh_CN zh_TW I: Building apk file... $ ls Settings Settings.apk stk.apk
9.1.3 修改包
需要在 Dalvik 甚至 ARM 指令集的层面上去修改APP的,一般出于以下情形:
- 优化,移除不需要的组件
- 反流氓,探寻流氓APP搜集用户隐私数据并上传服务器的代码,取证后移除
- 反广告,移除广告代码
- 汉化
先来看看 MIUI V5 下,隐藏在 com.andorid.settings(系统设置)中的查毒模块,是啥样的
先打开上个步骤中解包后目录下的 AndroidManifest.xml 文件,找到:
<activity android:theme="@miui:style/V5.Theme.Light.NoTitle" android:label="@string/virus_scanner_title" android:icon="@drawable/virus_scan_icon" android:name=".VirusScanActivity" android:taskAffinity="com.android.settings.VirusScanActivity" android:launchMode="singleTop" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:theme="@miui:style/V5.Theme.Light.NoTitle" android:name=".VirusScanAppActivity" android:taskAffinity="com.android.settings.VirusScanActivity" android:screenOrientation="portrait" /> <service android:name=".VirusScanService"> <intent-filter> <action android:name="com.android.service.VIRUS_SCAN_SERVICE" /> <action android:name="miui.intent.action.UPDATE_VIRUS_LIB" /> </intent-filter> </service>
Android 的APP没有统一的函数入口(比如C中的 main() 函数),其是由 Activity, Service 等等这些组件组成,Activity相当与APP的与用户互动的一个功能,Service则是跑在后台的服务,没有图形界面,用户一般看不到
这两个 Activity (VirusScanActivity和VirusScanAppActivity) 和一个 Service (VirusScanService)就是与查毒模块相关的组件定义,其实际代码在:
$ ls smali/com/android/settings/VirusScan* ...... smali/com/android/settings/VirusScanActivity$2.smali smali/com/android/settings/VirusScanAppActivity$FinishRiskScan.smali smali/com/android/settings/VirusScanActivity$3.smali smali/com/android/settings/VirusScanAppActivity$NormalScan.smali smali/com/android/settings/VirusScanAppActivity$7.smali smali/com/android/settings/VirusScanService$ScanBinder.smali smali/com/android/settings/VirusScanAppActivity$FinishNoRiskScan.smali smali/com/android/settings/VirusScanService$UpdateVirusLibTask.smali smali/com/android/settings/VirusScanAppActivity$FinishRiskScan$1.smali ......
重度发烧想彻底移除的朋友可以尝试一下。
Dalvik的汇编语言参考:
- Bytecode for the Dalvik VM: http://www.netmite.com/android/mydroid/dalvik/docs/dalvik-bytecode.html
- Dalvik opcodes: http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html
9.1.4 案例分析
以流氓软件微信电话本为例,iKe 在其blog上给了一个非常好的案例,移步:http://imid.me/blog/2013/08/16/weixin-phonebook-case-study/
9.2 编译
命令行编译,原理与 google glass 相同,参考:http://wiki.jackslab.org/Google_Glass_%E7%AC%94%E8%AE%B0#.E7.BC.96.E8.AF.91.E6.B5.8B.E8.AF.95.E7.8E.AF.E5.A2.83
9.3 安装Google Apps
现在谷歌要求下游使用 Android 系统的厂商,移除 Google 提供的服务框架,这导致谷歌的优质应用(比如 Gmail, GoogleMap, GoogleEarth)没法在这些厂家的系统里使用。
因此要用这些App,得先刷上社区的 CWM recovery,开机进如 Recovery 模式后,刷入 XDA 社区提供的 google apps 包,这个Android系统版本不一样,包内的文件版本也不一样,从这个页面找:
http://wiki.rootzwiki.com/Google_Apps
10 去除讨厌的微博尾巴
ROOT 系统,打开 /system/build.prop,修改:
ro.product.model=** ro.product.brand=** ro.product.manufacturer=**