當前位置:九游会j9娱乐平台-九游ag登录中心网址 » 編程軟體 » mboot編譯時間

mboot編譯時間-九游会j9娱乐平台

發布時間: 2024-01-17 12:30:54

1. 關於ubuntu內核編譯的問題

解決辦法 修改 menu.lst 將 root=/uuidxxxxxxx 這個改為 root=/dev/sdax
另外 從filesystem type is ntfs.partition type 0x07 這一行我大概可看出,你是wubi安裝的, 這種情況 我建議你重新編譯內核並生成initrd, 因為內核不支持uuid的,initrd才支持,如果把filesystem編譯進內核了,啟動不用initrd.img的話,就只能用root=/dev/sdax的參數作為內核引導參數…

所以關鍵在於 一定要打開initrd支持並生成initrd

至於具體在那裡,我這邊環境所限無法告知, 麻煩你自己在make menuconfig裡面仔細看看或者google一下

/dev/sdxx 是你的硬碟的/的設備名稱 可以用正常啟動的內核引導後 輸入sudo df -h或者 sudo fdisk -l

目前的機器來講 編譯20分鍾很正常, 我的內核優化的很小 大概十分鍾左右就編譯完了 .

另外 內核源碼解開後會佔用接近200m的空間, 而gcc編譯內核和大型軟體時候產生的臨時文件佔用好幾百m乃至上g是很常見的的, 可以進入源代碼文件夾運行 make clean && make mrproper 來清理一下

2. ubuntu內核編譯需要多長時間

