引
脱离Android系统开发已经数以年计了,新的公司职位上已经没有太多关于Android系统开发,更多的是一些涉密的项目以及逆向相关的工作。由于业务需要,需要脱一个带有爱加密企业版壳的App,几经周折,常规的方式并不容易脱,正巧用于脱壳的虚拟机也罢工了,最后是通过真机脱掉的,至此就想说重新捡起Android系统开发,搭一个开发环境,编一份源码以备不时之需(真机脱壳还是方便不少,虚拟机一方面大多壳都有反虚拟机,需要修改相应的源码规避,另一方面就是真的ZJB卡)。
在网上搜了搜,本想再下个好用点的Ubuntu,突然发现Manjaro被吹上天了,我瞬间就把电脑上的Ubuntu虚拟机镜像Shift+Del了,高高兴兴的搞起来了Manjaro。Android系统就选用了支持市面手机较多的Lineage。
在此也给广大关注我OpenGL文集的朋友道个歉,断更两年多至今未续更,每次看到有新的粉丝(虽然都是一个两个,但我知道你们都是为了这个)我都有一种愧疚感,真对不住大家了。
Manjaro的安装
安装环境
- Windows7 x64
- VMware 15.0.4 build-12990004 x64
神秘代码:AZ312-2FE41-M81LP-R6WEZ-NA2Z4 - manjaro-kde-20.0.3
如果下载链接失效的话自行到Manjaro官网下载
打开官网->Try Manjaro->选择KDE版本(针对开发者,有集成较多开发工具--当然也可以使用其他版本)->Download - LineageOS-17.1
后面在虚拟机中下载
安装Manjaro
- 安装 VMware
(略) - 这个不用教程吧!!! - 安装Manjaro系统
虚拟机的配置
打开VMware->文件->新建虚拟机->典型安装->选择下载的Manjaro镜像->选择 其他Linux 4.x或更高版本内核 64 位-> ...
最终配置如下(200G硬盘、4G内存、网络为NAT模式)
- 启动安装
选择创建好的虚拟机,启动他
lang选择中文,driver选择nonfree,Boot选项上回车
(其实我测试似乎选择free更流畅一点)
- 插播一条题外话
当启动到这个界面的时候,我特么被惊讶到了,我以为特么已经安装完了,系统操作起来贼流畅,大部分的工具也都能用,我特么就开始装环境,下源码,为了快速启动每次都是挂起虚拟机,可是特么每次源码下一部分就死机黑屏,心中一万只草泥马,差点就干他三代了。后来才发现这只是用于安装系统用了,跟装win7的pe一个意思,我内存设置4G,当下载文件填满4G后就宕机了,这很正常。只能说这安装环境太完善了! - 启动安装
点击左上角的 Install Manjaro Linux 就正式开始安装了
这时候如果发现虚拟机不能连接网络,也确认虚拟机网络配置成NAT模式,但是屏幕右下角的网络图标被打叉了,那你首先要确认一下VMware的DHCP服务是不是被禁了(如果你装了火绒那就恭喜你了)
计算机(右键)->管理->服务和应用程序->服务->把VMware开头的那几个服务手动启动起来,此时你就会发现你的虚拟机有网了(记得到你的杀毒软件中解禁这几个服务)
- 安装配置
这部分也简单,磁盘选择抹除磁盘就好了,都是傻瓜式的安装
安装完重启之后,点击屏幕左下角就能看到终端了
优化你的Manjaro
此时你的Manjaro已经安装完成了,为了让你的Manjaro更好用可以先做下优化:
- 修改源
// 获取国内源
# sudo pacman-mirrors -i -c China -m rank
然后会弹出一个窗口,把三个都勾上
其实也就是添加三个地址到 /etc/pacman.d/mirrorlist(在 /etc/pacman.conf 中引用) 而已,也可以自己手动用 vim 添加 (默认没有装 vim,自己装一下)
// 添加完国内源后记得同步更新一下软件源
# sudo pacman -Syy
- 安装 open-vm-tools
(如果已经可以自动切换鼠标,拖拽文件正常就不需要重新装了)
这里要装 open-vm-tools,千万不能装VMware自带的(兼容性问题,窗口不能适应客户机,分辨率永远只有600x800)。
// gtkmm gtkmm3也是必要的 (不然在VMware下会有窗口无法适配客户机的问题)
# sudo pacman -S open-vm-tools gtkmm gtkmm3
// 重启生效
# reboot
- 安装AUR
// 安装AUR主要是为了安装一些野包(没有认证的)。
// 跟 pacman 用法基本一致(yay -S xxx),不需要 root 权限,需要root权限时会提示输入root密码
# sudo pacman -S yay
- 添加archlinuxcn软件源
# sudo vim /etc/pacman.conf // 编辑
在最下方添加如下内容(主要是导入key用)
[archlinuxcn]
SigLevel = Optional TrustedOnly
Server =https://mirrors.ustc.edu.cn/archlinuxcn/$arch
导入key
// 安装key (安装国内的软件源需要的key,没有的话安装软件会被拒绝或者卡在导入key过程)
# sudo pacman -Sy archlinuxcn-keyring
- 重命名Home目录下的目录名 (非必须)
如果你安装的是中文版的,用于开发的话 home 目录下都是中文目录很不方便,可以修改一下映射改成英文,然后又保留其它界面的中文环境(这部分修改后会导致虚拟桌面出问题,需要重新添加一下)
// 没有 vim 的自己装一下(yay -S vim)
# vim ~/.config/user-dirs.dirs
将文件修改为如下内容(中文部分重命名)
XDG_DESKTOP_DIR="$HOME/Desktop"
XDG_DOWNLOAD_DIR="$HOME/Download"
XDG_TEMPLATES_DIR="$HOME/Templates"
XDG_PUBLICSHARE_DIR="$HOME/Public"
XDG_DOCUMENTS_DIR="$HOME/Documents"
XDG_MUSIC_DIR="$HOME/Music"
XDG_PICTURES_DIR="$HOME/Pictures"
XDG_VIDEOS_DIR="$HOME/Videos"
重命名文件夹
// 重命名
# mv ~/桌面 ~/Desktop
# mv ~/下载 ~/Download
# mv ~/模板 ~/Templates
# mv ~/公共 ~/Public
# mv ~/文档 ~/Documents
# mv ~/音乐 ~/Music
# mv ~/图片 ~/Pictures
# mv ~/视频 ~/Videos
确认无误后重启,其它有需要的软件就自己安装
如果重启后出现不能适应客户机了,那就重装一下 gtkmm 和 gtkmm3 就可以了(重启生效),如果还不行你可能需要重装了。
安装 Lineage OS(17.1) 编译环境
可能这一步很多人句直接打开官方网站教程就开始撸了,包括我也是,但是走了不少弯路,话费了不少时间。
- 安装 platform-tools (manjaro系统自带了)
这个主要是要使用 adb 和 fastboot 工具,如果你不打算在 linux 上用这两个是可以不用安装的。
// 下载
# wget https://dl.google.com/android/repository/platform-tools_r29.0.5-linux.zip
// 解压
# unzip platform-tools-latest-linux.zip -d ~
添加环境变量
打开~/.profile,在文件末尾添加如下内容。这里添加的路径($HOME/)是刚刚解压的路径,如果你解压到别的地方,这里路径跟着相应修改就可以了,正常的 linux 工具安装方法,没什么特别的。
# add Android SDK platform tools to path
if [ -d "$HOME/platform-tools" ] ; then
PATH="$HOME/platform-tools:$PATH"
fi
source 一下文件,让配置立刻生效
# source ~/.profile // 使配置立即生效
- 安装工具链
这里大家可能就直接按官方教程那样,直接安装这些工具链:
然后你就会惊奇的发现,有一大堆包装不上了,即使你用 yay 也是如此,然后你可能会去寻找那些装不上的包在 manjaro 上的替换包,从此踏上一条不归路。。。
原因是这些工具链是 Ubuntu 上的,并不是 manjaro 上的(有些时候我在想,manjaro 吹上天,怎么这么多包不兼容或者换名字?),所以我们换个方向想问题可能会有不同的收获。我们反向去找 manjaro 上怎么安装 Android 编译工具链,很幸运,我这 archlinux 的 wiki 上找到了 Lineage OS 的工具链教程:
我们可以看到有一部分包是需要用 AUR 包的,有一部分是要替换掉的,看到最后发现人家还打包好了,经过漫长折磨的我看到这个心里是多么的五味杂陈。。。
// 安装工具链
# yay -S lineageos-devel
// 如果安装过程出现错误可能是因为缺少开发包或者版本太旧,可以更新一下基础开发包
# sudo pacman -S base-devel // 可以安装指定的也可以全部安装
安装工具链是交互式的,第一步会让你选择安装的 jdk 版本,我们要编译 Lineage OS 17.1 选择默认(open-jdk14),如果编译老版本则要选择对应的jdk版本(cm-14.1=>openjdk8 ),这里我们直接回车,接下来的都按默认,有提示是否安装的就输入 y 回车就行,只要你主机有联网很快就能装好了。
注:如果安装工具链出现有些包找不到之类的,你可以尝试换一下软件源。要自己装 jdk 的话使用 pacman -S jdkX-openjdk (X替换成要安装的版本)
- 切换 Python 版本
manjaro 系统已经自带了 Python ,默认是 Python3 ,然而 Lineage OS 14.1 编译则需要使用 Python2 否则会报一些莫名其妙的问题。
如果上面工具链安装没问题的话你系统中就已经安装了 Python2 ,此时你只要把链接文件指向 Python2 就行了:
// 查看 python 安装位置
// # which python
// 切换到 python 安装位置 (/usr/bin/)
// # cd /usr/bin/
// 修改链接文件 (ln -snf [新链接目标] [软链接地址])
# sudo ln -snf python2-config /usr/bin/python-config
# sudo ln -snf python2 /usr/bin/python
此时你可以在终端上输入 python 验证一下 Python 版本是否正常。
- 添加虚拟内存
编译 Lineage OS 需要大量的内存(经测试需要8G以上的内存,使用10G时能编译通过),一般使用虚拟机的不会分配到这么多内存,所以我们就需要添加一个虚拟内存。
添加之前先查看本机有没有已经有了,如果有就先删掉以前的再添加。
// 查看内存状态,swap(交换) 为 0 表示没有虚拟内存
# free
// 查看虚拟内存路径(也可以查看 /etc/fstab 文件)
# swapon -s
# swapoff /var/swap // 关闭当前的虚拟内存
# sudo rm -rf /var/swap // 删除当前的虚拟内存文件
// 添加新的虚拟内存
# su // 切换到 root 用户
// if 表示 input_file 输入文件;of 表示 output_file 输出文件;bs 表示 block_size 块大小;count 表示计数
# dd if=/dev/zero of=/var/swap bs=1M count=8192 // 新建虚拟内存文件 -- 8G (8192*1M=8G)
# mkswap /var/swap // 格式化文件
# swapon /var/swap // 启用虚拟内存
开机自动加载虚拟内存
在 /etc/fstab 文件中添加如下内容(如果之前已经添加过虚拟内存记得替换掉)
/var/swap swap swap defaults 0 0
- 配置samba (非必须)
创建共享目录 (目录可自行定义,这里为根目录下的workspace文件夹)
# sudo mkdir /workspace
# sudo chmod 777 /workspace // 记得带执行权限,否则会提示没有访问权限
在/etc/samba/下添加smb.conf文件,文件内容如下
[global]
# 所要加入的工作组或者域
workgroup = WORKGROUP
# 用于在 Windows 网上邻居上显示的主机名
netbios name = Manjaro
server string = Samba Server
# 定义安全级别
# security = user
server role = standalone server
# 将所有samba系统主机所不能正确识别的用户都映射成guest用户
# map to guest = bad user
# 是否开启dns代理服务
dns proxy = no
# 来宾账户(默认为nobody)
# guest account = huayu
# log
log file = /var/log/samba/%m.log
# 单位为kb
max log size = 50
# [homes]
# comment = Home Directories
# browseable = no
# writable = yes
# 共享目标(名字为显示的共享目录名--可任意)
[workspace]
# 共享路径
path = /workspace
# 有效用户(可访问的用户)
valid users = huayu
# 共享的目录是否让所有人可见
browsable = yes
# 是否可写
writable = yes
available = yes
browseable = yes
# 是否允许匿名(guest)访问
# guest ok = yes
# 客户端上传文件的默认权限
create mask = 0777
# 客户端创建目录的默认权限
directory mask = 0777
#注意共享文件在系统本地的权限不能低于以上设置的共享权限
添加samba帐号 (这里和系统帐号是分开的,可以同名但需要再配置一次)
// gpasswd [用户组] -a [用户名] (groups可以查看所有的用户组)
# sudo gpasswd huayu -a huayu
// smbpasswd -a [用户名] 稍后提示配置密码
# sudo smbpasswd -a huayu
启用smaba 服务
# systemctl enable smb nmb
# systemctl start smb nmb
编译 Lineage OS
- 初始化仓库
看官方教程点击这里
// 安装源码下载工具 repo
# sudo pacman -S repo
// 创建源码目录
# mkdir -p Desktop/android/lineage
# cd Desktop/android/lineage
// 切换 repo 的源为清华源,因为 repo init 会从远端同步 repo-project 然而因为墙的原因会导致失败(fatal: error [Errno 101] Network is unreachable)
// 所以要修改源
# export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'
// 添加 git 帐号 (第一次使用需要配置)
# git config --global user.email "[email protected]"
# git config --global user.name "Your Name"
// 初始化仓库 (从清华大学的镜像站同步)
# repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/lineageOS/LineageOS/android.git -b lineage-17.1
- 下载 Lineage OS
在同步之前我们需要先修改一下代码工程是源(原来的源有时也很快,可以先尝试直接同步,如果不行再修改源)
打开.repo/manifest/default.xml,将
改成
将
改成
将
改成
同步源码树(以后只需执行这条命令来同步):
// 部分仓库如 Lineage_framework_base 同步的时候会出现 bundle 错误,可以使用命令 repo sync --no-clone-bundle 进行同步
# repo sync // 加 -c 可以只同步当前分支
漫长的等待,何时完成就随缘吧!
- 指定平台
Lineage OS 是可以适配多个平台的,所以需要将工程先配置到我们需要的平台,我这里目标手机是用小米Note2,所以是 scorpio,其它平台对应不同的名字
// 同样需要一段时间的下载
# source build/envsetup.sh
// 这里还会从仓库下载一些文件(可能会提示错误,多试几下,可能需要FQ)
# breakfast scorpio
- 添加设备驱动
Android 本身是开源的,但为了保护厂商的利益,在驱动层是不开源的(这也是 Android 被踢出 Linux 的一大原因),这里也是一样,设备相关的驱动也是没有源码的,但可以从别的地方获取编译好的驱动程序。官方就提供了两种办法,一是从手机上直接提取,二是从官方或第三方的ROM中提取。
手机上提取
1、连接手机到电脑,连上adb
2、然后在 android/lineage/device/xiaomi/cancro 目录下执行 extract-files.sh 脚本即可
ROM 中提取
1、从官方或者其他渠道下载到可用的 ROM 包,提取出 system.img (可能会涉及到镜像格式转换: br->dat->img)
2、将 system.img 镜像挂载到一个目录上 sudo mount system.img android/system_dump/system/
3、同样,执行 extract-files.sh 脚本提取驱动 ./extract-files.sh xxx/android/system_dump/
点我获得官方详细的导出教程
不过不知道什么原因,用这两个方法提取文件后,在编译的时候总是会有几个文件找不到。通过导出脚本,知道需要导出哪些文件,手动东拼西凑凑够了(其实有些是目录变了,不同的包也正好文件能有所互补)
链接:https://pan.baidu.com/s/1_NcoAWSzUmvPoD0KJiyZVg
提取码:feh5 - 编译
这最后一步有一些坑还是需要注意一下,不过最最最主要的还是内存一定要大、内存一定要大、内存一定要大,否则总会有一些莫名其妙的问题(原本以为没有使用JACK 编译器了应该内存使用上会比较好,事实呵呵哒),本人测试发现在编译过程中系统消耗的总内存达到 10G 以上(无其他操作),编译过程大多在6G左右,但是在编译一些模块时(doc)内存会急剧升高,在内存耗尽时不会立刻out of memory而是会一直在等待内存,如果一直没有其他地方释放内存大概在一两个小时候溢出(坑B,我特么以为一直在编译)。本菜鸡是在 12G 内存(物理12G+虚拟8G)下才成功编译过的。
// 基本配置,可以放在.bashrc文件里面,这样内存启动终端就会自动设置
# export USE_CCACHE=1
# export CCACHE_EXEC=/usr/bin/ccache
# ccache -M 50G
# export CCACHE_COMPRESS=1
// 编译,进入源码根目录
# source build/envsetup.sh
// # export LC_ALL=C // 清除本地化配置(中文可能会不显示,字符集问题)
// 限定内存,不然很容易崩,测试 10G 是可以的,8G 以下全部狗带 (当然,你实际可用内存要大于这个,不然就 Out of memory 了)
// # export ANDROID_JACK_VM_ARGS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx10G"
// 漫长的编译,等吧。我好像编了 6 小时
# brunch scorpio
Lineage OS 目前编译后只有卡刷包,你可以先刷一个第三方的 Recovery (twrp)。或者像我一样,下一个小米官方的线刷包,将编译后的 img 文件替换掉小米官方线刷包中的同名文件(并没有一一匹配,替换重名的就行),我目前是这么刷的使用上并没有发现有问题,当然最好还是先刷一个 Recovery 再用 Recovery 刷卡刷包了,后续更新就可以用 adb 刷有更新的镜像了(一般也就内核和 system.img 了)
刷机
刷入recovery
因为官方的recovery会校验ROM包,非官方包是刷不了的,所以需要先将recovery替换掉。这里可以替换成LineageOS的recovery(在编译后的out目录中有),也可以刷成其他第三方的,如twrp:
- 下载twrp
点鸡下崽 - 刷入twrp
// 重启到fastboot
# adb reboot bootloader // 获取按住开机键和音量下键开机
# fastboot flash recovery twrp-3.4.0-0-scorpio.img
// 重启到recovery(注意,刷完recovery不能直接重启开机,否则刷入的recovery会被还原)
# fastboot boot twrp-3.4.0-0-scorpio.img
在recovery进行双清,并且刷入新系统的ROM(zip包)
root
- 下载root框架
原先的SuperSu框架慢慢的被magisk框架(面具)替换了,所以这里刷magisk吧 magisk官网
这里需要下载两个文件,一个是框架的zip包和权限管理的apk,zip包用twrp刷进系统,apk直接装系统上就行。
其他linux命令
- linux间文件拷贝
// 目录拷贝 scp -r [目标主机用户]@[目标主机]:[源目录] [目的目录]
# scp -r [email protected]:/home/ /home/
各种问题集结
- ninja 未安装
编译的时候可能会提示 ninja 没有安装,原则上会自己编译安装,也可以手动自己安装,不过即使不安装编译也能正常通过,似乎不是必须的
# yay -S ninja // 手动安装
- multiple definition of 'yylloc'
/usr/bin/ld: scripts/dtc/dtc-parser.tab.o:(.bss+0x50): multiple definition of `yylloc'; scripts/dtc/dtc-lexer.lex.o:(.bss+0x0): first defined here
collect2: 错误:ld 返回 1
...
gcc版本问题,从gcc-9.3升级到gcc-10.1出现编译内核出错,需要降级gcc
// 安装降级工具 downgrade
# sudo pacman downgrade
// 降级gcc(选择要降级的版本,gcc-9.3.0),这里降级可能失败,不过先把软件包下载下来
# sudo downgrade gcc
// 强制降级(选择downgrade下载的缓存,也可以自己其他渠道下载软件包)
# sudo pacman -Udd /var/cache/pacman/pkg/gcc-9.3.0-1-x86_64.pkg.tar.zst
// 强制降级方法2
// 先删除原软件包再降级安装
# sudo manpac -R gcc
# sudo pacman downgrade
- VMware中添加了共享文件夹,但manjaro中不显示
// 创建挂载点
# sudo mkdir /mnt/hgfs
// 挂载(重启后需要重新挂载)
# sudo /usr/bin/vmhgfs-fuse -o allow_other -o auto_unmount /mnt/hgfs
- 其它大神写的问题集锦及参考文献
Ubuntu 18.04 编译 AOSP 问题总结
打造自己的Android源码学习环境之五:编译Android源代码
Mi 3 / Mi 4 设备信息
Lineage OS 官方教程
Lineage OS 中文论坛
清华大学开源软件镜像站