Ubuntu下Android源码修改编译及运行launcher定制.docx

上传人:b****6 文档编号:7562881 上传时间:2023-01-25 格式:DOCX 页数:19 大小:22.54KB
下载 相关 举报
Ubuntu下Android源码修改编译及运行launcher定制.docx_第1页
第1页 / 共19页
Ubuntu下Android源码修改编译及运行launcher定制.docx_第2页
第2页 / 共19页
Ubuntu下Android源码修改编译及运行launcher定制.docx_第3页
第3页 / 共19页
Ubuntu下Android源码修改编译及运行launcher定制.docx_第4页
第4页 / 共19页
Ubuntu下Android源码修改编译及运行launcher定制.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

Ubuntu下Android源码修改编译及运行launcher定制.docx

《Ubuntu下Android源码修改编译及运行launcher定制.docx》由会员分享,可在线阅读,更多相关《Ubuntu下Android源码修改编译及运行launcher定制.docx(19页珍藏版)》请在冰豆网上搜索。

Ubuntu下Android源码修改编译及运行launcher定制.docx

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、将600改为-1保存后退出//其中600单位是ms,表示60s,就是说60s屏幕会进行休眠状态,改为-1后,不再进入休眠

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:

//#//classNameisoptional;ifspecified,itistheactivitytheuserchosetouninstallfinalIntentintent=getIntent();

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"/>

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 面试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1