在分析linux內核源碼的過程中,要是能夠修改內核源碼並運行修改後的內核,我想肯定是令人高興的事,哪怕第一次修改僅僅是在啟動時列印一行"hello, wang jiankun!",肯定也是令我高興的。為了能成功編譯修改後的內核,今天先編譯一遍內核。
為了有一個完整的記錄,今天的起點是一台裸機。
1、在裸機上安裝一個最小的debian系統
為了能夠盡可能清晰的顯示編譯一個內核所需要的組件,在安裝系統時,僅僅安裝最小系統,然後需要什麼,就使用apt-get安裝什麼。
使用網路安裝,在安裝過程中出現software selection界面時不要選擇任何選項,這樣安裝的系統將是最小的系統。
為了使用ssh遠程登錄,最小系統安裝完成後,要安裝ssh伺服器並且要設置靜態ip地址(debian安裝過程中是通過dhcp獲取的ip地址)。
2、安裝ssh伺服器
apt-get install ssh
3、設置靜態ip地址
修改文件/etc/network/interfaces,其中藍色部分是增加的,紅色部分是屏蔽掉的,黑色部分是沒有變化的。
# this file describes the network interfaces available on your system
# and how to activate them. for more information, see interfaces(5).
# the loopback network interface
auto lo
iface lo inet loopback
# the primary network interface
allow-hotplug eth0
# wang jiankun commented the following line
#iface eth0 inet dhcp
# wang jiankun added the the following lines
iface eth0 inet static
address 192.168.1.251
netmask 255.255.255.0
broadcast 192.168.1.255
network 192.168.1.0
gateway 192.168.1.1
重啟系統後,修改將生效。
4、通過wget下載linux內核源碼
administrator@wangjk:~/kernel$ wget http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.19.tar.bz2
5、解壓文件linux-2.6.19.tar.bz2
administrator@wangjk:~/kernel$ tar jxf linux-2.6.19.tar.bz2
tar: bzip2: cannot exec: no such file or directory
tar: error is not recoverable: exiting now
tar: child returned status 2
tar: error exit delayed from previous errors
administrator@wangjk:~/kernel$
看來是沒有bzip2這個包,那就安裝一個:
apt-get install bzip2
6、安裝debian的kernel-package軟體包
在安裝kernel-package軟體包時,最好使用命令:apt-get build-dep kernel-package,而不要使用命令:
apt-get install kernel-package,後者安裝的軟體包是前者的子集,使用後者安裝kernel-package軟體包後,執行make menuconfig命令會出現頭文件找不到的錯誤,如下所示:
administrator@wangjk:~/kernel/linux-2.6.19$ make menuconfig
hostcc scripts/basic/fixdep
scripts/basic/fixdep.c:105:23: error: sys/types.h: no such file or directory
scripts/basic/fixdep.c:106:22: error: sys/stat.h: no such file or directory
scripts/basic/fixdep.c:107:22: error: sys/mman.h: no such file or directory
scripts/basic/fixdep.c:108:20: error: unistd.h: no such file or directory
scripts/basic/fixdep.c:109:19: error: fcntl.h: no such file or directory
scripts/basic/fixdep.c:110:20: error: string.h: no such file or directory
scripts/basic/fixdep.c:111:20: error: stdlib.h: no such file or directory
scripts/basic/fixdep.c:112:19: error: stdio.h: no such file or directory
主要是因為libc6-dev軟體包沒有安裝。所以即使使用了apt-get install kernel-package還得使用apt-get build-dep kernel-package,不如一次使用apt-get build-dep kernel-package完成方便。
7、安裝libncurses5-dev軟體包來支持make menuconfig
通過apt-get build-dep kernel-package安裝完成kernel-package後,執行make menuconfig仍然報錯,如下所示:
administrator@wangjk:~/kernel/linux-2.6.19$ make menuconfig
hostcc scripts/kconfig/lxdialog/checklist.o
in file included from scripts/kconfig/lxdialog/checklist.c:24:
scripts/kconfig/lxdialog/dialog.h:32:20: error: curses.h: no such file or directory
in file included from scripts/kconfig/lxdialog/checklist.c:24:
scripts/kconfig/lxdialog/dialog.h:97: error: expected specifier-qualifier-list before 'chtype'
scripts/kconfig/lxdialog/dialog.h:187: error: expected ')' before '*' token
scripts/kconfig/lxdialog/dialog.h:193: error: expected ')' before '*' token
scripts/kconfig/lxdialog/dialog.h:195: error: expected ')' before '*' token
scripts/kconfig/lxdialog/dialog.h:196: error: expected ')' before '*' token
scripts/kconfig/lxdialog/dialog.h:197: error: expected ')' before '*' token
scripts/kconfig/lxdialog/dialog.h:198: error: expected ')' before '*' token
scripts/kconfig/lxdialog/dialog.h:200: error: expected ')' before '*' token
scripts/kconfig/lxdialog/checklist.c:31: error: expected ')' before '*' token
scripts/kconfig/lxdialog/checklist.c:59: error: expected ')' before '*' token
scripts/kconfig/lxdialog/checklist.c:95: error: expected ')' before '*' token
[省略其後部分]
原來是最小系統不支持圖形的原因,安裝libncurses5-dev後即可。
8、將系統的config文件拷貝到內核目錄下
cp /boot/config-2.6.18-6-686 ./.config
9、執行make menuconfig
雖然是將原來系統的config文件拷貝過來的,但是如果所以的配置都採用默認的配置仍然會有問題,在我的系統上在載入文件系統時會死掉,所以還是要做必要的配置,主要是將scsi和sata部分編譯進內核而不要編譯成模塊,如下所示:
device drivers --->
serial ata (prod) and parallel ata (experimental) drivers --->
scsi device support --->
將藍色兩部分級聯的選項全部編譯進內核(其實沒有必要全部,但為了簡單起見,暫時這樣做)。
10、安裝fakeroot軟體包
11、編譯內核
fakeroot make-kpkg --initrd --revision=custom.1.0 kernel_image
12、安裝內核
wangjk:/home/administrator/kernel# dpkg -i linux-image-2.6.19_custom.1.0_i386.deb
selecting previously deselected package linux-image-2.6.19.
(reading database ... 17679 files and directories currently installed.)
unpacking linux-image-2.6.19 (from linux-image-2.6.19_custom.1.0_i386.deb) ...
done.
setting up linux-image-2.6.19 (custom.1.0) ...
running depmod.
finding valid ramdisk creators.
using mkinitramfs-kpkg to build the ramdisk.
running postinst hook script /sbin/update-grub.
you shouldn't call /sbin/update-grub. please call /usr/sbin/update-grub instead!
searching for grub installation directory ... found: /boot/grub
searching for default file ... found: /boot/grub/default
testing for an existing grub menu.lst file ... found: /boot/grub/menu.lst
searching for splash image ... none found, skipping ...
found kernel: /boot/vmlinuz-2.6.19
found kernel: /boot/vmlinuz-2.6.18-6-686
updating /boot/grub/menu.lst ... done
13、重啟系統引導新內核後查看版本號
administrator@wangjk:~$ cat /proc/version
linux version 2.6.19 (root@wangjk) (gcc version 4.1.2 20061115 (prerelease) (debian 4.1.1-21)) #1 smp thu may 7 21:52:10 cst 2009
administrator@wangjk:~$
可以看出已經是我編譯的內核了。

本文來自csdn博客,轉載請標明出處:http://blog.csdn.net/jiankun_wang/archive/2009/05/04/4147806.aspx

