Ubuntu下Android源碼修改、編譯及運行、launcher定制_第1頁
Ubuntu下Android源碼修改、編譯及運行、launcher定制_第2頁
Ubuntu下Android源碼修改、編譯及運行、launcher定制_第3頁
Ubuntu下Android源碼修改、編譯及運行、launcher定制_第4頁
Ubuntu下Android源碼修改、編譯及運行、launcher定制_第5頁
已閱讀5頁,還剩23頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、 1 / 26 環(huán)境 Linux版本: Ubuntu 11.04(可由 10.10的版本進行升級)64位系統(tǒng) GCC版本: gcc version 4.5.2 Java版本: java version 1.6.0_26 下載android源碼前注意: 1、保證Ubuntu系統(tǒng)中的容量在80G左右,以保證足夠的空間來存放android源碼以及編譯后的相關(guān)文件。 聯(lián)網(wǎng)方法: 采用撥號進行連接。相關(guān)操作步驟如下所示: 1、虛擬機設置硬件網(wǎng)絡適配器網(wǎng)絡連接橋接 2、啟動Ubuntu系統(tǒng),打開終端(在普通用戶下),輸入相關(guān)命令如下: $ pppoeconf/打開后輸入上網(wǎng)賬號跟密碼,確認保存 $ sud

2、o pon dsl-provider/上網(wǎng)連接命令 2 / 26 經(jīng)過這兩個步驟后就可以進行上網(wǎng)了。 Android源碼編譯所依賴的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 ap

3、t-get -y install libsdl-dev 08.$ sudo apt-get -y install libesd0-dev 09.$ sudo apt-get -y install libwxgtk 2.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

4、 zlib1g-dev 15.$ sudo apt-get -y install valgrind 注意: (如果是32bit的系統(tǒng)的話,則要更改幾個Android.mk文件) 01./external/clearsilver/cgi/Android.mk 3 / 26 02./external/clearsilver/java-jni/Android.mk 03./external/clearsilver/util/Android.mk 04./external/clearsilver/cs/Android.mk 用gedit打開,修改m64為m32即可 另外 將build/core/mai

5、n.mk中的ifneq (64,$(findstring 64,$(build_arch)修改為: ifneq (i686,$(findstring i686,$(build_arch) 對于32位系統(tǒng)所出現(xiàn)的問題,解決方法: Error1: make: * out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/RefBase.o error1在terminal中輸入 $ gedit frameworks/base/libs/utils/Android.mk 將LOCAL_CFLAGS += -DLIBUTILS_NATI

6、VE=1 $(TOOL_CFLAGS)修改為: LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS)fpermissive Error2: make: * out/host/linux-x86/obj/EXECUTABLES/obbtool_intermediates/Main.oerror 1此處編譯錯誤是由于ubuntu 11.10采用了G 4 / 26 CC4.6.1導致的 86.mk 并將以下語句: HOST_GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=0 修改為: HOST_GLOBAL_CFLAGS += -

7、U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 Android源碼下載 1、安裝repo 安裝過程步驟如下所示: Repo下載安裝 1、$ mkdir /bin/在home目錄下創(chuàng)建bin文件夾 2、$ PATH=/bin: $PATH/環(huán)境變量設置 3、$ curl https: 4、$ chmod a+x /bin/repo/權(quán)限設置,保證repo可執(zhí)行 Repo client初始化 1、$ mkdir Android/創(chuàng)建Android目錄,用于存放下載的android源碼 2、$ cd Android/進入到Android目錄 3、$ repo init -u

8、 https: 5 / 26 當然也可以指定android版本,使用如下命令: $ repo init -uhttps: 4.0.1_r1Android源碼文件獲取 $ repo sync 注意: Android源碼編譯 環(huán)境初始化 1、$ source build/envsetup.sh OR $ . build/envsetup.sh 2、$ lunch full-eng/選擇編譯目標 Code編譯 $ make -j4/其中j4表示同時啟動4個線程任務進行編譯,可以直接使用make,這樣就是最大程度使用線程數(shù)來進行編譯 總結(jié): 到這里為止,android源碼完成了編譯過程,編譯后,會在源

9、碼目錄下的/out/target/product/generic/有三個鏡像文件生成,分別是system.img、userdata.img以及ramdisk.img。 注意: 6 / 26 1、如果編譯過程沒有出問題,但是在/out/target/product/generic/下3個鏡像文件不全,可以再次進行一次命令make,就可以解決問題了。 2、如果是編譯過程中出現(xiàn)錯誤,一般導致的原因是因為缺少了相關(guān)編譯環(huán)境,可以根據(jù)提示進行安裝,安裝后,重新進行編譯。 Windows XP下使用Android模擬器運行所編譯好的文件。 原理: 將Android模擬器下所加載的system.img替換成

10、編譯后的system.img即可。 1、將編譯好的system.img從Ubuntu中拷貝出來 方法:1)先拷貝到U盤或者移動硬盤中,再從U盤或移動硬盤拷貝到Windows XP硬盤下; 2)先進行WindowsXP跟Ubuntu文件夾共享,這樣就可以將system.img拷貝到共享文件夾中; 3)傳FTP,從FTPxx進行下載; 4)在Ubuntu中上網(wǎng)將system.img作為附件進行郵件發(fā)送,然后從WindowsXP下進行下載。 2、將拷貝出來的system.img文件放置到Android模擬器下的對于文件夾中,如果Android是 4.0以上的版本的話,一般是在system-imges

