内容简介:老板: 小X啊,我这个手机咋没啥特色啊.你看这个设置页和别人的都没啥区别.小X: emmmm..你想要啥特色?老板: 就是那种能提现我的特色的特色啊.
老板: 小X啊,我这个手机咋没啥特色啊.你看这个设置页和别人的都没啥区别.
小X: emmmm..你想要啥特色?
老板: 就是那种能提现我的特色的特色啊.
小X: 好好好,特色是吧?安排上.
今天这篇博客就记录了小X是如何通过修改 Android 的系统源码来定制 Android 系统的.
内容主要包括下面几点:
- 系统环境的预准备
- 下载 Android 源码
- 编译 Android 源码
- 刷写设备
- 定制 Android 系统
下载 Android 源码并编译网上已经有很多教程了,我这里使用的是 mac 系统编译,如果你也查找过相关博客可以知道 mac 系统编译 Android 源码会遇到很多坑.网上也有利用 docker 来创建 Ubuntu Image 的方式来进行 Android 系统编译的,例如 weishu
大佬的这篇 <史上最简单Android源码编译环境搭建方法> , 利用了 docker-aosp 开源项目来进行傻瓜式的下载编译.最开始我也尝试使用这种方式,不过发现在新版的 mac 系统,因为 uid
的问题导致无法编译成功( issues19 ), 我也
没有过多的花时间去解决这个 uid 的问题
,总之最后我选择使用了传统的方式,尤其是第一次尝试下载编译的,还是不要把这个过程变成一个黑匣子.
下面我会用我的踩坑经验来尽量让大家避免在下载编译,包括刷机时会遇到各种各样的错误.保证按照这个教程最后都能刷机成功,不过由于环境的复杂性,可能还是会遇到其他我没遇到的问题,这时可以Google 之..
环境预准备
下面是我的初始环境,电脑系统也是刚重装过的
- 系统: macOS High Sierra 10.13.6
- xcode: v9.4.1
- 手机: Nexus 6
- 终端: zsh
分盘
编译 Android 源码需要保证自己的所在的分区格式是区分大小写的,而一般 macOS 默认是不区分的,所以需要创建独立的分区来编译源码.
创建存放 dmg
的位置
cd ~ mkdir asop 复制代码
利用hdiutil 创建分区
hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 200g ~/aosp/android.dmg -volname android
这里我创建 200G 的分区用来下载和编译.最终实际使用了接近 130G.所以建议有足够大小的最好创建超过 150G 的分区大小.
创建挂载的快捷命令
vi ~/.zshrc
将下面内容复制到最后.
# mount the android file image function mountAndroid { hdiutil attach ~/aosp/android.dmg.sparseimage -mountpoint /Volumes/android; } # unmount the android file image function umountAndroid() { hdiutil detach /Volumes/android; } 复制代码
应用配置 source ~/.zshrc
挂载 mountAndroid
这样就会在 /Volumes
目录下创建了 android
目录.这就是之后下载源码的路径,这里我创建了子文件夹来存放: /Volumes/android/ANDROID_SPACE
xcode配置
这一段很重要,把 xcode 配好,后面会顺畅很多,如果系统没有装 xcode 那是最好的.去下载 9 以下的版本(下载地址),这里我下载了 8.3.3 版本.
网上很多教程是用新版本 xcode, 然后通过修改下载后的源码中的某配置来添加支持的方式,如下:
vi build/core/combo/mac_version.mk 添加10.13在后面 mac_sdk_versions_supported := 10.8 10.9 10.10 10.11 10.13 复制代码
不过这种方式最后在编译的时候,都会有各种各样的问题.
现在如果你和我一样,都是使用 xcode 8.3.3 的话,还需要到 github.com/phracker/Ma… 中下载 10.11 的 mac sdk
,否则还是会在编译时出现一些错误.
将下载下来的压缩包解压放到:point_down:目录即可:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/
总结下来其实很简单:
xcode 8.3.3 + 10.11 mac sdk xcode 9.x.x + 10.11 mac sdk
为啥是建议 8.3.3 呢,因为我就是在这个环境下,保证不会报错的.(踩坑过程中,有个报错,很多人建议是用9以下的版本,实际最后才发现其实 可能 只是和 mac sdk
相关联,并不是 xcode)
其他配置
确保环境变量 /opt/local/bin
显示在 /usr/bin
之前
检验: echo $PATH
,否则的话将:point_down:的代码复制到 ~/.zshrc
中.
export PATH=/opt/local/bin:$PATH
然后再应用配置 source ~/.zshrc
安装MacPorts
获取 Make、Git 和 GPG 程序包
POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg
设置fd上限
ulimit -S -n 1024
下载源码
我们通过 Repo 下载 Android 源码.
Repo 是谷歌用 Python 脚本写的调用 git 的一个脚本, 可以用来管理多个git库.
安装 Repo
mkdir ~/bin curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo # 无法连接 Google 可以使用清华大学镜像 curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo(清华大学镜像) chmod a+x ~/bin/repo 复制代码
安装完成后,为了方便使用可以将 repo 添加到环境变量:
#repo export PATH=/Users/xxx/bin:$PATH 复制代码
下载完之后,如果网无法连接 Google , 还需要:point_down:配置:
vi ~/bin/repo 修改 REPO_URL = 'https://gerrit-googlesource.proxy.ustclug.org/git-repo' 复制代码
选择编译的版本
先切到下载目录
cd /Volumes/android/ANDROID_SPACE
根据自己的手机机型,以及自己想安装的版本号,来选择具体的版本,连接如下:point_down::
source.android.com/source/buil…
比如这里我选择的是如下版本(android-7.1.1_r57):
这里要记住 NGI77B
这个代码,后面需要用到 , 选择好之后,初始化 repo 的配置.
repo init -u https://android.googlesource.com/platform/manifest -b android-7.1.1_r57 repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-7.1.1_r57 (清华大学镜像) 复制代码
下载
repo sync
编译源码
编译准备
首先,如果你用的是 zsh, 请一定要切到bash. 直接输入 bash
即可.切记切记.
下载对应设备硬件相关内容
下载地址:point_down::
developers.google.com/android/dri…
对应之前我们选择的版本的代码,例如我的是 NGI77B
,选择下载对应的驱动:
将下载的文件都解压,其实就是三个 shell 命令,将他们拷贝到下载的 Android 目录下.并执行:
./extract-broadcom-shamu.sh ./extract-moto-shamu.sh ./extract-qcom-shamu.sh 复制代码
中间需要接受相应 license,输出 I ACCEPT
即可.
配置相应的环境变量,可以直接复制:point_down:的,需要改一改相应的目录名
#java home export JAVA_7_HOME=`/usr/libexec/java_home -v 1.7` export JAVA_8_HOME=`/usr/libexec/java_home -v 1.8` #defalut java_home export JAVA_HOME=$JAVA_8_HOME export PATH=${JAVA_HOME}/bin:$PATH export ANDROID_JAVA_HOME=$JAVA_HOME #android export ANDROID_HOME=/Users/mio/Library/Android/sdk export PATH=/Users/xxx/Library/Android/sdk/build-tools/27.0.3:$PATH export PATH=/Users/xxx/Library/Android/sdk/platform-tools:/Users/mio/Library/Android/sdk/tools:$PATH 复制代码
ANDROID_JAVA_HOME 一定要配~~
Ps: 记得安装 Java 和 Android sdk ,这里不多说了
清理
make clobber
初始化编译的环境
source build/envsetup.sh
选择编译目标
lunch
命令会列出可以编译的目标,如下:
Lunch menu... pick a combo: 1. aosp_arm-eng 2. aosp_arm64-eng 3. aosp_mips-eng 4. aosp_mips64-eng 5. aosp_x86-eng 6. aosp_x86_64-eng 7. full_fugu-userdebug 8. aosp_fugu-userdebug 9. mini_emulator_arm64-userdebug 10. m_e_arm-userdebug 11. m_e_mips-userdebug 12. m_e_mips64-eng 13. mini_emulator_x86-userdebug 14. mini_emulator_x86_64-userdebug 15. aosp_dragon-userdebug 16. aosp_dragon-eng 17. aosp_marlin-userdebug 18. aosp_sailfish-userdebug 19. aosp_flounder-userdebug 20. aosp_angler-userdebug 21. aosp_bullhead-userdebug 22. hikey-userdebug 23. aosp_shamu-userdebug 复制代码
具体目标可以根据 source.android.com/source/runn… 来选择.
因为我是 Nexus6 所以选择 23.
编译
make -j16
我下载的源码 bison
是存在 bug 的,所以需要打上修复后的 commit.可以先尝试编译,如果发现类似下面的错误可以如我所说的方式修复.
错误内容:x::
FAILED: /bin/bash -c "prebuilts/misc/darwin-x86/bison/bison -d --defines=out/host/darwin-x86/obj/STATIC_LIBRARIES/libaidl-common_intermediates/aidl_language_y.h -o out/host/darwin-x86/obj/STATIC_LIBRARIES/libaidl-common_intermediates/aidl_language_y.cpp system/tools/aidl/aidl_language_y.yy"
修复方法:
cd external/bison git cherry-pick c0c852bd6fe462b148475476d9124fd740eba160 cd ../../ make bison cp /Volumes/android/ANDROID_SPACE/out/host/darwin-x86/bin/bison /Volumes/android/ANDROID_SPACE/prebuilts/misc/darwin-x86/bison/ cd ../../ 复制代码
然后删除 out
文件夹,再进行编译.理论上如果之前按照我说的配置好 xcode,应该不会再报奇葩的错误了.
然后就是等了.应该会比下载的时候快上不少.
刷写设备
编译完成后刷机其实非常简单
如果没有 fastboot 和 adb 执行:point_down:的代码:
make fastboot adb
进入 fastboot 模式
adb reboot bootloader
解锁
fastboot flashing unlock
刷机
fastboot flashall -w
友情提示: 如果刷跪了,可以直接到:point_right:网址下载官方镜像,重新刷.
修改源码
导入源码到 Android Studio
编译 idegen
模块,用来生成可以让 idea/as
打开的工程.
mmm development/tools/idegen/ ./development/tools/idegen/idegen.sh 复制代码
执行完成后,在当前目录下生成 android.ipr
, android.iml
, android.iws
三个文件.
其中 android.ipr
文件可以直接用 Android Studio 打开.
但是如果所有模块都通过 AS 打开会非常的慢,所以我们可以先编辑 android.iml
, 通过:point_down:这种方式可以排除不需要的模块.
<excludeFolder url="file://$MODULE_DIR$/xxxxxx" />
例如,我不需要 prebuild
模块,便可以在该文件里添加下面一行配置:
<excludeFolder url="file://$MODULE_DIR$/prebuilt" />
PS: 当然我们也可以直接使用 sublime
打开想要修改的模块.
DEBUG 源码
导入到 AS 之后,例如我们要 debug com.android.settings.dashboard.SummaryLoader
这个类.我们按照平时的方式打断点,之后点击下面的按钮:
在出现的对话框中选择 setting 进程即可.
编译单独的模块
上面使用的 mmm
命令实际上就是我们所说的编译单独模块的一个命令.如果提示找不到 mmm
命令.则需要先执行下面的命令(你肯定很熟悉:
source build/envsetup.sh
编译源码常用的有下面几种方式:
- -m 编译所有模块
- -mm 编译当前目录下的模块,不包括依赖
- -mmm 编译指定路径下的模块,不包括依赖
- -mmma 编译指定路径下的模块,包括依赖
实战一: 修改 Settings 模块
例如我们修改 packages/apps/Settings/
下的 String.xml
为:point_down::
<string name="notification_summary_none" msgid="3440195312233351409">"已允许所有应用发送通知~~~喵"</string>
修改完成后,需要对 Settings
模块重新打包.
mmm packages/apps/Settings/
打包完成后我们需要去重新生成 system.imgae
:
make snod
image
生成后,基本就大功告成了,我们只需要将它刷到手机当中即可.
adb reboot bootloader fastboot flash system out/target/product/shamu/system.img 复制代码
刷完之后就可以看到成果了:point_down::
实战二: 添加自己的模块
使用 Android Studio 创建一个测试项目 AuthorSample
,并将项目复制到 packages/apps
目录下面.
由于是 AS 项目,所以我们在:point_down:目录创建一个 Android.mk
文件,用来配置编译信息.
/Volumes/android/ANDROID_SPACE/packages/apps/AuthorSample/app/src/main
Android.mk
内容如下:
#必备的两行,声明LOCAL_PATH变量,也就是当前的路径 #并清除其它变量 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) #包名,这生成的apk名字。AuthorSample.apk LOCAL_PACKAGE_NAME := AuthorSample LOCAL_CERTIFICATE := platform #如果使用的系统的包,需要引入他们使用的资源文件,否则会提示编译资源找不到的错误 LOCAL_RESOURCE_DIR += $(LOCAL_PATH)/res LOCAL_RESOURCE_DIR += frameworks/support/v7/appcompat/res #LOCAL_RESOURCE_DIR += frameworks/support/v7/gridlayout/res #LOCAL_RESOURCE_DIR += frameworks/support/v7/recyclerview/res #指定该模块的编译版本为optional #user: 指该模块只在user版本下才编译 #eng: 指该模块只在eng版本下才编译 #tests: 指该模块只在tests版本下才编译 #optional:指该模块在所有版本下都编译 LOCAL_MODULE_TAGS := tests #源码所在目录,这里就在当前位置的java目录下。所以直接写java LOCAL_SRC_FILES := $(call all-java-files-under, java) #LOCAL_SRC_FILES += \ # src/xx/xx/xx/XxxOne.aidl \ # src/xx/xx/xx/XxxTwo.aidl #依赖的jar包,包括系统的和第三方的(放在libs目录)jar包 LOCAL_STATIC_JAVA_LIBRARIES += android-support-v4 \ android-support-v7-appcompat #android-support-v7-recyclerview #混淆文件名 LOCAL_PROGUARD_FLAG_FILES := proguard.flags #关闭混淆 LOCAL_PROGUARD_ENABLED := disabled LOCAL_AAPT_FLAGS := --auto-add-overlay LOCAL_AAPT_FLAGS += --extra-packages android.support.v7.appcompat #LOCAL_AAPT_FLAGS += --extra-packages android.support.v7.gridlayout #LOCAL_AAPT_FLAGS += --extra-packages com.android.datetimepicker #LOCAL_AAPT_FLAGS += --extra-packages android.support.v7.recyclerview #打包成apk include $(BUILD_PACKAGE) include $(call all-makefiles-under,$(LOCAL_PATH)) 复制代码
再利用 mmm
命令编译该模块:
mmm packages/apps/AuthorSample/app/src/main/
编译完成之后 apk
会生成在:point_down:目录中:
/Volumes/android/ANDROID_SPACE/out/target/product/shamu/data/app/AuthorSample/AuthorSample.apk
我们只需要将 apk push 到手机的 /system/app/
目录下即可.
adb root adb remount adb push /Volumes/android/ANDROID_SPACE/out/target/product/shamu/data/app/AuthorSample/AuthorSample.apk /system/app/ 复制代码
重启之后你就发现手机上已经自带了你所写的应用(无法卸载哦~~)
阅读博客还不过瘾?
欢迎大家扫二维码通过添加群助手,加入交流群,讨论和博客有关的技术问题,还可以和博主有更多互动
博客转载、线下活动及合作等问题请邮件至 shadowfly_zyl@hotmail.com 进行沟通
以上所述就是小编给大家介绍的《老板:小X,我这个Android系统你安排定制下》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
算法导论
[美] Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest、Clifford Stein / 高等教育出版社 / 2002-5 / 68.00元
《算法导论》自第一版出版以来,已经成为世界范围内广泛使用的大学教材和专业人员的标准参考手册。 这本书全面论述了算法的内容,从一定深度上涵盖了算法的诸多方面,同时其讲授和分析方法又兼顾了各个层次读者的接受能力。各章内容自成体系,可作为独立单元学习。所有算法都用英文和伪码描述,使具备初步编程经验的人也可读懂。全书讲解通俗易懂,且不失深度和数学上的严谨性。第二版增加了新的章节,如算法作用、概率分析......一起来看看 《算法导论》 这本书的介绍吧!