------------------------------------

ubuntu不帶linux內核源碼,需要自己下載安裝。
1,查看自己的內核版本
uname -r
2,查看源內的內核源碼類表
apt-cache search linux-source
3,下載安裝內核源代碼
sudo apt-get install linux-source-2.6.27 //我選的是這一個,自己看著辦吧
4,等待........

下載完成後,在/usr/src下會有一個文件名為linux-source-2.6.xx.tar.bz2的壓縮
5,解壓縮包
tar jxvf linux-source-2.6.27.tar.bz2 //看清自己的版本

解壓後會生成一個源代碼目錄/usr/src/linux-source-2.6.27
6,進入源碼目錄後,配置文件
make oldconfig
7,生成內核
make
8,瘋狂等待,大約1個多小時

9,編譯模塊
make moles
10,安裝模塊
make moles_install

大功告成!^_^
下面說一下makefile文件

$(make) -c $(kerneldir) m=$(pwd) moles_install #pwd當前工作目錄的變數
obj-m := hello.o
#hello.o是你要生成的驅動,以後可以自己改
kerneldir:=/lib/moles/2.6.27-7-generic/build
#這里別抄,寫成你自己的版本,這個目錄執行了內核源碼目錄
pwd:=$(shell pwd) #將當前工作目錄賦值該pwd
moles:
$(make) -c $(kerneldir) m=$(pwd) moles
moles_install:

下面是一個經典的hello,world!例子自己make一下就行了。
#include
#include
module_license("dual bsd/gpl");
static int hello_init(void)
{
printk(kern_alert "hello, world!\n");
return 0;
}
static void hello_exit(void)
{
printk(kern_alert"goodbye, cruel world!\n");
}
mole_init(hello_init);
mole_exit(hello_exit);

本文來自csdn博客,轉載請標明出處:http://blog.csdn.net/unikingest/archive/2009/03/10/3977747.aspx

-----------------------------------------------------------------------------

修改的這篇文章,自己加了幾個注意點
http://blog.theosoft.net/article.asp?id=57

第一次的linux kernel上機內容是編譯一個內核。我用的是ubuntu,有很多地方和其它 linux不一樣,所以就來把我的過程寫下來,以後也好有個參照
首先當然是下載內核源代碼,如果你要最新的內核,可以去ftp.kernel.org。當然,國內速度可能會很慢。如果你是教育網用戶,可以去上海交大的鏡像站下載,地址是http://ftp.sjtu.e.cn/sites/ftp.kernel.org/,缺點就是沒有最新的內核(更新需要一定的時間)。
==================================================備注
如果是就是編譯ubuntu本省自帶的內核,只需要
新立得搜索linux souce,下載帶ubuntupatch的kernel的source code。
sudo apt-get source linux-source-2.6.27
==================================================備注
我下載的是linux-2.6.19.2.tar.gz可以下到的最新版本了。下完之後當然是解壓縮。不過還不能直接編譯,因為ubuntu的默認安裝里缺少必要的組建。打開終端,輸入一下命令:
sudo -i
apt-get install build-essential kernel-package libncurses5-dev
然後到新立得里把所有以ncurses開頭的軟體包全部裝上,這樣就可以開始編譯內核了。
先運行以下命令,復制當前內核的配置文件。
cp /boot/config-`uname -r` ./.config
然後
make menuconfig

選擇 "load an alternate configuration file",再選擇你剛才拷貝過來的.config文件作為配置文件。然後確定。當結束後,你選擇退出時,會提示問你 "do you wish to save your new kernel configuration?"選擇yes即可。
接下來就要編譯了。輸入命令:
make
你也可以將編譯任務分成2個線程來執行,只要輸入:
make -j2
編譯一般需要1~1.5小時左右,就看cpu的性能如何
編譯完成後,開始安裝:
make mole_install
make install
然後添加引導信息,不過之前還是要裝一個組件initramfs-tools,裝完以後輸入:
mkinitramfs -o /boot/initrd.img-2.x.xx /lib/moles/2.x.xx
==================================================備注
後面的參數不要忘記了,否則啟動新內核會出現錯誤:
warning: couldn』t open directory /lib/moles/2.6.15.7-ubuntu1: no such file or directory
fatal: could not open /lib/moles/2.6.15.7-ubuntu1/moles.dep.temp for writing: no such file or directory
==================================================備注
最後打開 /boot/grub/menu.lst
在 ## ## end default options ## 下面添加類似下面的兩段
title ubuntu, kernel 2.6.19.2
root (hd0,4)
kernel /vmlinuz-2.6.19.2 root=/dev/hdd6
initrd /initrd.img-2.6.19.2
savedefault
boot