11、文件夾中。C: ProgramFilesAndroidandroid-sdksystem-imagesandroid-15armeabi-v7a 3、啟動模擬器就可以運行了。 注意: 7 / 26 創(chuàng)建Android虛擬機的時候,Android版本應該跟Ubuntu下編譯好的Android版本要保持一致,否則有可能替換system.img后,Android系統(tǒng)無法正常啟動,或者無法進入Android啟動界面。 Android源碼修改并進行編譯 下面以2個實例來進行說明,實例1目的是實現(xiàn)Android系統(tǒng)永不休眠,實例2是實現(xiàn)Android系統(tǒng)啟動后,不自動進入鎖屏界面。 實例1: 實現(xiàn)Andr

12、oid系統(tǒng)永不休眠其實很簡單,只需要對源碼下的配置文件XML下的參數(shù)進行修改即可。步驟如下: 1、$ cd frameworks/base/packages/SettingsProvider/res/values/在下載的Android源碼目錄下輸入此命令,進入到values目錄下 2、$ gedit defaults.xml/使用文本編輯器打開defaults.xml文件 3、將600改為-1保存后退出/其中600單位是ms,表示60s,就是說60s屏幕會進行休眠狀態(tài),改為-1后,不再進入休眠 4、$ cd ././././././返回到源碼目錄下 5、$ source ./build/en

13、vsetup.sh/環(huán)境初始化 6、$ mmm frameworks/base/packages/SettingsProvider/對SettingsProvider模塊進行編譯 7、$ make snod /重新打包system.img 到這里,模擬編譯就完成了,查看效果的話,直接將Android模擬器下的system.img替換掉啟動運行即可。 注意: 8 / 26 mmm命令可以對模塊進行編譯,后面必須接上模塊所在目錄,查看某目錄是否為一模塊,就看當前目錄下是否有Android.mk文件,如果有的話,就是模塊。除了可以使用mmm進行編譯的話,還可以使用mm,但是mm是在當前目錄下實行編譯

14、的,也就是模塊目錄下使用此命令。 實例2: 實現(xiàn)Android啟動后不進入鎖屏狀態(tài)。修改KeyguardViewMediator.java文件下的變量,將其賦值改為false即可。步驟如下: 2、$ gedit KeyguardViewMediator.java/是用文本編輯器打開java文件 3、將private boolean mExternallyEnabled = true;代碼中的true改為false,保存退出 4、$ cd ././././././ ./././返回到源碼目錄下 5、$ source ./build/envsetup.sh/環(huán)境初始化 6、$ mmm framew

