編輯:關於Android編程
1、rk3168_v4.2\frameworks\base\data\videos下面的mp4的拷貝方法!
a、其實在我們的原始情況下這個目錄的東西並沒有拷貝到xxx/system/media/video下面,但是看到sounds目錄卻有拷貝為啥~
sounds目錄下有個AllAudio.mk,這個文件是怎麼調用的呢?
我在建產品分支的時候無意發現,加載其實很簡單~
b、資料收集:
http://blog.csdn.net/gchww/article/details/7838947
http://blog.csdn.net/tdstds/article/details/25823641
http://blog.csdn.net/stevenliyong/article/details/5285334
http://lhc180.blog.51cto.com/316940/774227/
c、拷貝文件的兩種方法(都在源碼內測試):
第一種、Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := bootanimation
LOCAL_SRC_FILES := bootanimation.zip
LOCAL_MODULE_PATH := $(TARGET_OUT)/media
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MODULE_SUFFIX:= .zip
#LOCAL_MODULE_SUFFIX:= .txtfile
LOCAL_CERTIFICATE:= PRESIGNED
LOCAL_PRELINK_MODULE := false
include $(BUILD_PREBUILT)
第二種 1、在Z:\Backup\rk3168_v4.2\build\target\product\full_base.mk中添加:
# Get some sounds
$(call inherit-product-if-exists, frameworks/base/data/sounds/AllAudio.mk)
#add by hcm
#Get some videos
$(call inherit-product-if-exists, frameworks/base/data/videos/AllVideo.mk)
2、在Z:\Backup\rk3168_v4.2\frameworks\base\data\videos中新建:AllVideo.mk
$(call inherit-product, frameworks/base/data/videos/VideoPackage1.mk)
$(call inherit-product, frameworks/base/data/videos/VideoPackage2.mk)
分析流程包含在產品分支添加中:
1、當我們編譯Android源碼是執行下面兩條看到如下信息:
root@david-desktop:/home/hcm/Backup/rk3168_v4.2# . ./build/envsetup.sh
including device/generic/armv7-a-neon/vendorsetup.sh
including device/generic/armv7-a/vendorsetup.sh
including device/generic/mips/vendorsetup.sh
including device/generic/x86/vendorsetup.sh
including device/rockchip/rk30sdk_bnd/vendorsetup.sh
including device/rockchip/rk30sdk_hcm/vendorsetup.sh
including device/rockchip/rk30sdk/vendorsetup.sh
including sdk/bash_completion/adb.bash
從上面的信息我們可以看出,配置環境變量,在envsetup.sh 最重要是去包含了vendorsetup.sh,
root@david-desktop:/home/hcm/Backup/rk3168_v4.2# lunch
You're building on Linux
Lunch menu... pick a combo:
1. full-eng
2. full_x86-eng
3. vbox_x86-eng
4. full_mips-eng
5. mini_armv7a_neon-userdebug
6. mini_armv7a-userdebug
7. mini_mips-userdebug
8. mini_x86-userdebug
9. rk30sdk_bnd-eng
10. rk30sdk_hcmx-eng
11. rk30sdk-eng
Which would you like? [full-eng]
我們看到lunch命令輸出了一個Lunch菜單,該菜單列出了當前Android源碼支持的所有設備型號及其編譯類型。例如,第一項“full-eng”表示的設備“full”即為模擬器,並且編譯類型為“eng”即為工程機
一、調用流程:envsetup.sh --------> including device/xxx/xxx/vendorsetup.sh
lunch ---------> check_product()->get_build_var()-> build/core/main.mk -> build/core/config.mk
-> build/core/envsetup.mk -> build/core/product_config.mk
在build/core/product_config.mk 中編譯系統首先調用 build/core/product.mk中定義的函數get-all-product-makefiles ,來遍歷整個vendor 的子目錄, 找到vendor下所有的 AndroidProducts.mk, 再由 AndroidProducts.mk找到Z:\source\rk3168_v4.2\device\rockchip\rk30sdk_bnd\rk30sdk_bnd.mk 中定義了不同的 PRODUCT_NAME, PRODUCT_DEVICE 等信息,(我們也可以通過 打開build/core/product_config.mk 中的#$(dump-products) 語句使控制台編譯的時候輸出所有product 的信息) , 接著build/core/product_config.mk 會調用resolve-short-product-name 將TARGET_PRODUCT匹配的AndroidProducts.mk 中定義的 PRODUCT_DEVICE 賦值給TARGET_DEVICE。
有了這個TARGET_DEVICE, 再回到 build/core/config.mk,
會include $(TARGET_DEVCIE)/BoardConfig.mk
board_config_mk := /
$(strip $(wildcard /
$(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk /
vendor/*/$(TARGET_DEVICE)/BoardConfig.mk /
))
include $(board_config_mk)
而這個配置文件BoardConfig.mk 決定了目標系統編譯屬性,比如使用ALSA還是不是 GENERIC_AUDIO 等等
另外在這裡TARGET_DEVICE 宏也決定了TARGET_DEVICE_DIR, 因為TARGET_DEVICE_DIR 取的是上面提到的BoardConfig.mk 的路徑。
TARGET_DEVICE_DIR := $(patsubst %/,%,$(dir $(board_config_mk)))
當然Android 的Ob目標輸出也是由TARGET_DEVICE決定,見build/core/envsetup.mk
TARGET_OUT_ROOT_release := $(OUT_DIR)/target
TARGET_OUT_ROOT_debug := $(DEBUG_OUT_DIR)/target
TARGET_OUT_ROOT := $(TARGET_OUT_ROOT_$(TARGET_BUILD_TYPE))
TARGET_PRODUCT_OUT_ROOT := $(TARGET_OUT_ROOT)/product
PRODUCT_OUT := $(TARGET_PRODUCT_OUT_ROOT)/$(TARGET_DEVICE)
再回到 build/core/main.mk, 編譯系統接著做的一個件事情是,遍歷所有字目錄,找到所有Android.mk文件,並將這些Android.mk文件include 進來
#
# Typical build; include any Android.mk files we can find.
#
subdir_makefiles := /
$(shell build/tools/findleaves.py --prune=out --prune=.repo --prune=.git $(subdirs) Android.mk)
include $(subdir_makefiles)
我們再來看其中的
./build/target/board/Android.mk
,對了它引用了
include $(TARGET_DEVICE_DIR)/AndroidBoard.mk
由上面TARGET_DEVICE_DIR的定義,這下又進入了
vendor 下TARGET_DEVICE指向的目錄了,這個mk文件中定義了特定Product需要編譯和安裝app 和 script.
二、Android lunch調用關系
1. 調用流程圖:
2. 調用關系分析
在編譯Android產品的時候我們首先會導入. build/envsetup.sh ,然後lunch,這時候我們可以看到幾個基本的產品版本。
從現象回推,首先查看envsetup.sh文件中的lunch函數:
具體分析見:lunch函數分析
在envsetup.sh中,有幾個比較重要的函數。Lunch(),check_product(),print_lunch_menu(),get_build_var(),gettop,add_lunch_combo(),set_stuff_for_environment(),set_java_home(),findmakefile()。
1) lunch
[plain] view plaincopy2) Check_product:
[plain] view plaincopy3) Print_lunch_menu()
[plain] view plaincopy4) Get_build_var()
[plain] view plaincopy5) Gettop()
[plain] view plaincopy6) Add_lunch_combo()
[plain] view plaincopy7) Set_stuff_for_environment()
[plain] view plaincopy8) Set_java_home
[plain] view plaincopy9) findmakefile
[plain] view plaincopy
[plain] view plaincopy
這段代碼尋找vendor,build,device指定目錄下的vendorsetup.sh。在vendorsetup.sh中定義了各版本的產品。
三、通過上面分析我們如果要定制自己的lunch分支主要是添加自己的平台到Z:\source\rk3168_v4.2\device\芯片廠商名\芯片名
1、具體修改文件:由於執行. ./build/envsetup.sh找到vendorsetup.sh,在其中加入自己的平台版本號!
add_lunch_combo rk30sdk_bnd-eng
2、lunch---->, AndroidProducts.mk---->Z:\source\rk3168_v4.2\device\rockchip\rk30sdk_bnd\rk30sdk_bnd.mk
在rk30sdk_bnd.mk的關鍵部分
include device/rockchip/rk30sdk_bnd/BoardConfig.mk
#或者為$(call inherit-product, $(SRC_TARGET_DIR)/product/full_base.mk)
$(call inherit-product, device/rockchip/rk30sdk_bnd/device.mk)(或者將full_base.mk包含在其中)
full_base.mk此文件主要指定對系統語言,APP編譯配置文件,sounds的拷貝的mk文件!
PRODUCT_BRAND := rk30sdk_bnd
PRODUCT_DEVICE := rk30sdk_bnd //指定Z:\source\rk3168_v4.2\out\target\product\rk30sdk_bnd目錄名
//指定Z:\source\rk3168_v4.2\device\rockchip\rk30sdk_bnd目錄名
PRODUCT_NAME := rk30sdk_bnd //目標設備名
PRODUCT_MODEL := rk30sdk_bnd
PRODUCT_MANUFACTURER := rockchip
3、至於其他的根據你要引用的變量來決定如:Z:\source\rk3168_v4.2\device\rockchip\rk30sdk_bnd\BoardConfig.mk 中
include device/rockchip/$(TARGET_PRODUCT)/wifi_bt.mk的$(TARGET_PRODUCT)就和PRODUCT_NAME有關,因為要知道准確路徑!
4、注解:
Z:\source\rk3168_v4.2\device\rockchip\rk30sdk_bnd\BoardConfig.mk中
//MAX-SIZE=512M,
for generate out/.../system.img 對system.img的大小進行了限制
BOARD_SYSTEMIMAGE_PARTITION_SIZE ?= 671088640
BOARD_FLASH_BLOCK_SIZE ?= 131072
顧名思義Camera就是拍照和錄像的功能,像微信裡面,我們想拍照傳一下照片,就可以通過camera來拍照,然後存儲照片,發送給好友。那麼微信的app裡面是不會直接通過ca
對於SlidingDrawer,官網上是這樣解釋的:SlidingDrawer將內容隱藏在屏幕之外,並且允許用戶通過拖動handle將內容顯示到屏幕上。一個Sliding
使用android shell命令查看內存使用情況使用adb shell dumpsys meminfo pkgname或者直接使用AndroidStudio裡面的mem
效果圖:1、實現列表頭部的圖片輪播,方式:給RecyclerView添加HeaderView。RecyclerView默認是沒有添加HeaderView方法的,所以我從網