title ubuntu, kernel 2.6.19.2 (recovery mode)
root (hd0,4)
kernel /vmlinuz-2.6.19.2 root=/dev/hdd6 ro single
initrd /initrd.img-2.6.19.2
boot
注意 root和kernel欄位要模仿menu.lst下面已有的內容寫。下面是 (hd0,4),那麼你也寫(hd0,4),下面寫root=/dev/hdd6,你也寫root=/dev/hdd6,只是內核的版本號改為現在編譯的版本號。然後重新啟動計算機,在grub中選擇新內核啟動。如果啟動失敗,你可以重啟選擇老內核。

3. 如何將android linux燒到raspberry pi及其調試

一.raspberry pi入門向導。

可以在以下地址下載raspberry向導


2.構建android framework

命令如下:

cd

source build/envsetup.sh

lunch


顯示lunch菜單如下:

you』re building on linux


lunch menu… pick a combo:

1. full-eng

2. full_x86-eng

3. simulator

4. full_rpi-eng

5. cyanogen_generic-eng

6. cyanogen_rpi-eng

選擇第6個菜單。

然後進行編譯

make -j8

等待編譯成功,這可能需要幾十分鍾。


編譯成功之後將」system」目錄復制到root目錄下,接下來我們可能會用到。

命令如下:

cd

cp -r system out/target/proct/rpi/root


ps:編譯時如果jdk版本不對,可將其改成jdk1.6


五.如何在raspberry pi上跑android linux內核?


1.准備一張存儲空間2g以上的sd卡及相應讀卡器。


2.下載arch linux鏡像文件

用wget工具下載鏡像文件:

wget http://files.velocix.com/c1410/images/archlinuxarm/archlinux-hf-2012-09-18/archlinux-hf-2012-09-18.zip

解壓:

unzip archlinux-hf-2012-09-18.zip

成功之後,你會在當前目錄下發現一個鏡像文件。


3.燒linux鏡像文件。

sudo dd bs=4m if=archlinux-hf-2012-09-18.img of=/dev/sdb

sudo sync

ps:/dev/sdb是sd卡在主機上的設備文件。不同的電腦可能不同。


4.用android linux內核代替這個內核。

做完上述步驟之後,當你把sd卡插在電腦上,你會發現有兩個分區:一個是引導區,另一個是文件系統區。

用android linux內核代替引導區的kernel.img。

cp -uv /arch/arm/boot/zimage /kernel.img


5.用android linux文件系統代替這個linux文件系統

rm -rf