15、orks/base/policy/對policy模塊進行編譯 7、$ make snod /重新打包system.img 注意: 如果在進行模塊代碼編譯了,報出少了一個odex后綴名的文件的錯誤時,總結(jié)了下,導致報錯的原因可能是Android版本的差異,不過沒事,即使模塊編譯通不過,還是可以對整個源碼進行編譯的(直接在源碼目錄下執(zhí)行make命令即可),只是時間會相對較長,同樣會將修改的模塊整合到system.img文件中。 Android 4.0下防止用戶對安裝程序進行卸載 9 / 26 1、UninstallAppProgress.Java/程序卸載過程 2、UninstallerActiv

16、ity.java/程序卸載界面 方法是在UninstallerActivity.java對應位置加上一段代碼即可: Override public void onCreate(Bundle icle) super.onCreate(icle); / 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 uninstallfinal Intent

17、 intent = getIntent(); Uri packageURI = intent.getData(); String packageName = packageURI.getEncodedSchemeSpecificPart(); if(packageName = null) Log.e(TAG, Invalid package name: + packageName); showDialog(DLG_APP_NOT_FOUND); /*AlertDialog.Builder builder= new AlertDialog.Builder(this); /builder.setI

18、con(android.R.drawable.ic_dialog_info); builder.setTitle(Message); builder.setMessage(Cannot be uninstall!); builder.setPositiveButton(確認, null); /builder.create().show(); 10 / 26 builder.show(); /showDialog(DLG_APP_NOT_FOUND); /return; finish();*/ new AlertDialog.Builder(this) .setTitle(游戲控制) .setM

19、essage(對不起,此程序不允許卸載!) .setPositiveButton(確定, new DialogInterface.OnClickListener() public void onClick(DialogInterface dialoginterface, int i) /這里設置點擊后執(zhí)行 finish();).show();mPm = getPackageManager(); boolean errFlag = false; Android 4.0下防止用戶對安裝程序進行強行停止 1、在forceStopPackage函數(shù)中,加上一段代碼 2、public void forc

20、eStopPackage(final String packageName) 3、if (checkCallingPermission(android.Manifest.permission.FORCE_STOP_PACKAGES) 11 / 26 4、!= PackageManager.PERMISSION_GRANTED) 5、String msg = Permission Denial: forceStopPackage() from pid= 6、+ Binder.getCallingPid() 7、+ , uid= + Binder.getCallingUid() 8、+requir

21、es android.Manifest.permission.FORCE_STOP_PACKAGES; 9、Slog.w(TAG, msg); 10、throw new SecurityException(msg); 11、 12、final int userId = UserId.getCallingUserId(); 13、long callingId = Binder.clearCallingIdentity(); 14、try 15、IPackageManager pm = AppGlobals.getPackageManager(); 16、int pkgUid = -1; 17、s

22、ynchronized(this) 18、try 19、pkgUid = pm.getPackageUid(packageName, userId); 20、 catch (RemoteException e) 21、 22、if (packageName = -1) 12 / 26 23、Slog.w(TAG, Invalid packageName: + packageName); 24、return; 25、 26、/添加判斷代碼 28、return; 29、 30、/ 31、forceStopPackageLocked(packageName, pkgUid); 32、try 33、p

23、m.setPackageStoppedState(packageName, true, userId); 34、 catch (RemoteException e) 35、 catch (IllegalArgumentException e) 36、Slog.w(TAG, Failed trying to unstop package 37、+ packageName + : + e); 38、 39、 40、 finally 41、Binder.restoreCallingIdentity(callingId);+ 13 / 26 42、 43、 方法二: 這是在網(wǎng)上看到的方法,嘗試了下,編

