TracePid为0 规避某些反调试
ro.debuggable为1 可以不用重打包即可调试
(1). 环境介绍:
手机:nexus 5
ubuntu版本:15.10
android版本:4.4.4
android源码官网(这里有很多相关的资料,基本上按照官网的来就可以编译想编译的任何版本了)
http://source.android.com/source/
(2). 环境配置
配置环境得好好看看这篇,不同的android版本选择不同的环境
http://source.android.com/source/requirements.html
JDK环境配置
(支持多版本,这个姿势正确点, 以后如果要编译其他版本的可以随时切换JDK版本)
ps:题外话,python也有类似的版本管理方案
http://www.cnblogs.com/butterfly-clover/p/5764587.html
①. 添加软件源
sudo add-apt-repository ppa:webupd8team/java
②.更新软件源
sudo apt-get update
③.安装 jdk 6
sudo apt-get install oracle-java6-installer
④.查看所有 jdk 安装版本
sudo update-java-alternatives -l
java-6-oracle 3 /usr/lib/jvm/java-6-oracle
java-7-oracle 4 /usr/lib/jvm/java-7-oracle
java-8-oracle 2 /usr/lib/jvm/java-8-oracle
⑤.通过-s参数可以方便的切换到其它的java版本
$ sudo update-java-alternatives -s java-6-oracle
需要注意的是:
不同版本的android源码需要不同的jdk来编译,不然可能会在源码编译的时候报错jdk版本不对
Cupcake到Froyo (android1.5~android2.2.x) 使用JDK5
Gingerbread到kitkat (android2.3.x~android4.4.x)使用JDK6
Lollipop到Marshmallow (android5.x~android6.0) Open-JDK7
其他版本使用OpenJDK8
对应手机型号的支持版本在这里查询
http://source.android.com/source/build-numbers.html
我的版本属于kitkat,所以用jdk6编译
python环境
python环境Ubuntu 15.10已经安装了所以略过,如果没有需要安装python2.6~2.7
安装编译库环境
编译依赖的环境按照这里进行配置
http://source.android.com/source/initializing.html
官网上看起来Ubuntu15.10是不用再另外配置环境了,这点我没有进行尝试,我当时没有看到这个页面,所以我还是按照Ubuntu14.04的方式配置了环境
sudo apt-get install git-core gnupg flex bison gperf build-essential
zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386
lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache
libgl1-mesa-dev libxml2-utils xsltproc unzip
okay环境都配置好了,下面开始下载源码
(1). 官网教程
谷歌官网的教程在这里,我这边下载的比较慢(谷歌源)
http://source.android.com/source/downloading.html
(2). 配置清华大学的下载源
我们使用清华大学的源,速度飞快,在公司的网络,一个晚上就下载好了
1. 配置git
设置 github邮箱姓名使用 git 工具,配置github可以百度github配置本篇幅不在多余介绍
git config --global user.email "<你的 github 的 email 地址>"
git config --global user.name "<你的 github 的 name 名称>"
2.下载repo
我们后面会使用repo来进行源码下载,repo是什么?(请自行百度)
我这边是这样管理的,新建了一个android目录,然后在android目录下新建了一个aosp目录
我们的源码以后就下载到aosp目录了
cd到android目录执行下面第2条代码
①. git clone git://aosp.tuna.tsinghua.edu.cn/android/git-repo.git/
②. git clone https://aosp.tuna.tsinghua.edu.cn/android/git-repo.git
我这边试了下,好像只能用https的方式下载了, 所以我们选择方案2
3. 配置repo可执行
下载完毕后会得到一个 git-repo 项目,找到里面的 repo 文件,
在我们的android目录下新建一个bin目录,同时复制repo到bin目录
最后在加上可执行的权限
chmod a+x repo
4. 修改repo,设置repo下载源为清华源
修改下载 URL
双击打开 repo,修改 REPO_URL 为
①. REPO_URL = 'git://aosp.tuna.tsinghua.edu.cn/android/git-repo'
②. REPO_URL = 'https://aosp.tuna.tsinghua.edu.cn/android/git-repo'
同理修改成方案2,https的url, 方案一现在不能用了
然后使用
export PATH=......./android/bin:$PATH (给出全路径)
导出 bin 执行目录
5.下载源码
新建一个目标文件夹用于存放源码文件,命令行中用 cd 指令进入。执行下面指令
repo init -u https://aosp.tuna.tsinghua.edu.cn/android/platform/manifest -b android-4.4.4_r1
上面的版本号在这里查询
http://source.android.com/source/build-numbers.html#source-code-tags-and-builds
最后执行下面的指令就可以开始下载源码了
repo sync
漫长的等待, 我晚上下班回家之前开始下载的,早上来就下载好了
记得设置不要睡眠(电源选项&亮度和锁屏)
(3)下载驱动文件
接下来在官网下载手机对应的驱动(如下):
https://developers.google.com/android/nexus/drivers#hammerhead
找到 Nexus 5 (GSM/LTE) binaries for Android 4.4.4 (KTU84P)
下面三个文件都要下载,解压后是三个.sh文件,放到安卓源码根目录下,
分别对三个文件chmod a+x 文件名 赋权限,然后分别执行三个文件,此时会生成 vendor文件夹。
android官网的编译介绍
http://source.android.com/source/building.html
aosp_arm-eng为模拟器
nexus5为aosp_hammerhead-userdebug
编译完后操作系统路径为 out/target/product/hammerhead下
编译时依次执行下面这些命令即可
source build/envsetup.sh # 设置编译环境
lunch aosp_hammerhead-userdebug # 设置编译选项
export USE_CCACHE=1 # 使用缓存,可以加快以后的编译速度
prebuilts/misc/linux-x86/ccache/ccache -M 100G #使用 100GB 来作为缓存的空间
#设置缓存地址,可以不要这个命令而使用默认缓存路径
export CCACHE_DIR=/<path_of_yourt_choice>/.ccache
make -j4
编译完后:
输出目录: out/target/product/hammerhead
此时编译的操作系统自带默认的内核,要修改内核的话,得重新下载内核源码并修改编译。
在Android源码文件夹下创建kernel文件夹,并下载内核源码:
相关说明在这里:
http://source.android.com/source/building-kernels.html
(1). git clone https://android.googlesource.com/kernel/msm.git
(由于实验手机设备为Nexus 5,因此我们选择内核代码为msm.git)
(2). checkout所选内核版本
cd ~/source/kernel/msn
git branch –a
git checkout remotes/origin/android-msm-hammerhead-3.4-kitkat-mr1
(3). 修改内核调试标志,绕过反调试(Kernel proc)
要修改的文件:
kernel/msm/fs/proc/base.c
kernel/msm/fs/proc/array.c
要修改对以下文件的写入
Status,stat
修改点:
1. base.c 第285行改成如下:
else {
if (strstr(symname, "trace")) {
return sprintf(buffer, "%s", "sys_epoll_wait");
}
return sprintf(buffer, "%s", symname);
}
2. array.c第134行改成如下:
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"S (sleeping)", /* 4 */
"S (sleeping)", /* 8 */
"Z (zombie)", /* 16 */
"X (dead)", /* 32 */
"x (dead)", /* 64 */
"K (wakekill)", /* 128 */
"W (waking)", /* 256 */
};
array.c第187行改成如下:
"Gid:t%dt%dt%dt%dn",
get_task_state(p),
task_tgid_nr_ns(p, ns),
pid_nr_ns(pid, ns),
ppid, /*tpid*/0,
cred->uid, cred->euid, cred->suid, cred->fsuid,
cred->gid, cred->egid, cred->sgid, cred->fsgid);
修改完成后,按下面步骤编译内核,刷入系统
4、修改Makefile文件支持交叉编译器,编译内核。可用内核初始化脚本如下:
到kernel源码目录新建build.sh
export PATH='/media/bingghost/data/android/aosp/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin':$PATH
export ARCH=arm
export SUBARCH=arm
export CROSS_COMPILE=arm-eabi-
make hammerhead_defconfig
make -j4
--------执行build.sh-------------
chmod 777 build.sh
./build.sh
编译成功后可以看到下面的输出:
编译完内核后,内核生成的路径为:kernel/msm/arch/arm/boot目录下的zImage-dtb文件(nexus 5是这个文件,nexus 4是zImage文件,请注意别弄错了),把该文件复制到源码下的device/lge/hammerhead-kernel夹下(注意:nexus 4则为mako-kernel文件夹),覆盖掉同名文件,然后重新按上面步骤编译一次安卓源码(这时候编译很快完成)即可
刷机过程可以参考这篇文章
http://blog.csdn.net/bingghost/article/details/53308694
(1). 检测 USB 端口
1. 配置好adb和fastboot的环境变量,在android sdk里面均有
2. 检测adb和fastboot能否正常识别手机
adb devices
fastboot devices
有型号的输出则能识别,不能则需要按照下面进配置
(2). 配置USB端口
如果上面的检测usb不通过,则按照下面的方法来配置
stackoverflow上的介绍
http://stackoverflow.com/questions/7641939/android-fastboot-waiting-for-devices
①. 将下面的内容保存为51-android.rules,OWNER="xxx", xxx修改成你的用户名
# adb protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER="<username>"
# fastboot protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER="<username>"
# adb protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER="<username>"
# fastboot protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER="<username>"
# adb protocol on stingray/wingray (Xoom)
SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", ATTR{idProduct}=="70a9", MODE="0600", OWNER="<username>"
# fastboot protocol on stingray/wingray (Xoom)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="708c", MODE="0600", OWNER="<username>"
# adb protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProduct}=="6860", MODE="0600", OWNER="<username>"
# fastboot protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e30", MODE="0600", OWNER="<username>"
# adb protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d101", MODE="0600", OWNER="<username>"
# adb protocol on panda (PandaBoard ES)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="d002", MODE="0600", OWNER="<username>"
# fastboot protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d022", MODE="0600", OWNER="<username>"
# usbboot protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d00f", MODE="0600", OWNER="<username>"
# usbboot protocol on panda (PandaBoard ES)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d010", MODE="0600", OWNER="<username>"
# adb protocol on grouper/tilapia (Nexus 7)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e42", MODE="0600", OWNER="<username>"
# fastboot protocol on grouper/tilapia (Nexus 7)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e40", MODE="0600", OWNER="<username>"
# adb protocol on manta (Nexus 10)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee2", MODE="0600", OWNER="<username>"
# fastboot protocol on manta (Nexus 10)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee0", MODE="0600", OWNER="<username>"
# adb protocol on hammerhead (Nexus 5)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee1", MODE="0600", OWNER="<username>"
②. 修改51-android.rules,添加如下2行,注意OWNER修改成自己的用户名
# fastboot protocol on manta (Nexus 5)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee0", MODE="0666", OWNER="<bingghost>"
# fastboot protocol on manta (Nexus 5)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", OWNER="<bingghost>"
③. 放到 Ubuntu 的/etc/udev/rules.d/51-android.rules
修改完后用命令
sudo service udev restart
重启服务进程,重新拨插数据线再
fastboot devices
查看是否识别出来
(3). 刷机
1. 进入bootload模式
手机关机之后, 按住下音量键和电源键(同时按住不放)
2. 解锁bootload
fastboot oem unlock
3. 刷机
插上手机连接上电脑,确认正常连接上电脑后,进行刷机
转到源码img生成路径
cd source/out/target/product/hammerhead/
adb reboot bootloader
fastboot -w flashall
大概两分钟后,系统刷成功