cp -r /out/target/proct/rpi/root/*


6.配置內核命令行cmdline.txt

edit the /cmdling.txt, and replace 「init=/…」 with 「init=/init」


7.做完這些之後就可以在raspberry pi上跑這個android linux內核。


六.如何為android linux做一張可引導的sd卡


1.刪除已有分區,如果沒有就不用刪了。

command(m for help):p


disk /dev/sdb: 15.7 gb, 15707668480 bytes

64 heads, 32 sectors/track, 14980 cylinders, total 30668085 sectors

units = sectors of 1 * 512 = 512 bytes

sector size (logical/physical): 512 bytes / 512 bytes

i/o size (minimum/optimal): 512 bytes / 512 bytes

disk identifier: 0×00000000


sudo fdisk/dev/sdb


command(m for help):d

partition number(1-4):1


command(m for help):d

selected partition 2


command (m for help): p


disk /dev/sdb: 15.7 gb, 15707668480 bytes

64 heads, 32 sectors/track, 14980 cylinders, total 30679040 sectors

units = sectors of 1 * 512 = 512 bytes

sector size (logical/physical): 512 bytes / 512 bytes

i/o size (minimum/optimal): 512 bytes / 512 bytes

disk identifier: 0×00000000

device boot start end blocks id system


command(m for help):w

ps:確定刪除之後,卸掉sd卡,然後再裝上。


以bytes問單位記下sd卡的大小。後面的步驟會用到。

然後進入」expert mode」。


command(m for help):x


將這個sd卡設置為255個磁面,63個扇區和磁柱數量(不同的sd/mmc卡有著不同的此柱數量)

expert command (m for help): h

number of heads (1-256, default 64): 255


expert command (m for help): s

number of sectors (1-63, default 32): 63


ps:在下一步開始前,先要計算磁柱數量,計算過程如下:

b:sd卡以bytes為單位的大小(前面已經記住了即:15707668480)

c:磁柱的數量

c=b/255/63/512


例如:我的sd卡大小是16g(15707668480)

c=15707668480/255/63/512=1909.68191721,約等於1909.


expert command (m for help): c

number of cylinders (1-1048576, default 14980): 1909

expert command (m for help): r


2.新建分區

如果你的sd卡已經分區,請按照上述步驟刪除分區。接下來,我們將創建兩個分區,一個是引導區,用來存放內核鏡像等文件;另一個文件系統區存放android linux文件系統。


command (m for help): n

partition type:

p primary (0 primary, 0 extended, 4 free)

e extended

select (default p): p

partition number (1-4, default 1):

using default value 1

first sector (2048-30679039, default 2048):

using default value 2048

last sector, sectors or size{k,m,g} (2048-30679039, default 30679039): 128m

command (m for help): t

selected partition 1

hex code (type l to list codes): c

changed system type of partition 1 to c (w95 fat32 (lba))

command (m for help): a

partition number (1-4): 1

command (m for help): n

partition type:

p primary (1 primary, 0 extended, 3 free)

e extended

select (default p): p

partition number (1-4, default 2):

using default value 2

first sector (264192-30679039, default 264192):

using default value 264192

last sector, sectors or size{k,m,g} (264192-30679039, default 30679039):

using default value 30679039

command (m for help): w

the partition table has been altered!

calling ioctl() to re-read partition table.

warning: if you have created or modified any dos 6.x

partitions, please see the fdisk manual page for additional

information.

syncing disks.


ok,分區成功,現在我們有兩個分區,接下我們對分區進行格式化。


3.格式化分區

對引導區進行格式化:


sudo mkfs.msdos -f 32 /dev/sdb1 -n boot

mkfs.msdos 3.0.12 (29 oct 2011)


對文件系統區進行格式化:

sudo mkfs.ext3 /dev/sdb2 -l rootfs

mke2fs 1.42 (29-nov-2011)

filesystem label=rootfs

os type: linux

block size=4096 (log=2)

fragment size=4096 (log=2)

stride=0 blocks, stripe width=0 blocks

950976 inodes, 3801856 blocks

190092 blocks (5.00%) reserved for the super user

first data block=0

maximum filesystem blocks=3896508416

117 block groups

32768 blocks per group, 32768 fragments per group

8128 inodes per group

superblock backups stored on blocks:

32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208

allocating group tables: done

writing inode tables: done

creating journal (32768 blocks): done

writing superblocks and filesystem accounting information: done


4.設置引導區

引導區必須包含以下文件,你可以從官方鏡像里獲取(bootable/fat32 partition)也可以從書面步驟中復制過來:

bootcode.bin:第二階段的引導程序,

loader.bin:第三階段的引導程序,

start.elf:gpu二進制固件映像,

kernel.img操作系統的內核鏡像文件,

cmdline.txt:傳遞給內核的參數.


5.設置root文件系統分區

rootfs分區包含android文件系統,是從/out/target/proct/rpi/root復制過來的。

cp -r /out/target/proct/rpi/root/* /media/rootfs/


6.完成上述步驟之後,將其放在raspberry pi上跑。


七.如何在raspberry pi使用adb?


1.查看網路

當android linux在raspberry pi運行時,切換到控制台,執行以下命令:

ifconfig eth0

記下ip地址。

如果不能找到ip,可以輸入以下命令:/system/xbin/dhcp-eth0,來啟動網路連接程序。

ps:如果屏幕沒有顯示控制台,只要按ctrl alt f2即可切換到控制台。如果你想要切換到android界面,只要按ctrl alt f7即可。


2.遠程連接adb伺服器

在主機上執行以下命令即可與同一區域網的raspberry pi相連

adb connect ip

連接成功後,你就可以用adb工具輸出日誌,執行shell命令等。


3.也可以用數據線連接主機,直接在主機上調試。

進入調試的命令為:

screen /dev/ttyusb0 115200


名詞解釋:

交叉編譯(cross compile):交叉編譯呢,簡單地說,就是在一個平台上生成另一個平台上的可執行代碼。這里需要注意的是所謂 平台,實際上包含兩個概念:體系結構(architecture)、操作系統(operating system)。同一個體系結構可以運行不同的操作系統;同樣,同一個操作系統也可以在不同的體系結構上運行。舉例來說,我們常說的x86 linux平台實際上是intel x86體系結構和linux for x86操作系統的統稱;而x86 winnt平台實際上是intel x86體系結構和windows nt for x86操作系統的簡稱。

4. 整體編譯android系統,大家用了多少時間

我自己實際編譯ics4.0.4源碼情況:acer台式機,3.2ghz cpu,4核,8gb/1600hz內存,整體編譯(含u-boot、kernel、boot.img和system.img)需要1小時10分鍾。編譯時,使用make -j8(因為硬體cpu是4線程的,故使用2倍線程數)。之後的增量編譯,一般需要5~10分鍾即可。

5. android開機速度優化初探

android的開機速度,基本上沒人說快的,通常移植完系統後,馬上要看的事情就是優化開機時間,以下是簡單回憶以下以前做優化的那些事。

優化開機時間,通常做的首先是那有有沒有bug,明顯不合理的先解決,由於開發階段穩定性臘擾帶問題,一些地方可能延時加的大,或者頻率設的低,先記下來,後面定期還會再看。這些先不看的話,一般拿到機器,我們統計開機時間,主要看如下幾個時間段分布:

開機按鍵時間、亮屏時間(基本固定,除非弄錯了,基本檢查一遍確定)

uboot啟動時間

內核啟動後到bootanim退出時間

可以通過添加列印mole init的李汪log,來check每個mole初始化時的時間。從而找到花費時間比較多的mole:

--- a/init/main.c

b/init/main.c

@@-785,7 785,7@@int__init_or_mole

do_one_initcall(initcall_tfn)

if(initcall_blacklisted(fn))

return

-eperm;

-if(initcall_debug)

if(1)

                ret =

do_one_initcall_debug(fn);

-3 優化建議:

preloadclasses()與preloadresources()可以放到兩個線程裡面跑。

修改zygote的nice值,及thread priority。

http://androidxref.com/6.0.1_r10/xref/frameworks/base/core/java/com/android/internal/os/zygoteinit.java#590

中增加如下的修改:

在  eventlog . writeevent ( log_boot_progress_preload_start , 592 systemclock . uptimemillis ()); 593 preload (); 594 eventlog . writeevent ( log_boot_progress_preload_end , 595 systemclock . uptimemillis ()); 前增加修改

/* 20151013 optimize android boot begin */

