Skip to content

Instantly share code, notes, and snippets.

@h1code2
Last active February 5, 2023 09:12
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save h1code2/d2b8626643b456b3e714ce4a94904b59 to your computer and use it in GitHub Desktop.
Save h1code2/d2b8626643b456b3e714ce4a94904b59 to your computer and use it in GitHub Desktop.
Android 系统源码编译 #android #ubuntu #编译 #源码 #8.0.0

adb install -r 替换已存在的应用程序,也就是说强制安装

adb install -l 锁定该应用程序

adb install -t 允许测试包

adb install -s 把应用程序安装到sd卡上

adb install -d 允许进行将见状,也就是安装的比手机上带的版本低

adb install -g 为应用程序授予所有运行时的权限

基于 Android 9.0。

许多命令时间一长就记不清了,记录一下。

Android 环境引入的命令

在shell中执行"source build/envsetup.sh"后,Android将增加一些命令到当前环境中。

lunch:选择编译的产品类型,并存储在当前环境中。

lunch <product_name>-<build_variant>
tapas:与 'lunch' 类似,可以指定编译的应用。

tapas [<App1> <App2> ...] [arm|x86|mips|arm64|x86_64|mips64] [eng|userdebug|user]
printconfig:打印当前配置。
croot:切换到顶层目录
m:从顶层目录开始编译。
mm:编译当前目录中的所有模块,但不包含依赖的模块。
mmm:编译指定目录的所有模块,但不包含依赖的模块。可以使用下述方式限制编译的模块。

