aosp编译刷机过程小结

前言

今天把aosp的代码编译并且刷机,然后导入到AS中,历经波折,总算搞定,遇到一系列问题,在此小结一下。

本机配置如下:

1、mac版本

OSX Yosimite 10.10.5 (14F27)

2、java版本  

1.7.0_79

3、xcode

Version 7.0 (7A220)

4、手机 

nexus 5x

下载代码

1、建立大小写敏感的磁盘镜像
mac默认磁盘是大小写不敏感的,所以得创建个大小写敏感的磁盘
我一开始使用的方法是 “应用程序 / 实用工具 / 磁盘工具,点新建映像”,但是老是提示“权限不足”,其实我已经是管理员了,不知道怎么回事。
后来我使用命令行来创建,我给了120g的磁盘空间,最后大约用调了90个G,真TM大
hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 120g ~/android.dmg  
创建好了磁盘,用spot查一下android.dmg,看看在哪里?哦,在fish目录下,~代表的就是/Users/fish这个位置。
然后把磁盘挂载起来,ok,磁盘有了
2、下载代码
我的手机是nexus 5x,查了下 android-6.0.1_r45版本可以刷。
要看手机可以刷哪个版本可以看这儿 https://source.android.com/source/build-numbers.html#source-code-tags-and-builds
我是5x,所以选择r45这个branch。
好了,可以开始下载了。
//1、切换到刚才创建的磁盘
$ cd /Volumes/untitled


//2、安装repo,这里要保证bin目录的存在,如果不存在那就mkdir一下
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo


//3、输入google账号密码
$ git config --global user.name "F chefish"
$ git config --global user.email "我的密码"


//4、创建文件夹
$ mkdir WORKING_DIRECTORY
$ cd WORKING_DIRECTORY


//下载,这里与官方不太一样,因为我没有配置环境变量
$ /Users/fish/bin/repo init -u https://android.googlesource.com/platform/manifest -b android-6.0.1_r45
$ /Users/fish/bin/repo sync


下代码很简单,有个好的 网络就好了,我大约下载了7个小时

编译

$ source build/envsetup.sh
$ lunch
//lunch之后,要选择,lunch的对象,我是5x,所以选择,userdebug-bullhead这个版本
$ make -j4
我第一次跟着官方文档,傻乎乎的选择了aosp_arm-eng版本,这其实是给模拟器用的。
编译大约2个小时

刷机

连上手机
//进入fastboot模式
$  adb reboot bootloader 
//解锁(如已经解锁就没必要了)
$ fastboot oem unlock oem
//刷机(会有个界面一直显示android字,不要慌,过一会就好了)
$ fastboot flashall -w

刷机大约5分钟

导入AS

$ mmm development/tools/idegen/
$ sh ./development/tools/idegen/idegen.sh
第一行是,生成IDE工具文件,运行完将生成idegen.jar文件
第二行是,生成Android Studio配置文件,主要是生成android.iws, android.ipr, android.iml,这三个文件是Android 
Studio项目的关键文件,主要就是列出项目由模块组成,依赖关系,目录结构。

然后打开Android Studio,File->Open->工程根目录android.ipr,Android会自动导入工程所有代码,进行index,大约要40分钟

开启调试

1,要创建一个java module,如下图所示
aosp编译刷机过程小结_第1张图片

2,配置sdk,打开File-Project Structure,SDKs,可以看到里面有1.8,Android API 23 Platform,Android 6.0 Google API。选择Android API 23 Platform,这个时候Classpath下应该有android.jar,要把他删掉(他会影响我们的代码调试)。res可以不用删。如下图所示。
aosp编译刷机过程小结_第2张图片
3、此时看下 attach to process那个按钮是否存在,如果不存在,就关闭AS,再打开一遍,会提示“framework code detected”,点进去配置下,好像是加了个manifest。
然后attach to process那个按钮就会出来了。
4、/Volumes/untitled/WORKING_DIRECTORY/external/robolectric/v1/lib/main找到类似android-all-4.1.2_r1-robolectric-0.jar的文件(6个),打包压缩,然后删除6个jar。
5、大功告成了!GXGX,BGBG

编译前驱动程序需要吗

一般来说编译前要加入和手机相关的驱动程序,但是5x不需要,可以查下面的网页,可以看到没有5x,
https://developers.google.com/android/nexus/drivers

编译时执行lunch命令的时候,弹出Can not find SDK 10.6错误

具体的错误如下所示:

myhost:android-4.4.4_r2.0.1 carl$ lunch aosp_x86-engbuild/core/combo/HOST_darwin-x86.mk:65:*****************************************************build/core/combo/HOST_darwin-x86.mk:66: * Can not find SDK 10.6 at/Developer/SDKs/MacOSX10.6.sdk build/core/combo/HOST_darwin-x86.mk:67:*****************************************************build/core/combo/HOST_darwin-x86.mk:68:*** Stop..  Stop.

具体错误的原因是,在编译脚本中会检查当前的Xcode sdk的版本是否是兼容的,这可能是因为你mac上的xcode版本比较新,在Android源代码中还没有添加上.理论上说应该用Android代码对应的XcodeSDK版本来编译,不然可能会有兼容性的问题。

具体的方法如下所示:
你可以到Xcode的sdk路径下(/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs)查看当前系统的SDK版本是多少。比如我的SDK版本是MacOSX10.11.sdk,接下来编辑build/core/combo/mac_version.mk中的mac_sdk_versions_supported所在的行添加10.11就行了。在运行下lunch命令,是不是就好了。


编译问题 无法访问RemoteControlClient

具体错误如下

out/target/common/obj/JAVA_LIBRARIES/android-support-v4-api23_intermediates/classes.jar

target Static Jar: android-support-v4-api23(out/target/common/obj/JAVA_LIBRARIES/android-support-v4-api23_intermediates/javalib.jar)

target Java: android-support-v4(out/target/common/obj/JAVA_LIBRARIES/android-support-v4_intermediates/classes)

frameworks/support/v4/java/android/support/v4/media/TransportMediator.java:190:错误: 无法访问RemoteControlClient

        return mController != null ?mController.getRemoteControlClient() : null;

                                               ^

  找不到android.media.RemoteControlClient的类文件

frameworks/support/v4/java/android/support/v4/media/TransportMediator.java:240:错误: 无法访问OnPlaybackPositionUpdateListener

           mController.refreshState(mCallbacks.onIsPlaying(),

                       ^

  找不到android.media.RemoteControlClient$OnPlaybackPositionUpdateListener的类文件

暂时不知道什么原因

解决方法:删除代码,重新下载,(woca)。


参考文献

https://source.android.com/source/building.html
http://www.liball.me/mac-10-10-build-android-4-4-4-for-nexus/

http://blog.csdn.net/zhongwcool/article/details/46922175

http://stackoverflow.com/questions/29315961/aosp-compiled-image-for-nexus-9-doesnt-boot

http://www.cnblogs.com/kissazi2/p/5244438.html










你可能感兴趣的:(源码)