24、譯通過了,但是在模擬器上面運行的時候出問題 2、修改clearApplicationUserData函數(shù) 44、public boolean clearApplicationUserData(final String packageName, 45、final IPackageDataObserver observer, final int userId) 46、enforceNotIsolatedCaller(clearApplicationUserData); 47、int uid = Binder.getCallingUid(); 48、int pid = Binder.getCalli

25、ngPid(); 49、long callingId = Binder.clearCallingIdentity(); 50、try 51、IPackageManager pm = AppGlobals.getPackageManager(); 52、int pkgUid = -1; 53、synchronized(this) 54、try 55、pkgUid = pm.getPackageUid(packageName, userId); 56、 catch (RemoteException e) 57、 58、if (pkgUid = -1) 14 / 26 59、Slog.w(TAG,

26、Invalid packageName: + packageName); 60、return false; 61、 63、AlertDialog.Builder builder = new AlertDialog.Builder(mContent); 64、builder.setTitle(); 65、builder.setMessage(msg); 66、builder.setPositiveButton(OK,new DialogInterface.OnClickListener() 67、public void onClick(DialogInterface dialoginterfac

27、e, int i) 68、/Click event 69、 70、 71、); 72、builder.create().show(); 73、return false; 74、 75、if (uid = pkgUid | checkComponentPermission( 76、 android.Manifest.permission.CLEAR_APP_USER_DATA, 15 / 26 77、 78、 79、pid, uid, -1, true) = PackageManager.PERMISSION_GRANTED) forceStopPackageLocked(packageName

28、, pkgUid); 80、 else 81、throw permission: +newSecurityException(pid+doesnothave 82、 android.Manifest.permission.CLEAR_APP_USER_DATA+ to clear data + 83、for process: +packageName); 84、 85、 86、 87、try 88、/clear application user data 89、pm.clearApplicationUserData(packageName, observer, userId); 90、Inte

