-
环境
Linux
版本:
Ubuntu 11.04
(
可由
10.10
的版本进行升级)
64
位系统
GCC
版本:
gcc version
4.5.2
Java
版本:
java
version
下载
androi
d
源码前注意:
< br>1
、保证
Ubuntu
系统中的
容量在
80G
左右,
以保证足够的空间
来存放
android
源码以及
编译后
的相关文件。
2
< br>、保证
Ubuntu
系统进行
I
nternet
访问。
联网方法:采用拨号进行连接。相关操作步骤如下所示:
p>
1
、虚拟机
?
设置
?
硬件
?
网络
适配器
?
网络连接
?
< br>桥接
2
、启动
Ubuntu
系统,打开终端(在普通用户下)
,输入
相关命令如下:
$$ pppoeconf
//
打开
后输入上网账号跟密码,确认保存
$$ sudo pon
dsl-provider
//
上网连接命令
经过这两个步骤后就可以进行上网了。
Android
源码编译所依赖的<
/p>
tools
01.$$ sudo apt-get
update
02.$$ sudo apt-get -y install
git-core
03.$$ sudo apt-get
-y install gnupg
04.$$ sudo
apt-get -y install sun-java6-jdk flex
05.$$ sudo apt-get -y install bison
06.$$ sudo apt-get -y
install gperf
07.$$ sudo
apt-get -y install libsdl-dev
08.$$ sudo apt-get -y install
libesd0-dev
09.$$ sudo apt-
get -y install libwxgtk2.6-dev
10.$$ sudo apt-get -y install build-
essential
11.$$ sudo apt-get
-y install zip
12.$$ sudo
apt-get -y install curl
13.$$ sudo apt-get -y install
libncurses5-dev
14.$$ sudo
apt-get -y install zlib1g-dev
15.$$ sudo apt-get -y install valgrind
注意:
(如果是
32bit
的系统的话,则要更改几个
文件)
01./external/clearsilver/cgi/
02./external/clearsilver/java-jni/
03./external/clearsilver/util/
04./external/clearsilver/cs/
用
gedit
打开,修改
m64
p>
为
m32
即可
另外
将<
/p>
build/core/
中的
ifneq
(64,$$(findstring
64,$$(build_arch)))
修改为:
ifneq (i686,$$(findstring
i686,$$(build_arch)))
对于
32
位系统所出现的问题,解决方法:
Error1
:
make: ***
[out/host/linux-x8
6/obj/STATIC_LIBRARIES/libutils_intermediates/RefB
ase.o] error
1
在
terminal
中输入
$$ gedit frameworks/base/libs/utils/
将
LOCAL_CFLAGS +=
-DLIBUTILS_NATIVE=1
$$(TOOL_CFLAGS)
修改为:
LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1
$$(TOOL_CFLAGS)
–
fpermissive
Error2
:
make: *** [out/host/linux-x86/obj/EXECU
TABLES/obbtool_intermediates/Main.o]
error 1
此处编译错误是由于
ubuntu 11.10
采用了
GCC4.6.1
导致的
修改源码目录下
/build/core/combo/H
OST_
并将以下语句:
HOST_GLOBAL_CFLAGS
+=
-D_FORTIFY_SOURCE=0
修改为:
HOST_GLOBAL_CFLAGS
+=
-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0
Android
源码下载
1
、安装
repo
安装过程步骤如下所示:
Repo
下载安装
1
、
$$
mkdir ~/bin
//
在<
/p>
home
目录下创建
bin
文件夹
2
、
$$
PATH=~/bin:$$PA
TH
//
环境变量设置
3
、
$$
curl /dl/googlesource/git-repo/repo > ~/bin/repo
//repo
下载
4
、
$$
chmod a+x ~/bin/repo
//
权限设置,保证
repo
可执行
Repo
client
初始化
1
、
$$ mkdir Android
//
创建
A
ndroid
目录,用于存放下载的
android
源码
2
、
$$ cd Android
p>
//
进入到
Android
目录
3
、
$$ repo init -u
/platform/manifest
//
指定
URL
清单
,
指
定包含在
Android
源代码的各种存储库将被安置在工作目录中
当然也可以指
定
android
版本,使用如下命令:
$$ repo init -u
/platform/manifest -b
android-4.0.1_r1
Android
源码文件获取
$$ repo sync
注意:<
/p>
在
Android
源码下载过程中凡出现
问题,可以进入
Android
源码下载的相关官方网站
/source/
进行查看。
Android
源码编译
环境初始化
1
、
$$ source build/
OR
$$
. build/
2
、
$$ lunch full-
eng
//
选择编译目标
Code
编译
$$ make -j4
//
其中
j4
表示同时
启动
4
个线程任务进行编译,可以直接使用
make
,这样
就是最大程度使用线程数来进行编译
总
结
:
到
这
里
为
止
,
android
源
码
完
成
了
编
译
过
程
,
编
译
后
,
会
在
源
码
目
录
下<
/p>
的
/out/target/product/generic/
有三个镜像文件生成,分别是
、
以及
。
注意:
1
、
如果编译过程没有出问题,
但是在
/out/target/product/generic/
下
3
个镜像文件不全,
可以再次进行一次命令
make
,就可以解决问题了。
p>
2
、如果是编译过程中出现错误,一般导致的原因是因为缺少了相关
编译环境,可以
根据提示进行安装,安装后,重新进行编译。
Windows XP
下使用
Android
模拟器运行所编译好的文件。
原理:将
Android
模拟器下所加载的
替换成编译后的
即可。
1
、
将编译
好的
从
Ubuntu
< br>中拷贝出来
方法:
1
)
先拷贝到
U
盘或者移
动硬盘中,
再从
U
盘或移动硬盘拷贝到
Windows XP
硬盘下;
2
)先进行
Windows
XP
跟
Ubuntu
文
件夹共享,这样就可以将
拷
贝到共享文
件夹中;
3
)传
FTP
,从
FTP
上进行下载;
4
)在
Ub
untu
中上网将
作为附件进行邮件发
送,然后从
Windows
XP
下进行下载。
2
、
将拷贝
出来的
文件放置到
Android
p>
模拟器下的对于文件夹中,如果
Android
是
4.0
以上的版本的话,一般是在
system-imges
文件夹中。
C:Program
FilesAndroidandroid-sdksystem-
imagesandroid-15armeabi-v7a
3
、
启动模拟器就可以运行了。
注意:<
/p>
创建
Android
虚拟机的时候,
p>
Android
版本应该跟
Ubuntu<
/p>
下编译好的
Android
版本要
保持一致,
否则有可能替换
< br>后,
Android
系统无法正常启动,
或者无法进入
Android
启动界面。
Android
源码修改并进行编译
下面以
2
个
实例来进行说明,
实例
1
目的是实现<
/p>
Android
系统永不休眠,
实例
p>
2
是实现
Android
< br>系统启动后,不自动进入锁屏界面。
实例
1
:
实现
Android
系统永不休眠其实很简单,只需要对源码下的配置文件
XML
< br>下的参数进
行修改即可。步骤如下:
1
、
$$
cd frameworks/base/packages/SettingsProvider/res/v
alues
//
在下载的
Android
源码目
录下输入此命令,进入到
values
目录下
2
、
$$
gedit
//
使用文本编辑器
打开
文件
3
、
将
<
br>就是说
<
br> 替换掉
注意:
<
br>方法是在 <
br>
name=
改
为
name=
保存后退出
//
其中
60000
单位是
ms
,表示
60s,
60s
屏幕会进行休眠状态,改为
-1
后,不再进入休眠
4
、
$$ cd
../../../../../../
//
返回到源码目录下
5
、
$$
source ./build/
//
环境初始化
6
、
$$
mmm frameworks/base/packages/SettingsProvider/
//
对
Se
ttingsProvider
模块进行编
译
7
、
$$ make snod
//
重新打包
到这里,
模拟编译就完成了,
查看效果的话,
直接将
Android
模拟器下的
启动运行即可。
注意:
mmm
命令可以对模块进行编译,后面
必须接上模块所在目录,查看某目录是否为一
模块,
就看当前目
录下是否有
文件,
如果有的话,
就是模块。
除了可以使用
mmm
进行编译的话,还可以使用
mm
,但是
mm
是在当前目录下实行编译的,也就是模块目录下
使用此命令。
实例
2
:
实现
Android
启动后不进入锁屏状态。修改
文件下的变量,
将其赋值改为
false
即可。步骤如下:
p>
1
、
$$ cd frameworks
/base/policy/src/com/android/internal/policy/impl/
//
在下载的
Android
源码目录下输入此命令,进入到
impl
p>
目录下
2
、
$$ gedit
//
是用文本编辑器打开
java
文件
3
、将
private
boolean mExternallyEnabled = true;
代码中的<
/p>
true
改为
false
,保存退出
4
、
$$ cd
../../../../../../ ../../../
//
返回到源码目录下
5
、
$$ source
./build/
//
环境初始化
6
、
$$
mmm frameworks/base/policy/
//
对<
/p>
policy
模块进行编译
7
、
$$ make snod
//
重新打包
如果在进行模块代码编译了,
报出少了一个
odex
后缀名的文件的错误时,
总结了下,<
/p>
导致报错的原因可能是
Android
版
本的差异,不过没事,即使模块编译通不过,还是可以对
整个源码进行编译的(直接在源
码目录下执行
make
命令即可)
,只
是时间会相对较长,同
样会将修改的模块整合到
文件中。
Android
4.0
下防止用户对安装程序进行卸载
打开源码目录找到
packages/apps/PackageInstaller
/src/com/android/packageinstaller/
下的两个<
/p>
文件:
1
、
//
程序卸载过程
2
、
//
程序卸载界面
对应位置加上一段代码即可:
@Override
public void
onCreate(Bundle icicle) {
te(icicle);
// Get intent information.
//
We expect an intent with URI of the form
package://
//
className is optional; if specified, it is the
activity the user chose to uninstall
final Intent intent = getIntent();
Uri packageURI = a();
String packageName =
odedSchemeSpecificPart();
if(packageName
== null) {
Log.e(TAG
,
showDialog(DLG_APP_NOT_FOUND);
return;
}
if((
/*r builder=
new r(this);
//n(_dialog_info);
le(
sage(
iti
veButton(
确认
//().show();
();
//showDialog(DLG_APP_NOT_FOUND);
//return;
finish();*/
new
r(this)
.setTitle(
游戏控制
.se
tMessage(
对不起,此程序不允许卸载!
.setPositiveButton(
< br>确定
new
kListener(){
public void
onClick(DialogInterface dialoginterface, int i){
//
这里设置点击后执行
finish();
}
}
)
.show();
}
mPm
= getPackageManager();
boolean errFlag
= false;
加上红色部分的代码,
就可以对特定的安装
程序进行控制了。
其中
rapp
是
p>
指安装程序的进程名,效果就是弹出提示框,提醒用户程序不允许卸载。
Android
4.0
下防止用户对安装程序进行强行停止
< br>打
开
源
码
目
录
,
到
f
rameworks/base/services/java/com/android/server/am
/
目
录
下
找<
/p>
到
文件,并打开它。
可以对代码中两个地方进行控制,都可以达到强行停止的目的:
1
、
在
p>
forceStopPackage
函数中,加上一段代码
2
、
public void forceStopPackage(final
String packageName) {
3
、
if
(checkCallingPermission(_STOP_PACKAGES)
4
、
!=
SION_GRANTED) {
5
、
String msg =
6
、
+
lingPid()
7
、
+
8
、
+
requires
_STOP_PACKAGES;
9
、
Slog.w(TAG
, msg);
10
、
throw new SecurityException(msg);
11
、
}
12
、
final int userId = lingUserId();
13
、
long callingId = allingIdentity();
14
、
try
{
15
、
IPackageManager pm = kageManager();
16
、
int
pkgUid = -1;
17
、
synchronized(this) {
18
、
try
{
19
、
pkgUid = kageUid(packageName, userId);
20
、
}
catch (RemoteException e) {
21
、
}
22
、
if
(packageName == -1) {
23
、
Slog.w(TAG,
24
、
return;
25
、
}
26
、
//
添加判断代码
27
、
if(
(
28
、
return;
29
、
}
30
、
//
31
、
forceStopPackageLocked(packageName,
pkgUid);
32
、
try {
33
、
kageStoppedState(packageName, true,
userId);
34
、
} catch (RemoteException e) {
35
、
}
catch (IllegalArgumentException e) {
36
、
Slog.w(TAG,
37
、
+
packageName +
38
、
}
39
、
}
40
、
} finally {
41
、
eCallingIdentity(callingId);
+
-
-
-
-
-
-
-
-
-
上一篇:关于爱的英文诗句
下一篇:acs800故障代码表