Android/CyanogenMod 发烧笔记

来自Jack's Lab
(版本间的差异)
跳转到: 导航, 搜索
(缘起)
(常用基带芯片)
第453行: 第453行:
 
=== 常用基带芯片 ===
 
=== 常用基带芯片 ===
  
XDA 社区网友搜集的: [[手机基带芯片信息搜集]]
+
根据 XDA 社区网友搜集的信息,整理了一个页面: [[手机基带芯片信息搜集]]
  
国内的主流机型我汇总了一下: [[基带处理器和射频前端的体系结构]]
+
国内的主流机型我汇总了在这个页面里: [[基带处理器和射频前端的体系结构]]
  
  

2013年12月25日 (三) 11:32的版本

目录

1 缘起

手上的三星 Android 机 T959 用了快三年了,一直用原生系统,挺好用,一直没有分析的动力。

最近刷了 MIUI V5,内置了一堆的吸流量、浪费系统资源的应用,开机后,可用内存只有 10% 左右(51MB前后),苦不堪言。内置的百度输入法,一个输入法,居然没事就去访问我的通讯录、通话记录和GPS坐标,要知道其是有网络通讯权限的,也就是说装了百度输入法的用户,他就会偷用户的通讯录、通话记录和当前地理位置(GPS坐标),并记录在其服务器上



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 这些有可能提升权限的应用程序



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




3 Android 手机系统结构

Android 手机是:手机硬件 + Linux 内核 + Android扩展库(/system/lib/*.so) + 类Java虚拟机(google自己实现的虚拟机Dalvik)+ Java应用(图形环境,手机桌面,应用程序等等)的混合体


AndroidArch.PNG



手机硬件之上跑的是 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 主板图

T959-motherboard.png



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



4.3 系统框图

S5pc110-block-diagram.png


http://www.techinsights.com/teardowns/samsung-galaxy-s-teardown/

http://www.evolife.cn/html/2011/57854.html

http://forum.xda-developers.com/showthread.php?t=1372365

小米3拆解:http://en.miui.com/thread-7633-1-1.html



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"              # 貌似是保留区


详细参考:

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#Storage


如果需要修改 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库一般是闭源的,这也激起了社区的极大兴趣,三星的相关探索参考:




6.5 Hack



7 刷机

7.1 概述

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
  • AROMA Filemanager



8 Dalvik虚拟机

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 虚拟机的“汇编语言“文件,Dalvik的汇编语言参考:



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 'bluetooth_ftp_acceptance_dialog_text' has no default translation in /work/android/apktool/miui-v5/Settings/res; found: zh_TW
aapt: warning: string 'bluetooth_ftp_connection_permission_request' has no default translation in /work/android/apktool/miui-v5/Settings/res; found: zh_CN zh_TW
aapt: warning: string 'bluetooth_map_connection_permission_request' has no default translation in /work/android/apktool/miui-v5/Settings/res; found: zh_CN zh_TW
aapt: warning: string 'bluetooth_mas_acceptance_dialog_text' has no default translation in /work/android/apktool/miui-v5/Settings/res; found: zh_TW
aapt: warning: string 'bluetooth_mas_request' has no default translation in /work/android/apktool/miui-v5/Settings/res; found: zh_TW
aapt: warning: string 'bluetooth_pbap_connection_permission_request' has no default translation in /work/android/apktool/miui-v5/Settings/res; found: zh_CN zh_TW
aapt: warning: string 'bluetooth_sap_acceptance_dialog_text' has no default translation in /work/android/apktool/miui-v5/Settings/res; found: zh_TW
aapt: warning: string 'bluetooth_sap_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_disabled' has no default translation in /work/android/apktool/miui-v5/Settings/res; found: zh_CN 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.2 编译























个人工具
名字空间

变换
操作
导航
工具箱