//get the default priority.

int defaultpriority = process.getthreadpriority(process.mypid()) ;

//increase the priority .

process.setthreadpriority(process.thread_priority_audio) ;

在 gcandfinalize (); 增加

process.setthreadpriority(defaultpriority) ;

/*  20151013 optimize android boot end */

-2 系統剪裁也有助於提高系統輪蘆的開機速度

提升cpu頻率 - 將所有cpu切換至性能模式

adb shell stop perf-hal-1-0

adb shell "echo 1 > /sys/devices/system/cpu/cpu0/online"

adb shell "echo 1 > /sys/devices/system/cpu/cpu1/online"

adb shell "echo 1 > /sys/devices/system/cpu/cpu2/online"

adb shell "echo 1 > /sys/devices/system/cpu/cpu3/online"

adb shell "echo 1 > /sys/devices/system/cpu/cpu4/online"

adb shell "echo 1 > /sys/devices/system/cpu/cpu5/online"

adb shell "echo 1 > /sys/devices/system/cpu/cpu6/online"

adb shell "echo 1 > /sys/devices/system/cpu/cpu7/online"

adb shell "echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor"

adb shell "echo performance > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor"

adb shell "echo performance > /sys/devices/system/cpu/cpu2/cpufreq/scaling_governor"

adb shell "echo performance > /sys/devices/system/cpu/cpu3/cpufreq/scaling_governor"

adb shell "echo performance > /sys/devices/system/cpu/cpu4/cpufreq/scaling_governor"

adb shell "echo performance > /sys/devices/system/cpu/cpu5/cpufreq/scaling_governor"

adb shell "echo performance > /sys/devices/system/cpu/cpu6/cpufreq/scaling_governor"

adb shell "echo performance > /sys/devices/system/cpu/cpu7/cpufreq/scaling_governor"

adb shell "echo performance > /sys/class/devfreq/soc:qcom,cpubw/governor"

adb shell "echo performance > /sys/class/devfreq/soc:qcom,mincpubw/governor"

adb shell "echo performance > /sys/class/devfreq/soc:qcom,memlat-cpu0/governor"

adb shell "echo performance > /sys/class/devfreq/soc:qcom, memlat-cpu6/governor"

提升gpu頻率

adb shell "echo 0 > /sys/class/kgsl/kgsl-3d0/min_pwrlevel"

adb shell "echo 1 > /sys/class/kgsl/kgsl-3d0/force_clk_on"

