Ubuntu下Android源码修改编译及运行launcher定制.docx
- 文档编号:7562881
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:19
- 大小:22.54KB
Ubuntu下Android源码修改编译及运行launcher定制.docx
《Ubuntu下Android源码修改编译及运行launcher定制.docx》由会员分享,可在线阅读,更多相关《Ubuntu下Android源码修改编译及运行launcher定制.docx(19页珍藏版)》请在冰豆网上搜索。
Ubuntu下Android源码修改编译及运行launcher定制
环境
Linux版本:
Ubuntu
11.04(可由
10.10的版本进行升级)64位系统
GCC版本:
gccversion
4.5.2
Java版本:
javaversion"
1.6.0_26"
下载android源码前注意:
1、保证Ubuntu系统中的容量在80G左右,以保证足够的空间来存放android源码以及编译后的相关文件。
联网方法:
采用拨号进行连接。
相关操作步骤如下所示:
1、虚拟机à设置à硬件à网络适配器à网络连接à桥接
2、启动Ubuntu系统,打开终端(在普通用户下),输入相关命令如下:
$pppoeconf//打开后输入上网账号跟密码,确认保存
$sudopondsl-provider//上网连接命令
经过这两个步骤后就可以进行上网了。
Android源码编译所依赖的tools
01.$sudoapt-getupdate
02.$sudoapt-get-yinstallgit-core
03.$sudoapt-get-yinstallgnupg
04.$sudoapt-get-yinstallsun-java6-jdkflex
05.$sudoapt-get-yinstallbison
06.$sudoapt-get-yinstallgperf
07.$sudoapt-get-yinstalllibsdl-dev
08.$sudoapt-get-yinstalllibesd0-dev
09.$sudoapt-get-yinstalllibwxgtk
2.6-dev
10.$sudoapt-get-yinstallbuild-essential
11.$sudoapt-get-yinstallzip
12.$sudoapt-get-yinstallcurl
13.$sudoapt-get-yinstalllibncurses5-dev
14.$sudoapt-get-yinstallzlib1g-dev
15.$sudoapt-get-yinstallvalgrind
注意:
(如果是32bit的系统的话,则要更改几个Android.mk文件)
01./external/clearsilver/cgi/Android.mk
02./external/clearsilver/java-jni/Android.mk
03./external/clearsilver/util/Android.mk
04./external/clearsilver/cs/Android.mk
用gedit打开,修改m64为m32即可
另外
将build/core/main.mk中的ifneq(64,$(findstring64,$(build_arch)))修改为:
ifneq(i686,$(findstringi686,$(build_arch)))
对于32位系统所出现的问题,解决方法:
Error1:
make:
***
[out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/RefBase.o]error1在terminal中输入
$geditframeworks/base/libs/utils/Android.mk
将LOCAL_CFLAGS+=-DLIBUTILS_NATIVE=1$(TOOL_CFLAGS)修改为:
LOCAL_CFLAGS+=-DLIBUTILS_NATIVE=1$(TOOL_CFLAGS)–fpermissive
Error2:
make:
***[out/host/linux-x86/obj/EXECUTABLES/obbtool_intermediates/Main.o]error1此处编译错误是由于ubuntu
11.10采用了G
CC4.6.1导致的
86.mk
并将以下语句:
HOST_GLOBAL_CFLAGS
+=-D_FORTIFY_SOURCE=0
修改为:
HOST_GLOBAL_CFLAGS
+=-U_FORTIFY_SOURCE-D_FORTIFY_SOURCE=0
Android源码下载
1、安装repo
安装过程步骤如下所示:
Repo下载安装
1、$mkdir~/bin//在home目录下创建bin文件夹
2、$PATH=~/bin:
$PATH//环境变量设置
3、$curlhttps:
4、$chmoda+x~/bin/repo//权限设置,保证repo可执行
Repoclient初始化
1、$mkdirAndroid//创建Android目录,用于存放下载的android源码
2、$cdAndroid//进入到Android目录
3、$repoinit-uhttps:
当然也可以指定android版本,使用如下命令:
$repoinit-uhttps:
4.0.1_r1Android源码文件获取
$reposync
注意:
Android源码编译
环境初始化
1、$sourcebuild/envsetup.sh
OR
$.build/envsetup.sh
2、$lunchfull-eng//选择编译目标
Code编译
$make-j4//其中j4表示同时启动4个线程任务进行编译,可以直接使用make,这样就是最大程度使用线程数来进行编译
总结:
到这里为止,android源码完成了编译过程,编译后,会在源码目录下的/out/target/product/generic/有三个镜像文件生成,分别是system.img、userdata.img以及ramdisk.img。
注意:
1、如果编译过程没有出问题,但是在/out/target/product/generic/下3个镜像文件不全,可以再次进行一次命令make,就可以解决问题了。
2、如果是编译过程中出现错误,一般导致的原因是因为缺少了相关编译环境,可以根据提示进行安装,安装后,重新进行编译。
WindowsXP下使用Android模拟器运行所编译好的文件。
原理:
将Android模拟器下所加载的system.img替换成编译后的system.img即可。
1、将编译好的system.img从Ubuntu中拷贝出来
方法:
1)先拷贝到U盘或者移动硬盘中,再从U盘或移动硬盘拷贝到WindowsXP硬盘下;
2)先进行WindowsXP跟Ubuntu文件夹共享,这样就可以将system.img拷贝到共享文件夹中;
3)传FTP,从FTPxx进行下载;
4)在Ubuntu中上网将system.img作为附件进行邮件发送,然后从WindowsXP下进行下载。
2、将拷贝出来的system.img文件放置到Android模拟器下的对于文件夹中,如果Android是
4.0以上的版本的话,一般是在system-imges文件夹中。
C:
\ProgramFiles\Android\android-sdk\system-images\android-15\armeabi-v7a
3、启动模拟器就可以运行了。
注意:
创建Android虚拟机的时候,Android版本应该跟Ubuntu下编译好的Android版本要保持一致,否则有可能替换system.img后,Android系统无法正常启动,或者无法进入Android启动界面。
Android源码修改并进行编译
下面以2个实例来进行说明,实例1目的是实现Android系统永不休眠,实例2是实现Android系统启动后,不自动进入锁屏界面。
实例1:
实现Android系统永不休眠其实很简单,只需要对源码下的配置文件XML下的参数进行修改即可。
步骤如下:
1、$cdframeworks/base/packages/SettingsProvider/res/values//在下载的Android源码目录下输入此命令,进入到values目录下
2、$geditdefaults.xml//使用文本编辑器打开defaults.xml文件
3、将
4、$cd../../../../../..///返回到源码目录下
5、$source./build/envsetup.sh//环境初始化
6、$mmmframeworks/base/packages/SettingsProvider///对SettingsProvider模块进行编译
7、$makesnod//重新打包system.img
到这里,模拟编译就完成了,查看效果的话,直接将Android模拟器下的system.img替换掉启动运行即可。
注意:
mmm命令可以对模块进行编译,后面必须接上模块所在目录,查看某目录是否为一模块,就看当前目录下是否有Android.mk文件,如果有的话,就是模块。
除了可以使用mmm进行编译的话,还可以使用mm,但是mm是在当前目录下实行编译的,也就是模块目录下使用此命令。
实例2:
实现Android启动后不进入锁屏状态。
修改KeyguardViewMediator.java文件下的变量,将其赋值改为false即可。
步骤如下:
2、$geditKeyguardViewMediator.java//是用文本编辑器打开java文件
3、将privatebooleanmExternallyEnabled=true;代码中的true改为false,保存退出
4、$cd../../../../../../../../..///返回到源码目录下
5、$source./build/envsetup.sh//环境初始化
6、$mmmframeworks/base/policy///对policy模块进行编译
7、$makesnod//重新打包system.img
注意:
如果在进行模块代码编译了,报出少了一个odex后缀名的文件的错误时,总结了下,导致报错的原因可能是Android版本的差异,不过没事,即使模块编译通不过,还是可以对整个源码进行编译的(直接在源码目录下执行make命令即可),只是时间会相对较长,同样会将修改的模块整合到system.img文件中。
Android
4.0下防止用户对安装程序进行卸载
1、UninstallAppProgress.Java//程序卸载过程
2、UninstallerActivity.java//程序卸载界面
方法是在UninstallerActivity.java对应位置加上一段代码即可:
@Override
publicvoidonCreate(Bundleicle){
super.onCreate(icle);
//Getintentinformation.
//WeexpectanintentwithURIoftheformpackage:
//
UripackageURI=intent.getData();
StringpackageName=packageURI.getEncodedSchemeSpecificPart();
if(packageName==null){
Log.e(TAG,"Invalidpackagename:
"+packageName);
showDialog(DLG_APP_NOT_FOUND);
/*AlertDialog.Builderbuilder=newAlertDialog.Builder(this);
//builder.setIcon(android.R.drawable.ic_dialog_info);
builder.setTitle("Message");
builder.setMessage("Cannotbeuninstall!
");
builder.setPositiveButton("确认",null);
//builder.create().show();
builder.show();
//showDialog(DLG_APP_NOT_FOUND);
//return;
finish();*/
newAlertDialog.Builder(this)
.setTitle("游戏控制")
.setMessage("对不起,此程序不允许卸载!
")
.setPositiveButton("确定",
newDialogInterface.OnClickListener(){
publicvoidonClick(DialogInterfacedialoginterface,inti){
//这里设置点击后执行
finish();}}).show();}mPm=getPackageManager();
booleanerrFlag=false;
Android
4.0下防止用户对安装程序进行强行停止
1、在forceStopPackage函数中,加上一段代码
2、publicvoidforceStopPackage(finalStringpackageName){
3、if
(checkCallingPermission(android.Manifest.permission.FORCE_STOP_PACKAGES)
4、!
=PackageManager.PERMISSION_GRANTED){
5、Stringmsg="PermissionDenial:
forceStopPackage()frompid="
6、+Binder.getCallingPid()
7、+",uid="+Binder.getCallingUid()
8、+"requires"
android.Manifest.permission.FORCE_STOP_PACKAGES;
9、Slog.w(TAG,msg);
10、thrownewSecurityException(msg);
11、}
12、finalintuserId=UserId.getCallingUserId();
13、longcallingId=Binder.clearCallingIdentity();
14、try{
15、IPackageManagerpm=AppGlobals.getPackageManager();
16、intpkgUid=-1;
17、synchronized(this){
18、try{
19、pkgUid=pm.getPackageUid(packageName,userId);
20、}catch(RemoteExceptione){
21、}
22、if(packageName==-1){
23、Slog.w(TAG,"InvalidpackageName:
"+packageName);
24、return;
25、}
26、//添加判断代码
28、return;
29、}
30、//
31、forceStopPackageLocked(packageName,pkgUid);
32、try{
33、pm.setPackageStoppedState(packageName,true,userId);
34、}catch(RemoteExceptione){
35、}catch(IllegalArgumentExceptione){
36、Slog.w(TAG,"Failedtryingtounstoppackage"
37、+packageName+":
"+e);
38、}
39、}
40、}finally{
41、Binder.restoreCallingIdentity(callingId);+
42、}
43、}
方法二:
这是在网上看到的方法,尝试了下,编译通过了,但是在模拟器上面运行的时候出问题
2、修改clearApplicationUserData函数
44、publicbooleanclearApplicationUserData(finalStringpackageName,
45、finalIPackageDataObserverobserver,finalintuserId){
46、enforceNotIsolatedCaller("clearApplicationUserData");
47、intuid=Binder.getCallingUid();
48、intpid=Binder.getCallingPid();
49、longcallingId=Binder.clearCallingIdentity();
50、try{
51、IPackageManagerpm=AppGlobals.getPackageManager();
52、intpkgUid=-1;
53、synchronized(this){
54、try{
55、pkgUid=pm.getPackageUid(packageName,userId);
56、}catch(RemoteExceptione){
57、}
58、if(pkgUid==-1){
59、Slog.w(TAG,"InvalidpackageName:
"+packageName);
60、returnfalse;
61、}
63、AlertDialog.Builderbuilder=newAlertDialog.Builder(mContent);
64、builder.setTitle();
65、builder.setMessage(msg);
66、builder.setPositiveButton("OK",new
DialogInterface.OnClickListener(){
67、publicvoidonClick(DialogInterfacedialoginterface,inti){
68、//Clickevent
69、}
70、}
71、);
72、builder.create().show();
73、returnfalse;
74、}
75、if(uid==pkgUid||checkComponentPermission(
76、
android.Manifest.permission.CLEAR_APP_USER_DATA,
77、
78、
79、pid,uid,-1,true)
==PackageManager.PERMISSION_GRANTED){forceStopPackageLocked(packageName,pkgUid);
80、}else{
81、throw
permission:
"+newSecurityException(pid+"doesnothave
82、
android.Manifest.permission.CLEAR_APP_USER_DATA+"tocleardata"+
83、"forprocess:
"+packageName);
84、}
85、}
86、
87、try{
88、//clearapplicationuserdata
89、pm.clearApplicationUserData(packageName,observer,userId);
90、Intentintent=newIntent(Intent.ACTION_PACKAGE_DATA_CLEARED,
91、Uri.fromParts("package",packageName,null));
92、intent.putExtra(Intent.EXTRA_UID,pkgUid);
93、broadcastIntentInPackage("android",Process.SYSTEM_UID,intent,
94、null,null,0,null,null,null,false,false,userId);
95、}catch(RemoteExceptione){
96、}
97、}finally{
98、Binder.restoreCallingIdentity(callingId);
99、}
100、returntrue;
101、}
Launcher桌面定制
方法一:
将系统的Launcher进行删除,使用自己编写的Launcher。
实现步骤:
1、编写自己的Launcher。
例如:
建立Jhome工程,修改工程下的AndroidManifest.xml文件,如下所示:
//主屏activity属性设置
//Androidactivity属性设置大全http:
android: android: launchMode="singleTask" android: clearTaskOnLaunch="true" android: stateNotNeed="true" android: windowSoftInputMode="adjustPan" android: screenOrientation="nosensor" android: label="@string/title_activity_laucher"> name="android.intent.action.MAIN"/> //以下两条代码一定要加上,表示HomeScreen name="android.intent.category.LAUNCHER"/>
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Ubuntu Android 源码 修改 编译 运行 launcher 定制
![提示](https://static.bdocx.com/images/bang_tan.gif)