Orange Pi PC Android 源码编译
公司需要用Orange Pi PC 作为贩卖机台的主板,发现这板子的破系统,只能横屏,adb 调试默认关闭。只好下载源码编译系统,其中遇坑,幸好官方文档写得挺详细的。
构建编译环境
- Linux主机 硬盘空间至少 50G(可满足一次完全编译)
- Linux主机中需要:
- Python 的 2.7.3 版本;
- GNU Make 的 3.81-3.82 版本;
- git 的 1.7 或更高版本;
- Java 1.6 版本
安装JDK
- 从oracle jdk-6u31下载Java JDK 。
- 点击接受许可协议
- 点击jdk-6u31-linux-x64.bin
- 用您的Oracle帐户登录到Oracle.com
- 将JDK下载到您的〜/ Downloads目录
- 下载后,打开一个终端,然后输入以下命令。
cd ~/Downloads
chmod +x jdk-6u31-linux-x64.bin
./jdk-6u31-linux-x64.bin
根据生成jdk 目录配置环境变量, 执行命令: vi ~/.bashrc
export JAVA_HOME=/home/jfn/androidDevelop/jdk1.6.0_31 #jdk的主目录
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$ANDROID_SDK/platform-tools:$PATH
使jdk环境变量生效, 执行 source ~/.bashrc
查看jdk版本, 执行 java -version、javac –version
安装make-3.81
1.下载并解压make-3.81.tar.bz2,进入make-3.81目录并执行 ./configure
2.执行完后make-3.81目录会多出一个build.sh文件,执行./build.sh
即可得到make文件
3.验证编译出来的make是不是我们想要的3.81版本。make -v
4.替换系统原有的make。(记得备份原有文件。)
cd /usr/bin/
sudo mv ./make ./make.backup
mv ~/make-3.81/make ./
安装所需的软件包(Ubuntu 16.04)
您将需要一个64位版本的Ubuntu。推荐Ubuntu 16.04。
sudo apt-get install git gnupg flex texinfo bison gperf build-essential zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev libx11-dev:i386 libreadline6-dev:i386 g++-multilib tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386
遇到arm-linux-gnueabihf-gcc: error while loading shared libraries: libstdc++.so.6:cannot open shared object
file: No such file or directory 这种坑爹事,sudo apt-get install lib32stdc++6
就OK了
/home/Jfn/work/H3-homlet-1.0/lichee/out/sun8iw7p1/linux/common/buildroot/build/host-m4-1.4.15/lib
stdio.h 第456行
#if defined gets
#undef gets
_GL_WARN_ON_USE (gets, "getsis a security hole - use fgetsinstead");
#endif
出现错误:awk: line 2: function strtonum never defined
awk: line 2: function strtonum never defined
ERROR: build kernelFailed
解决办法:
sudo dpkg-reconfigure dash
sudo apt-get install gawk
sudo apt-get install u-boot-tools
使用网络 adb 调试
在 android/device/softwinner/dolphin-common/init.sun8i.rc 添加下面的语句:
on boot
setprop service.adb.tcp.port 5555
stop adbd
start adbd
源码解压后会有android 和 lichee 两个目录.lichee 下的./build.sh 文件权限root,所以切换root 用户执行脚本吧
编译lichee 代码(内核)
cd lichee
sh build.sh config
接着选择构建方案号
All available chips:
0. sun8iw6p1
1. sun8iw7p1
2. sun8iw8p1
3. sun9iw1p1
Choice: 1
All available platforms:
0. android
1. dragonboard
2. linux
Choice: 0
All available business:
0. dolphin
1. secure
2. karaok
Choice: 0
编译成功
sun8iw7p1 compile Kernel successful
INFO: build kernel OK.
INFO: build rootfs ...
INFO: skip make rootfs for android
INFO: build rootfs OK.
----------------------------------------
build sun8iw7p1 android dolphin lichee OK
----------------------------------------
Android 源码编译命令
cd android/
source ./build/envsetup.sh
lunch dolphin_fvd_p1-eng
extract-bsp #拷贝内核及驱动模块
make –j8 #后面的数值为同时编译的进程,依赖于主机的配置
pack #打包生成固件
在 Android Studio中导入 Android 源码
在 /development/ide
下分别有eclipse/emacs/intellij 这3个ide 的配置文件。因为源码文件十分多,强烈建议as增加jvm 内存大小。
生成导入AS所需配置文件(*.ipr)
编译源码(为了确保生成了.java文件,如R.java;如果编译过,则无需再次编译)
检查out/host/linux-x86/framework/目录下是否有idegen.jar
如果idegen.jar不存在, 执行:
mmm development/tools/idegen/
development/tools/idegen/idegen.sh
等待出现类似下面的结果:
Read excludes: 5ms
Traversed tree: 44078ms
这时会在源码的根目录下生成android.ipr和android.iml两个IntelliJ IDEA(AS是基于IntelliJ IDEA社区版开发的)的配置文件.
Tips:AS在导入代码时比较慢,建议先修改android.iml,将自己用不到的代码exclude出去.可以仿照过滤.repo文件夹的语法,如:
<excludeFolder url="file://$MODULE_DIR$/.repo" />
<excludeFolder url="file://$MODULE_DIR$/abi" />
<excludeFolder url="file://$MODULE_DIR$/art" />
...
还可以通过as 的module settings - dependents 删除掉所有不需要的module-library项
这样在导入时就会跳过abi和art文件夹.过滤的越多,AS的处理速度就会越快.最后在AS中打开源码根目录下新生成的android.ipr
解决源码中跳转错误问题
要为当前工程设置正确的SDK和JDK,需要Android API 19 Platform,jdk 则无所谓,因为libcore 目录下包括了jdk 的源码。添加一个jdk 接着把classpath 所有项remove 掉,接着Android API 19 Platform 选择空的jdk.如下图
点击Project
点击Modules, 选择相应的代码模块,比如frameworks、packages 等源码目录,且把它们移动到最前优先从这两个文件夹下查找,而不是在Android.jar中查找
NOTE: Empty Library 不要紧的。
DEBUG源码
在’Modules’中添加’Android Framework’来让AS将它作为一个Android工程,从而方便我们调试代码.
在代码中加断点,然后选择’Run’->’Attach debugger to Android process’或者直接点击ToolBar 上的Attach debugger图标。在弹出的选择进程(Choose Process)对话框中,勾选显示所有进程,选择要DEBUG的代码所在的进程,点击OK即可.