adb shell "echo performance > /sys/class/kgsl/kgsl-3d0/devfreq/governor"

-1 電源優化

on init

    # disable ufs powersaving

    write /sys/devices/soc/${ro.boot.bootdevice}/clkscale_enable 0

    write /sys/devices/soc/${ro.boot.bootdevice}/clkgate_enable 0

    write /sys/devices/soc/${ro.boot.bootdevice}/hibern8_on_idle_enable 0

    write /sys/mole/lpm_levels/parameters/sleep_disabled y

on property:sys.boot_completed=1

    # enable ufs powersaving

    write /sys/devices/soc/${ro.boot.bootdevice}/clkscale_enable 1

    write /sys/devices/soc/${ro.boot.bootdevice}/clkgate_enable 1

    write /sys/devices/soc/${ro.boot.bootdevice}/hibern8_on_idle_enable 1

    write /sys/mole/lpm_levels/parameters/sleep_disabled n

on charger

    # enable ufs powersaving

    write /sys/devices/soc/${ro.boot.bootdevice}/clkscale_enable 1

    write /sys/devices/soc/${ro.boot.bootdevice}/clkgate_enable 1

    write /sys/devices/soc/${ro.boot.bootdevice}/hibern8_on_idle_enable 1

    write /sys/class/typec/port0/port_type sink

    write /sys/mole/lpm_levels/parameters/sleep_disabled n

0 bootgraph 用來分析內核功能, 在kernel cmdline 增加 initcall_debug ,然後dmesg > boot.log  bootgraph.pl boot.log >  boot.svg

1通過一個比gzip更快的方式去解壓內核鏡像;

2 去掉系統中一些不必要的log列印;

3 去掉一些系統中不需要的驅動模塊;

4 啟動時即以最大頻率(cpu/ddr)且多核一起跑;

5 將一些耗時大,對啟動順序沒有要求的驅動通過非同步方式進行載入(如下所示)

這里我們主要關注的是第三個,也是優化的重點。這部分時間,具體都在幹啥,瓶頸是哪,可以通過bootchart很清楚的看到。以下結合以前抓的圖,簡要說一下(圖是很久之前抓的,比較懶,沒有再跑一遍過程)

上圖中bootanim的退出時間沒有截出來,實際圖是有的,大約是33s的時候結束。

這里分析時,我們是分了幾個時間段:

1 內核開始啟動,到init進程開始執行。這個可以通過log看到。

2 init進程執行,主要是處理init.rc中的命令,到core和mainl類服務開始啟動的時間,上圖中可以看到,服務大體都在一個時間點起來的,約7.5s時,這之前的一大段空窗期,也是要重點看的

3 zygote啟動時間

4 systemserver中各個服務啟動時間

5 應用啟動(systemui/launcher/keyguard..)

以上,具體分析看每段時間:

第一點另外處理,具體分析列印看是否有異常,這個值一般是很小的,不合理要和bsp同事一起查一下原因。

第二個主要是init.rc執行各種命令,這個可以通過在execute_one_command函數中統計測量 ,比如大於100ms的命令列印出來,再分析定位原因,這里命令執行時間長基本算bug,要和bsp工程師一起解決。

第三點主要zygote啟動問題,主要慢的原因,是載入資源和類庫,這個要讀nand,一般卡的時間比較長,圖中可以看到,zygote進程一溜的小粉紅,說明io較多。這個preload過程消耗的時間,在logcat的log中,也會列印的,一般來說,都是在近10s左右。

第四個,zygote初始化完後,會fork system_server。 system_server進程啟動,耗時也是較長的。根據以前統計分析的結果,這里的服務啟動,基本上都是花在packagemanagerservice的packagescan中,這又是一個讀文件,卡在文件讀取中,時間長短,和預制app及安裝的app數量有關

第五個時間,是基本都准備ready後,啟動launcher等應用了,啟動完成後,systemserver請求surfaceflinger殺了bootanimation,就啟動完成了。

以上時間中,主要要優化的,還是第三步和第四步的io慢問題,其他可優化的不多。比如cpu,常開四核performance模式啟動,也並沒提升多少,一般我們就不管了這個了。

咋優化?

確定優化方向後主要看怎麼優化這兩段耗時的地方:

1. zygote的preload 資源和class

2. packagemanagerservice的包掃描

這里的第一個,最早之前有人直接是去掉preload或刪減,雖然可以加快一點開機速度,但是撿了芝麻丟了西瓜,根本不能這樣干~

我們最早做的實現方式,