mmm dir/:target1,target2.
mma:编译当前目录中的所有模块,包含依赖的模块。
mmma:编译指定目录的所有模块,包含依赖的模块
provision:对设备进行固件升级,选项将被传递到 fastboot 中。
cgrep:在当前目录的所有 C/C++ 文件中查找。
ggrep:在当前目录的所有 Gradle 文件中查找。
jgrep:在当前目录的所有 Java 文件中查找。
resgrep:在当前目录的所有 res/*.xml 文件中查找。
mangrep:在当前目录的所有 AndroidManifest.xml 文件中查找。
mgrep:在当前目录的所有 Makefiles 文件中查找。
sepgrep:在当前目录的所有 sepolicy 文件中查找。
sgrep:在当前目录的所有文件中查找。
godir:切换到包含指定文件的目录。
make相关命令
make 或 m 后面可以跟随不同的参数来指定编译目标。

droid:默认的 make 编译目标。
all:编译所有内容,包括不含droid标记的内容。编译服务器会运行此命令,以确保项目中包含Android.mk文件的所有元素都会编译。
checkbuild:编译所有的模块。
showcommands:显示编译步骤中实际的编译指令。
PRODUCT-xxx-yyy:编译指定的产品。
dump-products:显示产品的编译信息。
LOCAL_MODULE:编译指定的模块。例如,

make runtime
nothing:不编译任何事情,只是解析和验证编译框架。
java:编译项目中的所有java代码。
native:编译项目中的所有native代码。
host:编译host端代码。
target:编译target端代码。
(java|native)-(host|target):按组合编译限定代码。
(host|target)-(java|native):按组合编译限定代码。
snod:快速重新编译system镜像。
vnod:快速重新编译vendor镜像。
pnod:快速重新编译product镜像。
update-api:更新SDK API。
otapackage:生成OTA升级包。
updatepackage:生成zip升级包。
docs:编译文档。
ndk-docs:生成ndk文档。
sdk:编译生成SDK。
ndk:编译生成NDK。
ramdisk:编译生成ramdisk。
systemtarball:生成system的tar包。
boottarball:生成boot的tar包。
userdatatarball:生成data的tar包。
systemimage:生成system.img镜像。
bootimage:生成boot.img镜像。
vbmetaimage:生成vbmeta.img镜像。
userdateimage:生成userdata.img镜像。
cacheimage:生成cache.img镜像。
bptimage:生成partition-table.img镜像。
vendorimage:生成vendor.img镜像。
productimage:生成product.img镜像。
apps_only:编译不包含 user,userdebug,eng 标签的应用程序。
dist:拷贝输出到dist目录。
dist_files:仅仅拷贝库文件到dist目录。
libandroid_runtime:编译JNI相关内容。
framework:编译java framework相关内容。
services:编译系统服务相关内容。
cts:编译CTS测试套件。
vts:编译VTS测试套件。
make clean 相关命令
clean:清除当前配置编译的所有文件,等同于rm -rf out/<configuration>/。
**clean-$(LOCAL_MODULE):清理指定模块的编译结果。
clean-$(LOCAL_PACKAGE_NAME):清理指定包的编译结果。
clobber:清除所有输出,等同于rm -rf out/。
dataclean:删除当前配置上data目录的所有文件。
clean-sdk:清理SDK编译输出。
installclean:清除与编译类型相关的文件。在切换编译目标是使用该命令可以加快编译。
# 编译过程输入的 shell 命令
500 sudo dd if=/dev/zero of=/swp bs=10M count=400
501 sudo mkswap /swp
502 sudo swapon /swp
503 free -m
504 export LC_ALL=C
505 m -j32
506 history >> history_txt
cd Desktop/
ls
tar -zxvf VMwareTools-10.3.10-13959562.tar.gz
ls
cd vmware-tools-distrib/
./vmware-install.pl
sudo ./vmware-install.pl
cd Desktop/
cat read.txt
vim read.txt
mkdir myaosp && cd myaosp
git config --global user.name "qiled"
git config --global user.email "qiled@qq.com"
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
vim ~/.bashrc
source ~/.bashrc
proxychains curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmox a+x ~/bin/repo
chmod a+x ~/bin/repo
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 100
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 150
python
df -h
echo $PATH
sudo apt install proxychains
vim
sudo apt install vim
sudo vim /etc/proxychains.conf
proxychains curl ip.sb
curl
sudo apt install curl
proxychains curl ip.sb
sudo proxychains apt-get update && sudo apt-get upgrade
proxychains sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig openjdk-8-jdk htop tree p7zip-full python python3
repo --help
ls -lah
proxychains curl ip.sb
rm -rf ~/bin/repo
proxychains curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
repo --help
sudo apt install proxychains4
cd ~/bin
ls -lah
rm -rf repo
sudo gedit /etc/proxychains4
sudo vim /etc/proxychains4
curl -sSL 'https://gerrit-googlesource.proxy.ustclug.org/git-repo/+/master/repo?format=TEXT' |base64 -d > ~/bin/repo
ls -lah
chmod a+x ~/bin/repo
repo --help
vim repo
cd ~/myaosp/
ls -lah
cd ..
rm -rf myaosp/
mkdir aosp10
cd aosp10/
ls -lah
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-10.0.0_r1 --depth=1
repo sync -c -j4
df -h
du -sh ../aosp10/
proxychains wget https://dl.google.com/dl/android/aosp/google_devices-sailfish-qp1a.190711.019-a7ebdda4.tgz
proxychains wget https://dl.google.com/dl/android/aosp/qcom-sailfish-qp1a.190711.019-a2f14717.tgz
ls -lah
sha256sum google_devices-sailfish-qp1a.190711.019-a7ebdda4.tgz
sha256sum qcom-sailfish-qp1a.190711.019-a2f14717.tgz
tar -xzf qcom-sailfish-qp1a.190711.019-a2f14717.tgz
tar -xzf google_devices-sailfish-qp1a.190711.019-a7ebdda4.tgz
ls -lah
rm google_devices-sailfish-qp1a.190711.019-a7ebdda4.tgz qcom-sailfish-qp1a.190711.019-a2f14717.tgz
ls -lah
du -sh ../aosp10/
ls -lah
du -sh ../aosp10/
htop
du -sh ../aosp10/
du -s ../aosp10/
du -sh ../aosp10/
date
ls -lah
./extract-google_devices-sailfish.sh
./extract-qcom-sailfish.sh
df -h ./aosp10/
du -h ./aosp10/
du -sh ../aosp10/
du -sh /aosp10/
du -sh ./aosp10/
du -sh ./aosp10/out/
du -sh ./aosp10/
ls
cd aosp10/
ls
cd out/
ls
cd target/
ls
cd product/
ls
cd sailfish/
ls
history
cd aosp10/
ls -lah
python
. build/envsetup.sh && lunch
. build/envsetup.sh && lunch aosp_sailfish-userdebug
m
history
ls -lah
cd out/target/product/
ls -lah
cd sailfish/
ls -lah
7zr a -t7z -mmt$(nproc --all) ~/pixel1_aosp10r1_-userdebug.7z ./*.img ./android-info.txt
ls -lah
ls -ah
cd ~/aosp10/
ls -lah
htop
ls -lah
sha256sum pixel1_aosp10r1_-userdebug.7z
7z l pixel1_aosp10r1_-userdebug.7z
sha256sum pixel1_aosp10r1_-userdebug.7z
ls
mdsum pixel1_aosp10r1_-userdebug.7z
sha256sum pixel1_aosp10r1_-userdebug.7z
ls
cd aosp10/
ls
cd out/target/product/sailfish/
s
ls
cd ~.
cd ~
history
history > ~/Desktop/history.txt
# 刷机脚本
# 其中bootloader 和 radio 两个img文件修改成 你自己下载的恢复包里面的文件名字
adb reboot bootloader
fastboot flash bootloader bootloader-sailfish-8996-012001-1706221457.img
fastboot reboot-bootloader
fastboot flash radio radio-sailfish-8996-013053-1708040002.img
fastboot reboot-bootloader
fastboot flash system system.img
fastboot flash ramdisk ramdisk.img
fastboot flash vendor vendor.img
fastboot flash userdata userdata.img
fastboot flash boot boot.img
fastboot reboot

Android源码目录下的build/envsetup.sh文件,描述编译的命令

m: Makes from the top of the tree. mm: Builds all of the modules in the current directory. mmm: Builds all of the modules in the supplied directories. 要想使用这些命令,首先需要在android源码根目录执行. build/envsetup.sh 脚本设置环境

m:编译所有的模块 mm:编译当前目录下的模块,当前目录下要有Android.mk文件 mmm:编译指定路径下的模块,指定路径下要有Android.mk文件 mmm 命令只能编译有 Android.mk 文件的目录,比如修改了 android/frameworks/base/core/res/res/layout/ 目录下的布局文件, 而该路径中,base/ 目录和第一个 res/ 目录都包含 Android.mk 文件,这个时候,你只需要编译 res/ 目录,命令如下: mmm frameworks/base/core/res/

note: 假如编译没问题在测试的时候遇到了崩溃,可能是从新编译的包,其他地方的一些资源引用不成功导致。还是上面的例子,如果你修改了 android/frameworks/base/core/res/res/layout/ 目录下的布局文件,编译完 res/ 目录后,还需要编译 base/ 目录, 然后两次编译生成的 jar 包和 apk 文件,都要推送,才能确保万无一失。

指令不可用错误:需要先source build/envsetup.sh ,然后lunch,才能使用,已经source过就不需要。 原因:初次进入 Ubuntu 系统,或者切换用户后,需要重新配置编译环境.

Ubuntu_2020.4编译Android源码

1. 源码同步(Piexl1_8.0.0_r2)

文档参照:https://lug.ustc.edu.cn/wiki/mirrors/help/aosp/

  • repo源下载
# 更新apt源
sudo apt update

mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo  # 建议手动下载push到bin目录下
## 如果上述 URL 不可访问,可以用下面的:
## curl -sSL  'https://gerrit-googlesource.proxy.ustclug.org/git-repo/+/master/repo?format=TEXT' |base64 -d > ~/bin/repo
chmod a+x ~/bin/repo
  • 同步源码(配置之后10M/s大概下载3小时)
mkdir ~/Desktop/aosp
cd aosp
# 配置git网络连接模式vpn(配置自己的vpn连接,加快下载速度)
git config --global http.proxy 'socks5://192.168.43.54:7890'
# 初始化后同步android-8.0.0_r2源码
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-8.0.0_r2
repo sync
## 如果提示无法连接到 gerrit.googlesource.com,可以编辑 ~/bin/repo,把 REPO_URL 一行替换成下面的:
## REPO_URL = 'https://gerrit-googlesource.proxy.ustclug.org/git-repo'

2. 源码编译

1. 环境安装

sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig 

sudo apt install openjdk-8-jdk
sudo apt install python

2. 源码编译

# 进入同步后的源码目录
cd aosp800_r2
# 配置git
git config --global user.name "Your Name" // 复制即可
git config --global user.email "you@example.com" // 复制即可

# 查找手机版本对应的Build型号 -- https://source.android.com/setup/start/build-numbers
# sialfish8.0.0_r2 为 OPR6.170623.011

# 下载版本对应驱动(8.0.0_r2为OPR6.170623.011) -- https://developers.google.cn/android/drivers
# 将解压出来的sh文件放到aosp800_r2源码目录,并给权限chmod 777 xx.sh
binaries for Android 8.0.0 (OPR6.170623.011)
Hardware Component Company	Download	SHA-256 Checksum
Vendor...			Google	 Link		aca1f68551b9bded90c0a4fe70861d360c9b112e31344dacaf0908014d339901
GPS...				Qualcomm Link		f189573fa7a8a22291ac4447661fc709c80c61b69d04d11d157e61a506fcaec1

# 将上面下载的sh文件放到aosp800_r2目录下并执行
./extract-google_devices-sailfish.sh
./extract-qcom-sailfish.sh

# 在源码目录下的 build/envsetup.sh 最后一行加上
export LC_ALL=C

source build/envsetup.sh
lunch 23    # 指定为sailfish-userdebug版本
make -j4    # 核数较少,开启4线程即可,编译过程报错可不管,能继续执行不停止即可

# 可能产生的问题
xxx.so:no such file
# 解决办法
# 在aosp800_r2源码目录查找该so文件,例如缺失的为libncurses.so.5链接库
find ./ -name libncurses.so.5
# 获取到该文件路径,复制到/usr/lib下,缺哪个链接文件,就复制哪个链接文件即可
sudo cp youraosplib/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/lib/libncurses.so.5 /usr/lib

# 再次执行
source build/envsetup.sh
lunch 23  # lunch aosp_sailfish-user: 不带root版本的系统
make -j4  # 2~3小时编译完成

3. 刷机

此处以8.0.0_r2刷机为例
下载google factory images镜像 -- https://developers.google.cn/android/images#sailfish
Version						Download	SHA-256 Checksum
8.0.0 (OPR6.170623.011...)	Link		0d71259400371b8da44e6300324dbd6cbe26d6ae2641745becab9d7d1607e9db

下载镜像后解压,生成 <sailfish-opr6.170623.011> 文件夹

编译完成后,将 <sailfish-opr6.170623.011> 文件夹中的 <image-sailfish-opr6.170623.011.zip> 文件解压

解压后将原始 <image-sailfish-opr6.170623.011.zip> 文件删除

将解压出来的 <image-sailfish-opr6.170623.011> 文件夹下的文件删除,只保留android-info.txt

将 </home/adair/Desktop/aosp/aosp800r2/out/target/product/sailfish> 中生成的所有img文件复制到 <image-sailfish-opr6.170623.011> 文件夹下

在 <image-sailfish-opr6.170623.011> 文件夹里全选文件,并压缩为.zip文件到当前目录(不要嵌套,即该压缩文件解压就是所有的img文件,而不是解压出来一个 <image-sailfish-opr6.170623.011> 文件夹中带有这些img文件)

将该zip文件再命名为<image-sailfish-opr6.170623.011.zip>复制到父目录即sailfish-opr6.170623.011文件夹下即可


## ubuntu中fastboot权限问题 ##
# adb能够连上设备后
adb reboot bootloader  # 使设备进入bootloader模式
fastboot --version  # 确保版本号为fastboot version -android,如装有platform-tool则是其他版本的fastboot,此版本可能提示找不到设备/中途报错,waiting for device
sudo ~/Desktop/aosp/aosp800r2/out/host/linux-x86/bin/fastboot --version
	> fastboot version -android

# 手机进入bootloader后
sudo ~/Desktop/aosp/aosp800r2/out/host/linux-x86/bin/fastboot devices  # 查看设备

# 修改flash-all.sh文件如下,将所有的fastboot指定权限及路径即可
sudo ~/Desktop/aosp/aosp800r2/out/host/linux-x86/bin/fastboot flash bootloader bootloader-sailfish-8996-012001-1706221457.img 
sudo ~/Desktop/aosp/aosp800r2/out/host/linux-x86/bin/fastboot reboot-bootloader
sleep 5
sudo ~/Desktop/aosp/aosp800r2/out/host/linux-x86/bin/fastboot flash radio radio-sailfish-8996-013053-1708040002.img
sudo ~/Desktop/aosp/aosp800r2/out/host/linux-x86/bin/fastboot reboot-bootloader
sleep 5
sudo ~/Desktop/aosp/aosp800r2/out/host/linux-x86/bin/fastboot -w update image-sailfish-opr6.170623.011.zip

# 开始刷机
./flash-all.sh

# 修改源码新增文件时,修改/home/adair/Desktop/aosp/aosp800r2/libcore/openjdk_java_files.mk文件,添加新增的文件类名
# 编译时
	source build/envsetup.sh
	lunch 23  # lunch aosp_sailfish-user: 不带root版本的系统
	make update-api
	make -j4
	
# 将aosp源码导入android-studio
# http://wuxiaolong.me/2018/08/15/AOSP3/
#!/bin/sh
repo sync -j4
while [ $? -ne 0 ]
do
repo sync -j4
done
#!/bin/bash
. build/envsetup.sh
mmm frameworks/base/packages/SystemUI/
adb start-server
adb shell pkill -TERM -f com.android.systemui
adb remount
adb push $OUT/system/priv-app/SystemUI.apk /system/priv-app/SystemUI.apk
adb shell pkill -TERM -f com.android.systemui
adb shell chmod 0644 /system/app-priv/SystemUI.apk
sleep 2
adb shell am startservice -n com.android.systemui/.SystemUIService
Perfect script to custom SystemUI or other android source app, but i have to make some modification to make it work:
-pkill not install use this line instead:
adb shell ps | grep com.android.systemui | awk '{print $2}' | xargs adb shell kill
-chmod incorrect cause loop crash of SystemUI (it has to be executable)
adb shell chmod 0755 -R /system/priv-app/SystemUI
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment