查看Android/CyanogenMod 发烧笔记的源代码
←
Android/CyanogenMod 发烧笔记
跳转到:
导航
,
搜索
因为以下原因,你没有权限编辑本页:
您刚才请求的操作只有这个用户组中的用户才能使用:
用户
您可以查看并复制此页面的源代码:
=== 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 ==== 解包 ==== 以移除MIUI V5 系统设置(/system/app/Settings.apk) 中的病毒扫描为例,WINDOWS GUI解包示例如下: <pre> 先从刷机包/手机文件系统的 /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 都在里面 </pre> GNU/Linux 下的过程如下: <pre> 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 </pre> AndroidManifest.xml 为APP主框架文件,res/ 下是一些资源文件(如字符串,PNG图片等),smali/ 下才是主角,里面都是 Dalvik 虚拟机的“汇编语言“文件 当Android启动一个APP时,它必须要知道这个APP有那些组件。所以,所有APP解包后都有一个 AndroidManifest.xml的文件,其中写有这个APP的所有组件,当然还有一些其他信息,比如指明该APP所需要的各种权限(访问通话记录、访问网络...),以及声明该APP所需链接到的库名称 <br><br> ==== 重打包 ==== 即把APK解包、修改后,再重新做成 APK 包,安装于系统中 使用 platform_tools 包中的 aapt 工具,aapt 实际是 android SDK 官方带的打包工具,也是自由的,可自由修改 MIUI 为改善APP在各种不同分辨率下的显示效果,都在 res/ 资源目录下加入了 values-largeui/ values-mediumui/ 目录,官方 aapt 处理时会出现错误: <pre> $ 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] ...... ...... </pre> MIUI 开放了ROM制作的工具,位于:http://github.com/MiCode/patchrom_tools 因此需要使用一个修改后的 aapt 替换原来的: <pre> $ wget http://github.com/MiCode/patchrom_tools/raw/ics/aapt $ sudo cp aapt /usr/local/bin/ </pre> WINDOWS 下取: http://github.com/MiCode/patchrom_tools/raw/ics/aapt.exe 替换原来的即可 再次执行,stk.apk 已经生成了,虽有一些警告,但没关系: <pre> $ 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 </pre> <br><br> ==== 修改包 ==== 需要在 Dalvik 甚至 ARM 指令集的层面上去修改APP的,一般出于以下情形: * 优化,移除不需要的组件 * 反流氓,探寻流氓APP搜集用户隐私数据并上传服务器的代码,取证后移除 * 反广告,移除广告代码 * 汉化 先来看看 MIUI V5 下,隐藏在 com.andorid.settings(系统设置)中的查毒模块,是啥样的 先打开上个步骤中解包后目录下的 AndroidManifest.xml 文件,找到: <pre> <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> </pre> Android 的APP没有统一的函数入口(比如C中的 main() 函数),其是由 Activity, Service 等等这些组件组成,Activity相当与APP的与用户互动的一个功能,Service则是跑在后台的服务,没有图形界面,用户一般看不到 这两个 Activity (VirusScanActivity和VirusScanAppActivity) 和一个 Service (VirusScanService)就是与查毒模块相关的组件定义,其实际代码在: <pre> $ 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 ...... </pre> 重度发烧想彻底移除的朋友可以尝试一下。 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 <br><br> ==== 案例分析 ==== 以流氓软件微信电话本为例,iKe 在其blog上给了一个非常好的案例,移步:http://imid.me/blog/2013/08/16/weixin-phonebook-case-study/ <br><br>
返回到
Android/CyanogenMod 发烧笔记
。
个人工具
登录
名字空间
页面
讨论
变换
查看
阅读
查看源代码
查看历史
操作
搜索
导航
首页
社区专页
新闻动态
最近更改
随机页面
帮助
工具箱
链入页面
相关更改
特殊页面