2.1 是將preload做並行處理,畢竟現在都是多核處理器了,而且是preload是載入後還要解析處理的,並行會有一定幅度提升。

對於包掃描,這個不好拆成並行任務,不像preload那麼簡單干凈。考慮過將packagemanager的信息序列化後存起來,下次開機就不掃了,不過看起來改動有點大,不太好搞,也放棄了。

packagemanagerservice掃描、檢查apk安裝包信息

2.2 pms對/system/framework,/system/app,/data/app,/data/app-private目錄中的apk掃描耗費了大量的時間,如果預置的三方應用很多,這樣啟動的時間就會越長。

優化建議:

2.3 /system/app下的應用,如果是預置應用,在android.mk建議加上local_dex_preopt := true控制,在/system/vendor下的預置應用,如果此應用編譯時間比較長的,也使用上local_dex_preopt := true

2.4 盡量減少data區內置app的數量,這個會嚴重影響開機速度,特別是第一次的開機速度。放在system的app 盡量生成odex 這樣會加快開機速度。

最後我們的實現的方式,就是linux上用的較多的readahead機制。具體實現細節就不展開說了,原理就是:

1. 統計開機過程中,讀取的塊數據信息,記錄下來保存

2.再次開機,通過記錄下來的塊數據讀取信息,直接起一個服務,預先開始讀,zygote或packagemanagerservice要讀文件的時候,文件數據已經在cache中了。

實際用下來,這一招特別好,優化非常明顯。以下是實現了一個readahead後的bootchart圖:

可以看到:

1. zygote和system_server都提速了

2. zygote和system_server的io時間,都降低非常大

3. 主要io時間,跑到readahead進程中去了。

不過,以上實現,還是有可優化的地方:

1. readahead進程可以再提前,在system分區掛載後立刻啟動,這樣zygote中的io應該可以再減小

2. 對system_server的io,此時readahead已經結束了,按理不應該有了,這里還是有io,這一般是後裝apk導致,這個可以把readahead做的更健壯一些,不要只學習開始的一兩次。

其他nb的優化

另外還有一個很nb的技術,就是std。這個我們也搞過,花費了大量的人力物力。std開機時間,不算上uboot時間的話,基本都是在10s內,5~8s之間。不過這么nb的技術,目前基本上也是廢棄了,用起來問題也挺多的:

1. 開機時間少了,關機時間拉長。

由於是std(suspend to disk),關機時需要將內存數據寫入nand,這塊也是挺麻煩的事情

2. 穩定性

本身std弄起來就比較復雜,bug挺多的,另外使用std,就相當於永不關機了,這也太考驗系統軟體的穩定性了...

3. 沒毛用

   一開始還能忽悠客戶,不過後來也沒人怎麼關心這個feature了,平白給自己找活干,大家都不樂意使能它了。

6. idea設置springboot啟動jvm參數

idea設置springboot啟動jvm參數,設置方式,通過ldea設置,編輯配置文件。參數說明參數說明-xms初始化堆內存大小,eg.-xms1g-xmx堆內存最大值,eg.-xms1g,通常與-xms設置相同的值-xx:reservedcodecachesize代碼緩存,它是用來存儲已編譯方法生成的本地代碼。代碼緩存確實很少引起性能問題,但是一旦發生其影響可能是毀滅性的。如果代碼緩存被占滿,jvm會列印出一條警告消息,並切換到interpreted-only模式:jit編譯器被停用,位元組碼將不再會被編譯成機器碼。因此,應用程序將繼續運行,但運行速度會降低一個數量級,直到有人注意到這個問題。就像其他內存區域一樣,我們可以自定義代碼緩存的大小。它們的參數都eg.-xx:reservedcodecachesize=240m-xx:initialc查看更多。

熱點內容
發布:2024-01-20 01:08:21 瀏覽:525
發布:2024-01-20 01:07:17 瀏覽:250
愛奇藝正義聯盟為啥不能緩存 發布:2024-01-20 00:52:13 瀏覽:248
caccess查詢資料庫 發布:2024-01-20 00:43:10 瀏覽:769
xp文件夾圖標更改 發布:2024-01-20 00:43:03 瀏覽:19
python和node 發布:2024-01-20 00:37:12 瀏覽:194
android拖拉 發布:2024-01-20 00:00:49 瀏覽:583
少兒編程課程體系介紹 發布:2024-01-20 00:00:48 瀏覽:846
我說你做下載ftp 發布:2024-01-20 00:00:47 瀏覽:8
安卓驅動培訓哪裡好 發布:2024-01-19 23:55:41 瀏覽:987
网站地图