29、ntintent=newIntent(Intent.ACTION_PACKAGE_DATA_CLEARED, 91、Uri.fromParts(package, packageName, null); 16 / 26 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 (RemoteExcept

30、ion e) 96、 97、 finally 98、Binder.restoreCallingIdentity(callingId); 99、 100、return true; 101、 Launcher桌面定制 方法一: 將系統(tǒng)的Launcher進行刪除,使用自己編寫的Launcher。 實現(xiàn)步驟: 1、編寫自己的Launcher。例如: 建立Jhome工程,修改工程下的AndroidManifest.xml文件,如下所示: /主屏activity屬性設置 /Android activity屬性設置大全http: /以下兩條代碼一定要加上,表示Home Screen 18 / 26 /應用程

31、序列表activity 2、將寫好的Launcher代碼進行編譯生成APK,將APK拷貝到Android源碼下的/out/target/product/generic/system/app/下; 3、修改Android下的Launcher配置文件AndroidManifest.xml,該文件在Android源碼下/packages/apps/Launcher2(或Launcher,根據(jù)版本不同有所差異),打開該目錄下的AndroidManifest.xml文件,將以下兩段代碼刪除或者注釋掉即可。 4、編譯Android源碼,編譯好后,就可以啟動模擬器進行效果查看了。 方法二: 實現(xiàn)唯一定制的L

32、auncher,缺點: 修改大,容易出問題。 實現(xiàn)步驟: 1、在Intent.java(frameworks/base/core/java/android/content/Intent.java)中添加兩行代碼 1. SdkConstant(SdkConstantType.INTENT_CATEGORY) 2. publicstaticfinalStringCATEGORY_HOME_FIRST=“ent.category.HOME_FIRST”; 1. /intent.addCategory(Intent.CATEGORY_HOME);改成 intent.addCate

33、gory(Intent.CATEGORY_HOME_FIRST); 2.將該文件中出現(xiàn)的Intent.CATEGORY_HOME換成Intent.CATEGORY_HOME_FIRST 1./mHomeIntent.addCategory(Intent.CATEGORY_HOME); 2.mHomeIntent.addCategory(Intent.CATEGORY_HOME_FIRST); 1. /if (Intent.ACTION_MAIN.equals(_intent.getAction() & _intent.hasCategory(Intent.CATEGORY_HOME) 2if

34、(Intent.ACTION_MAIN.equals(_intent.getAction() & 20 / 26 _intent.hasCategory(Intent.CATEGORY_HOME_FIRST) 5、在 RecentApplicationsDialog.java中修改 1. / ActivityInfo homeInfo = /new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME) /.resolveActivityInfo(pm, 0); 2. ActivityInfo homeInfo = new In

35、tent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME_FIRST) .resolveActivityInfo(pm, 0); 6、在Android源碼下可以使用grep -R CATEGORY_HOME frameworks和命令grep -R CATEGORY_HOMEpackages找出在frameworks和packages目錄下所有文件中出現(xiàn)CATEGORY_HOME的文件路徑羅列出,然后對每個文件中的CATEGORY_HOME和category_HOME對應改成CATEGORY_HOME_FIRST和category_HO

36、ME_FIRST;主要有以下這些文件: codeCATEGORY_HOME /改frameworks/base/api/ 13.xml: field name=CATEGORY_HOME /改frameworks/base/api/ 12.xml: field name=CATEGORY_HOME 21 / 26 /改frameworks/base/api/ 4.xml: field name=CATEGORY_HOME /改frameworks/base/api/ 14.txt: fieldpublicstaticfinaljava.lang.StringCATEGORY_HOME = an

37、ent.category.HOME; /改frameworks/base/api/ 8.xml: field name=CATEGORY_HOME /改frameworks/base/api/ 6.xml: field name=CATEGORY_HOME /改frameworks/base/api/ 11.xml: field name=CATEGORY_HOME /改frameworks/base/api/ 5.xml: field name=CATEGORY_HOME /改frameworks/base/api/ 16.txt: 22 / 26 fieldpublics

38、taticfinaljava.lang.StringCATEGORY_HOME = ent.category.HOME; /改frameworks/base/api/ 15.txt: fieldpublicstaticfinaljava.lang.StringCATEGORY_HOME = ent.category.HOME; /改frameworks/base/api/ 7.xml: field name=CATEGORY_HOME /改frameworks/base/api/ 3.xml: field name=CATEGORY_HOME /改f

39、rameworks/base/api/ 9.xml: field name=CATEGORY_HOME /改frameworks/base/api/ 2.xml: field name=CATEGORY_HOME /改frameworks/base/api/ 10.xml: field name=CATEGORY_HOME /改frameworks/base/api/current.txt: 23 / 26 fieldpublicstaticfinaljava.lang.StringCATEGORY_HOME = ent.category.HOME; /改framewor

40、ks/base/api/current.txt: fieldpublicstaticfinaljava.lang.StringCATEGORY_HOME_FIRST = ent.category.HOME_FIRST; /改frameworks/base/api/ 1.xml: field name=CATEGORY_HOME /mHomeIntent.addCategory(Intent.CATEGORY_HOME); mHomeIntent.addCategory(Intent.CATEGORY_HOME_FIRST); /new Intent(Intent.ACTI

41、ON_MAIN).addCategory(Intent.CATEGORY_HOME) category = Intent.CATEGORY_HOME; homeIntent = buildHomeIntent(Intent.CATEGORY_HOME); _intent.hasCategory(Intent.CATEGORY_HOME) & _intent.hasCategory(Intent.CATEGORY_HOME_FIRST) & /intent.addCategory(Intent.CATEGORY_HOME); intent.addCategory(Intent.CATEGORY_

42、HOME_FIRST); /*if(intent.getCategories()!=null&intent.getCategories().contains(Intent.CATEGORY_HOME) if(intent.getCategories()!=null&intent.getCategories().contains(Intent.CATEGORY_HOME_FIRST) 24 / 26 .addCategory(Intent.CATEGORY_HOME).resolveActivityInfo(pm, 0); /改frameworks/base/core/java/android/con

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論