




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、嵌入式系統(tǒng)項(xiàng)目報(bào)告項(xiàng)目名稱: 基于 DM3730的Android系統(tǒng)啟動(dòng)過程分析和 Logo移植i1. 項(xiàng)目開發(fā)目的本次項(xiàng)目研究和開發(fā)的主要目的如下:(1) 基于DM3730處理器研究Android系統(tǒng)的啟動(dòng)過程及其主要流程;(2) 基于Android系統(tǒng)的啟動(dòng)流程init進(jìn)程深入理解。(3) 移植Android系統(tǒng)啟動(dòng)過程中的Logo和相關(guān)動(dòng)畫;(4) 修改Android系統(tǒng)的指定桌面,讓系統(tǒng)啟動(dòng)后直接跳入自己的開發(fā) 的應(yīng)用程序。2. 項(xiàng)目開發(fā)內(nèi)容本次項(xiàng)目需要完成的主要內(nèi)容有如下幾點(diǎn):(1) 在Ubuntu11.04上下載Android專用源碼,完成 Android系統(tǒng)的軟 件開發(fā)環(huán)境的搭建
2、;(2) 在EVM37x開發(fā)板上搭建Android系統(tǒng)的硬件開發(fā)環(huán)境;(3) Android系統(tǒng)的init進(jìn)程和init.rc文件簡(jiǎn)單解析;(4) Android系統(tǒng)啟動(dòng)的動(dòng)畫和 Logo的修改;(5) Android系統(tǒng)桌面源碼的修改,實(shí)現(xiàn)直接調(diào)入自己的應(yīng)用程序。3. 項(xiàng)目開發(fā)軟硬件設(shè)備(1) 硬件平臺(tái):TI高性能處理器DM3730 , TI核心開發(fā)板EM/AM37xx EVM板(2) 操作系統(tǒng):Android ICS4.0.3(3) PC端的開發(fā)平臺(tái):Ubuntu11.04(4) 開發(fā)所需的IDE : TI集成開發(fā)環(huán)境CCS5.14. 項(xiàng)目開發(fā)流程4.1項(xiàng)目開發(fā)前期準(zhǔn)備4.1.1 Andr
3、oid源碼下載和編譯本項(xiàng)目是在Ubuntu宿主機(jī)上完成Android源碼的下載和編譯。在此之前 需要完成以下工作,主要包括各種Android開發(fā)所需的插件,編譯時(shí)所需的基礎(chǔ)庫(kù)以及開發(fā)調(diào)試的minicom終端等。sudo add-apt-repository "deb lucid partner" sudo add-apt-repository "deb-src lucid partner"sudo apt-get updatesudo apt-get install git-core gnupg sun-java6-jdk flex bison gper
4、f libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev minicom tftpd uboot-mkimage expectsudo update-java-alternatives -s java-6-sun下載Android源碼的過程和命令:repo init -u git://rowboat/manifest.git -m init -ugit://rowboat/manifest.git -m TI-And
5、roid-ICS-4.0.3-DevKit-3.0.0.xml repo sync./.repo/repo/repo sync -local-onlyAndroid源碼的編譯:包括環(huán)境變量的設(shè)定,x-loader、u-boot、Linux Kernel 以及Android文件系統(tǒng)。環(huán)境變量:exportPATH=source/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:$PATHx-loader 編譯:make CROSS_COMPILE=arm-eabi- distcleanmake CROSS_COMPILE=arm-eabi- omap
6、3evm_configmake CROSS_COMPILE=arm-eabi-u-boot 編譯:make CROSS_COMPILE=arm-eabi- distcleanmake CROSS_COMPILE=arm-eabi- omap3_evm_configmake CROSS_COMPILE=arm-eabi-Linux Kernel 編譯:make ARCH=arm CROSS_COMPILE=arm-eabi- distcleanmake ARCH=armCROSS_COMPILE=arm-eabi-omap3_evm_android_defconfigAndroid文件系統(tǒng)編譯:
7、make TARGET_PRODUCT=omap3evm OMAPES=5.x -j8整個(gè)系統(tǒng)編譯過程約3個(gè)小時(shí)左右,占用空間達(dá)12G,因此對(duì)PC機(jī)的 要求較高。Android文件系統(tǒng)制作:cd /home/gzz/DM3730/source/out/target/product/omap3evmcp -r root/* android_rootfs/cp -r system android_rootfs././././build/tools/mktarball.sh./././host/linux-x86/bin/fs_get_statsandroid_rootfs . rootfs roo
8、tfs.tar.bz2到此為止,整個(gè)Android系統(tǒng)的各個(gè)部分都編譯和制作完成。4.1.2 EVM板硬件環(huán)境的搭建這里說的硬件開發(fā)環(huán)境的搭建,主要是指將上述編譯好的 Android系統(tǒng) 所需的xloader、u-boot、Linux kernel和文件系統(tǒng)鏡像通過tftp協(xié)議下載到 Linux 的 NandFlash 上去。使用如下命令進(jìn)行鏡像文件的燒錄:OMAP3_EVM # tftp 0x80000000 MLOOMAP3_EVM # nand erase 0x0 0x50000OMAP3_EVM # nandecc hw 2OMAP3_EVM # nand write 0x800000
9、00 0x0 0x50000通過以上主要內(nèi)容,順利完成項(xiàng)目開發(fā)所需的軟硬件開發(fā)環(huán)境的搭建, 為后續(xù)項(xiàng)目的順利進(jìn)行打下了良好的基礎(chǔ)。44.2 Android啟動(dòng)init進(jìn)程和init.rc文件的解析Android中的內(nèi)核啟動(dòng)后,kernel會(huì)啟動(dòng)第一個(gè)用戶級(jí)別的進(jìn)程:init, 它是一個(gè)由內(nèi)核啟動(dòng)的用戶級(jí)進(jìn)程。內(nèi)核自行啟動(dòng)(已經(jīng)被載入內(nèi)存,開始 運(yùn)行,并已初始化所有的設(shè)備驅(qū)動(dòng)程序和數(shù)據(jù)結(jié)構(gòu)等)之后,就通過啟動(dòng)一 個(gè)用戶級(jí)別的進(jìn)程,完成系統(tǒng)的引導(dǎo)。init始終是第一個(gè)進(jìn)程,位丁 /sbin/init 下面。而init.rc是init進(jìn)程啟動(dòng)讀取的第一個(gè)文件,該文件時(shí)一個(gè)配置 Android 系統(tǒng)所
10、需要啟動(dòng)的服務(wù)和相關(guān)Android應(yīng)用程序最初始化的配置。因?yàn)樗cAndroid啟動(dòng)的界面有直接的聯(lián)系,所以為了項(xiàng)目的順利進(jìn)行, 有必要先對(duì)其進(jìn)行理解和熟悉。分析init進(jìn)程需要結(jié)合init.rc進(jìn)行,在這里主要通過分析部分代碼,做 合理的解釋。Init進(jìn)程的源代碼位丁 Android源碼的system/core/init/init.c下 面,由丁代碼過丁龐大這里不在粘貼。1. uevent 進(jìn)程if (!strcmp(basename(argv0), "ueventd")return ueventd_main(argc, argv);這個(gè)函數(shù)是取出 argv中的第一個(gè)參數(shù)
11、,比如 /sbin/ueventd ,貝U basename 為 ueventd 。 android系統(tǒng)第一次啟動(dòng)的進(jìn)程名init,所以該函數(shù)ueventd_main 不執(zhí)行,該函數(shù)的真正執(zhí)行在 init啟動(dòng)service ueventd /sbin/ueventd 后,fork出一個(gè)子進(jìn)程, execve啟動(dòng)/sbin/ueventd 后,實(shí)際上該函數(shù)是對(duì) init的符合鏈接,也就是 ueventd 進(jìn) 程執(zhí)行起來后執(zhí)行的代碼還是init.c中的main,因此不同的進(jìn)程名會(huì)去執(zhí)行相同的main函數(shù)。ueventd_main函數(shù)的主要功能:在Linux系統(tǒng)中現(xiàn)在都使用 uevent機(jī)制來管理設(shè)
12、備的 熱插拔事件,給用戶空間權(quán)利來完成一些設(shè)備文件節(jié)點(diǎn)的創(chuàng)建。這種機(jī)制是建立 在socket的通信機(jī)制上,用戶空間和內(nèi)核驅(qū)動(dòng)進(jìn)行交互,詳細(xì)的機(jī)制沒有去了解過。是linux2.6的版本中常用的機(jī)制。比如驅(qū)動(dòng)出現(xiàn)device_create等時(shí),會(huì)向用戶空間報(bào)告一個(gè)uevent事件,用戶空間由uevent進(jìn)程解析后去創(chuàng)建設(shè)備節(jié)點(diǎn)。2.init.rc的解析INFO("reading config filen");init_parse_config_file("/init.rc");init.rc是一個(gè)配置文件,內(nèi)部有許多的語言規(guī)則,所有語言會(huì)在init_pars
13、e_config_file中進(jìn)行解析。調(diào)用流程如下init_parse_config_file >read_file >parse_config.parse_config (源代碼略)。通過對(duì)這個(gè)文件的解析,會(huì)啟動(dòng) Android的應(yīng)用程序,使得 Android進(jìn)入Java的世界54.3 Android啟動(dòng)Log。和動(dòng)畫移植在這里主要對(duì)Android系統(tǒng)的3個(gè)畫面進(jìn)行移植,一是 Linux內(nèi)核在啟 動(dòng)加載Frambuffer幀緩沖驅(qū)動(dòng)時(shí)會(huì)調(diào)用一個(gè)函數(shù)完成Linux的Logo圖標(biāo)的顯示。二是Android的第一個(gè)init用戶進(jìn)程啟動(dòng)會(huì)調(diào)用函數(shù)完成一個(gè)圖片的 顯示。三是 Android
14、系統(tǒng)中Java應(yīng)用程序啟動(dòng)時(shí)顯示出來的動(dòng)畫效果 bootanimation 。4.3.1 Android啟動(dòng)第一個(gè) Logo圖標(biāo)移植Android系統(tǒng)是基丁 Linux內(nèi)核設(shè)計(jì)而成的,Linux下使用幀緩沖 (Framebuffer)的概念來表示一個(gè)顯示接口,通俗理解就表示一塊 LCD。幀 緩沖區(qū)的相關(guān)驅(qū)動(dòng)在內(nèi)核啟動(dòng)時(shí)調(diào)用fbmem_init,在該函數(shù)中主要完成使用register_chrdev來注冊(cè)了一個(gè)名稱為fb的字符設(shè)備,最后調(diào)用函數(shù)class_create 在/sys/class目錄下創(chuàng)建了一個(gè)graphics目錄等。同樣的驅(qū)動(dòng)加載中會(huì)調(diào)用硬 件平臺(tái)相關(guān)LCD的驅(qū)動(dòng)初始化函數(shù)omapf
15、b_init。這個(gè)函數(shù)會(huì)針對(duì)對(duì)個(gè)fb,完成相關(guān)節(jié)點(diǎn)的創(chuàng)建在/dev/graphics/fb0,fb1.等。主設(shè)備號(hào)為29 一旦完成創(chuàng)建,會(huì)調(diào)用fb_notifier_call_chain,函數(shù)通知 控制fb的console理解為控制臺(tái)).每一個(gè)fb都會(huì)對(duì)應(yīng)丁一個(gè)console來控制。 而Logo的顯示啟動(dòng),就是在 fbcon_init和fbcon_switch中來完成的。在 fbcon_init中使用fbcon_prepare_logo函數(shù)準(zhǔn)備需要顯示的 Log。數(shù)據(jù)源,在 fbcon_switch 使用 fb_show_logo 來顯示 Logo。本項(xiàng)目中需要將一張Jpg的圖片作為L(zhǎng)ogo樣
16、式的圖標(biāo)顯示在LCD上面。 實(shí)現(xiàn)的步驟如下:1. 為了能讓這部分的 Logo圖標(biāo)能夠正常顯示,需要在編譯時(shí)對(duì).config 文件添加一定的配置:CONFIG_FRAMEBUFFER_CONSOLECONFIG_LOGOCONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY完成這些配置之后的Logo才可以正常顯示,否則內(nèi)核在啟動(dòng)驅(qū)動(dòng)加載 時(shí),顯示Logo圖標(biāo)的函數(shù)不會(huì)執(zhí)行相關(guān)的操作。2. jpg圖標(biāo)的格式轉(zhuǎn)換。Linux啟動(dòng)圖標(biāo)格式不直接支持jpg格式,主要支持ppm、pbm格式的圖 像文件,因此需要先將圖像進(jìn)行適當(dāng)?shù)霓D(zhuǎn)換:1)使用gimp image軟件隨意修改圖片
17、的像素大小2) 使用終端命令完成 convert xxx.jpg xxx.png3) 使用如下命令完成最終的轉(zhuǎn)換(被轉(zhuǎn)換的文件必須是png格式)# pngtopnm xxx.png > xxx.pnm# pnmquant 224 xxx.pnm > xxx224.pnm最終生成一張xxxx224.pnm格式的圖像文件。完成圖片的準(zhǔn)備工作后,需要修改部分Linux內(nèi)核的源碼,具體的操作如下進(jìn)行:a. 對(duì)Makefile文件做一定的修改添加如下內(nèi)容:obj-$(CONFIG_LOGO_ICS_CLUT224) +=logo_ics_clut224.b. 對(duì)logo.c等源文件做一定的修
18、改添加如下內(nèi)容:#ifdef CONFIG_LOGO_ICS_CLUT224logo = &logo_ics_clut224; /gzzprintk("depth=%d,logo=logo_ics_clut224n”,depth);/by gzz#endifc. 修改部分代碼讓圖片顯示在 LCD在正中問主要修改部分在fb_show_logo_line,這個(gè)函數(shù)實(shí)現(xiàn)Logo圖標(biāo)的完全顯 示。image.dx = 0;image.dy = y;image.dx = (info->var.xres/2) -(logo->width/2);image.dy = (info
19、->var.yres/2) -(logo->height/2); /by gzzimage.width = logo->width;/140image.height = logo->height;/153在這個(gè)函數(shù)中,要顯示的圖像信息都保存在里image結(jié)構(gòu)體中,同時(shí)Logo 圖像顯示的右上角放在image.dx,image.d焰?zhèn)€坐標(biāo)上。這里可以通過修改這 對(duì)坐標(biāo)值,完成位置的修改。比如這里配置的是顯示在LCD(480*640)的正中 問。通過以上a,b.c三個(gè)步驟可以實(shí)現(xiàn)將任意一張圖片作為L(zhǎng)ogo圖像顯示在自己的LCD上,給出一個(gè)良好的用戶效果。74.3.2 And
20、roid啟動(dòng)第二個(gè)圖標(biāo)移植第二個(gè)圖標(biāo)的顯示主要和init進(jìn)程有關(guān)系。在init進(jìn)程中會(huì)有一個(gè) console_init_action函數(shù)來完成這個(gè)圖標(biāo)的顯示,這里直接給出部分代碼來解 析如下:static int console_init_action(int nargs, char *args)(int fd;char tmpPROP_VALUE_MAX;if (console0) snprintf(tmp, sizeof(tmp), "/dev/%s", console);console_name = strdup(tmp);fd = open(console_name
21、, O_RDWR);if (fd >= 0)have_console = 1;close(fd);if( load_565rle_image(INIT_IMAGE_FILE) ) fd = open("/dev/tty0”, O_WRONLY);if (fd >= 0) const char *msg;msg = "n""n""n""n""n""n""n" / console is 40 cols x 30 lines"n&
22、quot;"n""n""n""n""n""n""A N D R O I D "write(fd, msg, strlen(msg);close(fd);return 0;8a初始化控制臺(tái)。init進(jìn)程在啟動(dòng)的時(shí)候,會(huì)解析內(nèi)核的啟動(dòng)參數(shù)(保存 在文件/proc/cmdline中)。如果發(fā)現(xiàn)內(nèi)核的啟動(dòng)參數(shù)中包含有了一個(gè)名稱為 “androidboot.consoie勺屬性,那么 就會(huì)將這個(gè)屆性 的值保存在字符數(shù)組 console中。這樣我們就可以通過設(shè)備文件
23、/dev/<console球訪問系統(tǒng)的控制 臺(tái)。如果內(nèi)核的啟動(dòng)參數(shù)沒有包含名稱為“androidboot.consoie勺屬性,那么默認(rèn)就通過設(shè)備文件/dev/console來訪問系統(tǒng)的控制臺(tái)。如果能夠成功地打開 設(shè)備文件/dev/<console城者/dev/console,那么就說明系統(tǒng)支持訪問控制臺(tái), 因此,全局變量have_console6勺就會(huì)被設(shè)置為1。b. 顯示第二個(gè)開機(jī)畫面。顯示第二個(gè)開機(jī)畫面是通過調(diào)用函數(shù) load_565rle_image來實(shí)現(xiàn)的。在調(diào)用函數(shù)load_565rle_image的時(shí)候,指定的 開機(jī)畫面文件為INIT_IMAGE_FILE。INIT_
24、IMAGE_FILE 是一個(gè)宏,定義在 system/core/init/init.h 文件中,如下所示:#define INIT_IMAGE_FILE "/initlogo.rle"圖像文件initlogo.rle保存的第二個(gè)開機(jī)畫面的圖像格式是565rle的。rle的全稱是run-length encoding,翻譯為游程編碼或者行程長(zhǎng)度編碼,它可以使 用4個(gè)字節(jié)來描述一個(gè)連續(xù)的具有相同顏色值的序歹0。在 rle565格式,前面 2個(gè)字節(jié)中用來描述序列的個(gè)數(shù),而后面2個(gè)字節(jié)用來描述一個(gè)具體的顏色, 其中,顏色的RGB值分別占5位、6位和5位。c. 制作initlogo.
25、rle文件。準(zhǔn)備一張png格式的文件,使用Ubuntu自帶的 圖片轉(zhuǎn)換工具執(zhí)行如下命令:convert -depth 8 android_logo.png rgb:android_logo.raw使用 android編譯后的 rgb2565工具,在 android/out/host/linux-x86/bin 目 錄下(android為當(dāng)前源碼所在目錄),轉(zhuǎn)換命令如下:rgb2565 -rle < android_logo.raw > initlogo.rle 0通過以上步驟就完成了代碼的移植和圖片的制作,最后只需要將 initlogo.rle文件拷貝到Android的文件系統(tǒng)下面
26、,重新啟動(dòng)就可以看到圖片 的正常顯示。4.3.3 Android啟動(dòng)第三個(gè)動(dòng)畫移植考慮到第三個(gè)啟動(dòng)的動(dòng)畫位于 Android的Java層,因此代碼量相當(dāng)龐大, 因此只寫如何替換啟動(dòng)動(dòng)畫來實(shí)現(xiàn)我們預(yù)期的效果。第三個(gè)開機(jī)畫面是由應(yīng)用程序bootanimation來負(fù)責(zé)顯示的。應(yīng)用程序bootanimation在啟動(dòng)腳本init.rc中被配置成了一個(gè)服務(wù),如下所示:.service bootanim /system/bin/bootanimationuser graphicsgroup graphicsdisabledoneshot應(yīng)用程序bootanimation的用戶和用戶組名稱分別被設(shè)置為gr
27、aphics注意,用來啟動(dòng)應(yīng)用程序bootanimation的服務(wù)是disable的,即init進(jìn)程在啟 動(dòng)的時(shí)候,不會(huì)主動(dòng)將應(yīng)用程序bootanimation啟動(dòng)起來。當(dāng)SurfaceFlinger服務(wù)啟動(dòng)的時(shí)候,它會(huì)通過修改系統(tǒng)屆性ctl.start的值來通知init進(jìn)程啟動(dòng)應(yīng) 用程序bootanimation,以便可以顯示第三個(gè)開機(jī)畫面, 而當(dāng)System進(jìn)程將系 統(tǒng)中的關(guān)鍵服務(wù)都啟動(dòng)起來之后,ActivityManagerService服務(wù)就會(huì)通知 SurfaceFlinger服務(wù)來修改系統(tǒng)屆性ctl.stop的值,以便可以通知init進(jìn)程停止 執(zhí)行應(yīng)用程序bootanimation,
28、即停止顯示第三個(gè)開機(jī)畫面。Android的所有版本都可以添加一個(gè)bootanimation.zip文件。內(nèi)容包括part文件夾 和desc.txt。前者的文件夾下面存放的是連續(xù)的png格式文件,后者desc.txt里面是播放信息設(shè)置,其內(nèi)容和格式如下: 480 720 15 p 1 0 part1 p 0 0 part2其中480 800是指顯示的分辨率寬和高,15是圖像播放的幀數(shù)。p后面 的數(shù)字分別指播放次數(shù) 0和播放時(shí)間。Android系統(tǒng)啟動(dòng)時(shí)會(huì)文件系統(tǒng)如下目錄查找:#defineUSER_BOOTANIMATION_FILE "/data/local/bootanimatio
29、n.zip" #defineSYSTEM_BOOTANIMATION_FILE "/system/media/bootanimation.zip"只需要將制作好的動(dòng)畫文件放到指定的目錄即可實(shí)現(xiàn)自己設(shè)計(jì)的美觀 的動(dòng)畫以替換默認(rèn)的開機(jī)畫面。到此為止,完成項(xiàng)目所需完成的主要內(nèi)容:移植完成了三個(gè)動(dòng)畫來替換 系統(tǒng)自帶的圖片,使得產(chǎn)品可以實(shí)現(xiàn)更加友好的用戶界面,提高產(chǎn)品的銷量。4.3.4 Android桌面移植這部分的內(nèi)容主要是完成 Android系統(tǒng)啟動(dòng)桌面進(jìn)程的移植,目的是講 這個(gè)默認(rèn)的桌面進(jìn)程修改為自己所設(shè)計(jì)的應(yīng)用進(jìn)程,使得用戶在使用Android終端設(shè)備是可以直接進(jìn)入自行設(shè)計(jì)的應(yīng)用操作界面。既然是移植桌面系統(tǒng),那么需要修改的就是桌面的源碼,閱讀 Android 系統(tǒng)龐大的源碼,可以發(fā)現(xiàn)Android源碼的Home應(yīng)用程序就是Launcher進(jìn) 程。Android系統(tǒng)中的應(yīng)用程序安裝好了以后,SystemServerffl件接下來就要 通過 ActivityManagerService 來啟動(dòng) Home 應(yīng)用程序 Launcher 了,Launcher 在啟動(dòng)的時(shí)候便會(huì)通過PackageManagerServicJE系統(tǒng)中已經(jīng)安裝好的應(yīng)用程 序以快捷圖標(biāo)的形式展示在桌面上,這樣用戶就可以使用這些應(yīng)用程序了。既然作為Home應(yīng)用程序有這樣的優(yōu)先級(jí)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國(guó)服裝里料數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025-2030年中國(guó)中藥制劑行業(yè)“十三五”發(fā)展規(guī)劃及投資前景研究報(bào)告
- 2025年中國(guó)曲柄治具市場(chǎng)調(diào)查研究報(bào)告
- 2025年中國(guó)景泰藍(lán)工藝擺件數(shù)據(jù)監(jiān)測(cè)報(bào)告
- 2025年中國(guó)斷電型限時(shí)繼電器數(shù)據(jù)監(jiān)測(cè)報(bào)告
- 2025年中國(guó)數(shù)字式風(fēng)機(jī)盤管恒溫器市場(chǎng)調(diào)查研究報(bào)告
- 2025至2031年中國(guó)綜合信息集成系統(tǒng)行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025至2031年中國(guó)網(wǎng)絡(luò)數(shù)字硬盤錄像系統(tǒng)行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025至2031年中國(guó)純天然菊花濃縮汁行業(yè)投資前景及策略咨詢研究報(bào)告
- 肇慶市實(shí)驗(yàn)中學(xué)高中歷史三:第課理性之光教案
- 頌缽療愈師培訓(xùn)
- 華為戰(zhàn)略解碼解讀
- 莊子課件完整版本
- 2024年重慶市中考英語試卷(AB合卷)附答案
- 敘事護(hù)理學(xué)智慧樹知到答案2024年中國(guó)人民解放軍海軍軍醫(yī)大學(xué)
- 人造草坪采購(gòu)鋪設(shè)項(xiàng)目 投標(biāo)方案(技術(shù)方案)
- 三年級(jí)數(shù)學(xué)計(jì)算題300道
- 山東省臨沂市2024年中考英語真題【附真題答案】
- JG-T 283-2010 膨脹?;⒅檩p質(zhì)砂漿
- COCA20000詞匯 增強(qiáng)版表格
- 遺傳因素導(dǎo)致近視眼病進(jìn)展
評(píng)論
0/150
提交評(píng)論