Android笔记之:CM9源码下载与编译的应用
发布时间:2022-09-23 05:40:14
公司最近也开始基于android4.0 ICS修改框架了,公司的手机暂时不适合拿回家测试,也没有kernel的权限。
从个人的角度看,我手上现在有两部手机,一部是Htc G9 Aria,一部是Samsung I9100 Galaxys2,Cyanogenmod的开源代码都提供了对这些手机的驱动支持,并且能方便的编译打包,并安装到手机。
上一篇文章是android2.3的编译,已经过时,而且现在ubuntu已经升级到12.04,等等之类的,使我觉得非常有必要重新写一篇新的博客来展示最新的android怎么在最新的ubuntu上编译。
基于以上几点,下面我将基于galaxys2来演示如何编译cm9的源码并打包zip安装到手机。
1.ubuntu12.04的选择
我第一次用x64的系统,发现配置环境的时候,会有很多种错误,后来我用32位的系统,安装这些必备的软件则一点都没有出错,所以在这里,如果用12.04系统编译cyanogenmod ics源码的话,我以个人经验推荐使用32位系统。
2.内存和cpu
因为有些朋友在虚拟机上安装ubuntu,所以内存分配可能会容易偏小,建议尽量偏大,我1G内存的时候,编译中出现过错误,重启设置2G的内存就没问题。
cpu太弱的话,编译的过程中进程也容易被kill掉,我出现过一次,重启后ok。所以cpu的水平要注意一下。
3.java的选择
无论是android官方文档还是上面的那篇文章,java的安装都会找不到,他们的软件源有问题。需要手动安装。
但是android ics的编译,官方文章中指出支持openjdk-6-jdk,所以可以直接安装openjdk6即可。
注意:这里我要说明一下,CM9的编译脚本相对于官方源码的编译脚本忽略了或者说处理了一些可能出现的错误的地方,比如说这里java版本的检测,如果是open jdk的话,官方就编译不过,其实是一样的,只需要修改一下脚本(build/core/main.mk),找到检测java版本的地方:
# Check for the correct version of java
java_version := $(shell java -version 2>&1 | head -n 1 | grep '^java .*[ "]1\.6[\. "$$]')
ifneq ($(shell java -version 2>&1 | grep -i openjdk),)
java_version :=
endif
ifeq ($(strip $(java_version)),)
$(info ************************************************************)
$(info You are attempting to build with the incorrect version)
$(info of java.)
$(info $(space))
$(info Your version is: $(shell java -version 2>&1 | head -n 1).)
$(info The correct version is: Java SE 1.6.)
$(info $(space))
$(info Please follow the machine setup instructions at)
$(info $(space)$(space)$(space)$(space)http://source.android.com/source/download.html)
$(info ************************************************************)
#$(error stop) //如果确定已经安装正确的jdk的话,这句去掉,让编译继续
endif
CM9的编译脚本直接就去掉了这句话,但是还是要注意一下安装正确的jdk版本。
4.解决下载过程中googlesource访问不了的问题
你需要一个vpn帐号来翻墙。
这个我使用我之前购买的一个VPN,也有免费的VPN,具体的免费VPN 和VPN的配置,大家参考下面两个链接:
http://173.252.215.172/server/query
http://173.252.215.172/setting/ubuntu.shtml
配置好了VPN,我们的Ubuntu就可以顺利的下载所有的CM9源码。
5.环境配置
参考官方的Ubuntu 12.04(请注意官方文档,区分Ubutu11.10 x6和之前的系统)的要求,我们需要配置好如下环境:
sudo apt-get install git-core gnupg flex bison gperf build-essential
sudo apt-get install zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev
sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev:i386
sudo apt-get install g++-multilib mingw32 openjdk-6-jdk tofrodos python-markdown
sudo apt-get install libxml2-utils xsltproc zlib1g-dev:i386
应该不会出什么问题。
6.安装repo
cd
mkdir bin
curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
chmod a+x ~/bin/repo
alias repo="~/bin/repo"
本来如此即可,但是我们需要随时都能运行repo的话,最好把repo配置到环境中去:
vim ~/.bashrc
#打开后,在文件最后面加上alias repo="~/bin/repo",然后保存退出
source ~/.bashrc
下次该用户环境下无论什么时候什么地方都可以repo了。
7.下载CM9源码
列表文件是托管在Github上的:https://github.com/CyanogenMod/android
mkdir cm9
cd cm9
repo init -u git://github.com/CyanogenMod/android.git -b ics
repo sync
ics分支就是CM9 ICS的分支了。
慢慢的等待吧(如果下载过程中,不停的提示打不开googlesource的话,记得参考前面配置vpn翻墙,本人改host无效)。
8.配置USB
这一步是为了后面要从你的手机拷贝系统属性文件,用户编译源码的。
ubuntu下不需要装驱动才能连接的上你的手机,但是需要配置,可参考官方:http://source.android.com/source/initializing.html
我这里也简单的写下:
sudo vim /etc/udev/rules.d/51-android.rules
然后,添加如下内容:
#Samsung
SUBSYSTEM=="usb", SYSFS{idVendor}==04e8, MODE=0666
这是三星手机的配置,其他手机通过lsusb命令查看相应的id,以上述格式添加到/etc/udev/rules.d/51-android.rules文件里即可。
配置好了后,拔掉手机再插上,基本上就可以了。如果还不可以,先kill-server,再用root用户连接。如果还不行,进入android-sdk/tools/,给你的adb这个命令文件"chmod +s adb",kill-server,再adb,多试几次。
9.下载设备专用工程
CM9现在和CM7在下载设备工程不一样,CM7是下载源码的时候就自动下载好了,CM9则没有,但是可以手动智能识别下载。
比如我的手机是galaxys2,则使用如下命令:
brunch galaxys2
如果拼写正确的话,它会自动下载galaxys2的相关工程(在目录~/cm9/device/下多了以下目录samsung/galaxys2)。
如果下载完成,进入编译的话,请停止编译,我们还需要进行下一步。
10.获取手机系统属性文件
cd ~/cm9/device/samsung/galaxys2
./extract-files.sh
cd ~/cm9
vendor/cm/get-prebuilts
这一步只需要执行一次就可以了。
11.编译CM9源码
CM9的源码比编译Android官方源码相对出错情况会少很多。
首先,初始化变量:
cd cm9
source build/envsetup.sh
直接使用命令:
brunch galaxys2
然后慢慢的等待吧!
如果是虚拟机的话,内存吃紧和cpu不足的话,随时都可能出错。
如果出现错误的,注意分析一下错误的原因,我这里还比较顺利,中断了一次,重新编译一下又可以了。
ps:如果是官方源码编译的话,我相信总有那么几个错误,CM9要好很多。
编译完成后,会生成一个zip文件,放到手机里就可以刷机了。
12.编译工程
到上面为止,我们已经搭建了一个健康的CM9的环境,但是我们的目地不是编译CM9 ROM,这个CM每天会出nightly版本,所以我们主要是使用这个CM9环境来编译framework,app等工程。
比如第二天我们重新启动,如何编译framework-res.apk,framework.jar,Music.apk?我们需要用到这个环境:
cd cm9
source build/envsetup.sh
//注意product名称,chooseproduct的时候,在之前galaxys2要加上cm_,不然找不到产品
chooseproduct cm_galaxys2
//下面进入到framework/base/core/res.编译framework-res.apk
cd framework/base/core/res
mm
//也可以编译framework.jar
cd ~/cm9/framework/base/core/java
mm
//还可以编译Music.apk
cd ~/cm9/packages/apps/Music
mm
如此就可以修改系统ROM,修改系统APP了。
13.小结
搭建Android环境和编译Android源码是一个复杂,耗时,熬夜的过程,十分不容易。
但是,释然回首,其实也很简单。
猜你喜欢
- 一、现象在服务器上通过curl命令调用一个Java服务的查询接口,半天没有任何响应。关于该服务的基本功能如下:1、该服务是一个后台刷新指示器
- pom.xml文件中添加如下配置项创建maven项目后,在pom.xml文件中添加如下配置项:<properties> &nbs
- Java自定义异常类的实例详解为什么要自己编写异常类?假如jdk里面没有提供的异常,我们就要自己写。我们常用的类ArithmeticExce
- 栈的变化规则:1、方法调用会导致栈的生长,具体包括两个步骤:一、插入方法返回地址(下图中的Fn:);二、将实际参数按值(可以使用ref或ou
- 最近项目中使用了mybatis-plus 3.1.1版本,发现使用lambda表达式方式的条件构造器,执行时会报错;但是我用单元测试却通过,
- 若使用 Spring IoC 容器(ApplicationContext或BeanFactory)作为你的业务对象(你也应该这么做!),你会
- 案例说明:使用Java实现简单的斗地主洗牌发牌的操作;具体规则:共有54张牌,顺序打乱;三个玩家参与游戏,三人交替摸牌,每人17张牌,最后留
- startActivityForResult与startActivity的不同之处在于:1、startActivity( )仅仅是跳转到目标
- 1. 概述官方JavaDocsApi: java.awt.Component,java.awt.Containernull,绝对布局。绝对布
- Android图片上传的应用场景,供大家参考,具体内容如下在Android开发中,很多时候我们需要进行图片,文件的上传下载,最直接的一个应用
- 本文实例为大家分享了OpenCV实现直线检测并消除的具体代码,供大家参考,具体内容如下很简单,代码如下#include<iostrea
- 现如今,验证码在Android的客户端还是非常普遍的.通过手机账号和验证码直接去注册应用账户的信息.很多应用都以这种方式来完成注
- ELK环境安装ELK是指Elasticsearch、Kibana、Logstash这三种服务搭建的日志收集系统,具体搭建方式可以参考《Spr
- 微信支付现在已经变得越来越流行了,随之也出现了很多以可以快速接入微信支付为噱头的产品,不过方便之余也使得我们做东西慢慢依赖第三方,丧失了独立
- /// <summary>/// 生成二维码/// </summary>/// <param name=&qu
- 前言最近遇到很有意思转换二进制的问题,有部分童鞋俨然已了解,可能也有一部分童鞋没碰到过也就不知情,这里我们来深入学习下转换二进制所带来的问题
- Dataway介绍Dataway 是基于 DataQL 服务聚合能力,为应用提供的一个接口配置工具。使得使用者无需开发任何代码就配置一个满足
- java list,set,map,数组间的相互转换详解1.list转setSet set = new HashSet( new Array
- 本篇给大家介绍Spring Boot 与 kotlin 使用Thymeleaf模板引擎渲染web视图。静态资源访问在我们开发Web应用的时候
- 本文实例为大家分享了java实现双色球抽奖的具体代码,供大家参考,具体内容如下实现双色球先考虑整体思路:1.随机生成7位数的数组为大奖号码(