發表文章

ANDROID使用UI Thread/背景Thread的簡記

Android APP因為有ANR(Application No Respnse)問題要處理所以需要知道哪些操作是要在UI thread上執行, 而複雜操作要在背景thread上執行 寫過Java的人都會想到用Thread或是繼承Thread來執行複雜操作 // Java style thread new Thread(new Runnable() {     public void run() {         // Running long time process, not included UIs     } }).start(); // Override the thread class new Thread() {     public void run() {         // Running long time process, not included UIs     } }.start(); 那Android上如何執行複雜操作? 你還是可以使用Java Thread或是選擇Android提供的Looper與Handler機制 /* import android.os.HandlerThread; import android.os.Handler; HandlerThread mBackLooper = null; Handler mBackHandler = null; mBackLooper = new HandlerThread("BackgroundWorker"); mBackLooper.start(); mBackHandler = new Handler(mBackLooper.getLooper()); */ void processComplexity(String name) {     final String Name = name;     mBackHandler.post(new Runnable(){       ...

Android 7.0 APP存取log和prop行為變更

根據Android官方文件 https://developer.android.com/about/versions/nougat/android-7.0-changes.html?hl=zh-tw Android 7.0後非系統APP, 需要使用log和prop要使用NDK開放的API, 不再提供如libcutils和libutils的存取, 在啟動APP時候會發生 dlopen failed: cannot locate symbol "__system_property_get" referenced by ... 像是下面兩個log標頭檔就應該要修改 #include<utils/Log.h> #include<cutils/log.h> log函數使用包含在liblog內的函數 #include<android/log.h> int __android_log_print(int prio, const char *tag, const char *fmt, ...); AOSP實作和定義分別在 system/core/liblog/logger_write.c system/core/include/android/log.h 和以前用ALOG以及LOG系列函數不一樣的點在於需要自己寫priority, 因為實在太麻煩, 所以自己寫了一個AndroidLog.h方便使用 #ifndef __ANDROIDLOG_H__ #define __ANDROIDLOG_H__ #include <android/log.h> #if LOG_NDEBUG #define LOGV(...) ((void)0) #else #define LOGV(...) ((void)__android_log_print(ANDROID_LOG_VERBOSE,LOG_TAG,__VA_ARGS__)) #endif #define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)) #define LOGE(...) ((void)__android_l...

在Android.mk產生git版本,編譯時間和builder名稱

Android.mk產生git版本,編譯時間和builder名稱 CUR_GIT_VERSION="$(shell cd $(LOCAL_PATH);git log | grep commit -m 1 | cut -d' ' -f 2)" CUR_GIT_UNCOMMIT_FILE_NUM=$(shell cd $(LOCAL_PATH);git diff | grep +++ -c) CUR_BUILD_TIME=" $(shell date)" CUR_BUILD_NAME=" $(shell echo ${LOGNAME})" LOCAL_CFLAGS+=-DCUR_GIT_VERSION=\"${CUR_GIT_VERSION}${CUR_GIT_UNCOMMIT_FILE_NUM}\" LOCAL_CFLAGS+=-DCUR_BUILD_TIME=\"${CUR_BUILD_TIME}\" LOCAL_CFLAGS+=-DCUR_BUILD_NAME=\"${CUR_BUILD_NAME}\"

分辨Sparsed與一般Ext4 Image

Android image編譯出來的會用sparsed image儲存 AOSP內的產生sparse用的函式庫 https://android.googlesource.com/platform/system/core/+/master/libsparse/ 將sparse image轉換為raw image 程式碼位置: system/core/libsparse/simg2img.c AOSP編譯出來的路徑可能在out/host/linux-x86/bin 用法: simg2img {sparse_image_files} {raw_image_file} 將raw image轉換為sparse image 程式碼位置: system/core/libsparse/img2simg.c AOSP編譯出來的路徑可能在out/host/linux-x86/bin 用法: img2simg {raw_image_file} {sparse_image_file} [{block_size}]   網路上其他關於Sparsed image的Source Code: https://github.com/anestisb/android-simg2img 分辨Sparsed與一般Ext4 Image方法 使用file指令,如果是一般的ext4會顯示相關資訊 file system.raw system.raw: Linux rev 1.0 ext4 filesystem data, UUID=57f8f4bc-abf4-655f-bf67-946fc0f9f25b (extents) (large files) 但是file對於sparsed ext4無法顯示相關資訊 file system.ext4 system.ext4: data 有些系統會顯示相關資訊 system.ext4: Android sparse image, version: 1.0, Total of 262144 4096-byte output blocks in 1620 input chunks. 掛載Sparsed/Ext4 image到本機目錄 安裝simg2img工具 sudo apt-get instal...

取代指定目下含有指定字串的內容

grep -rl {搜尋目標字串} {指定目錄} | xargs sed -i 's/{搜尋目標字串}/{取代的字串}/g' grep的-r是搜尋目錄 grep的-l是只印出含有搜尋目標字串的檔案 grep的搜尋目標字串要注意若含有regular expression的萬用字元,如(.)和(*)等,需要進行跳脫 例如: 把ALOG改成LOG grep -rl ALOG ./ | xargs sed -i 's/ALOG/LOG/g' 參考資料 http://vasir.net/blog/ubuntu/replace_string_in_multiple_files

在Android.mk自動檢查某檔案是否存在後加入

define prebuilt-app-file-exist $(shell test -f $(1) && echo "true") endef prebuilt_app_exist := $(call prebuilt-app-file-exist, $(LOCAL_PATH)/your_app.apk) ifeq ($(strip $(prebuilt_app_exist)),true) $(info Found prebuilt app, appended) prebuild_apps_list += your_app_module_name else $(info Not found prebuilt app) endif

取得git短碼,標題與workspace頂層目錄

取得commit版本sha1短碼 git log -10 --oneline | cut -d " " -f 1 取的commit的標題 git log -10 --oneline | cut -d " " -f 2- 取得目前git的workspace 頂層目錄 git rev-parse --show-toplevel 當前若不是git目錄, 但是還是想某目錄內的git指令, 只要先打-C和目錄, 目錄不需要在work頂層目錄 git -C "/media/hd2/pub.repo/mypack/data" status 另外有--git-dir指定.git所在目錄, --work-tree指定工作目錄 git --git-dir="/media/hd2/pub.repo/.git" --work-tree="/media/hd2/pub.repo/" status 如果沒指定--git-dir, git會使用git rev-parse --show-toplevel取得頂層目錄 如果沒指定--work-tree, git會取得當前目錄當作work-tree 目前目錄要回到頂層目錄的 git rev-parse --show-cdup 例如頂層目錄在/media/hd2/pub.repo/ , 我在/media/hd2/pub.repo/mypack/data裡面打這個指令, 會得到../../ 所以要回到頂層目錄可以打 cd $(git rev-parse --show-cdup)

H.264/H.265 Spec相關筆記

H.264 Spec 7.3.1 NAL unit syntax 7.3.2 RBSP payloads and RBSP trailing bit syntax SPS => 7.3.2.1.1 Sequence parameter set data syntax   profile_idc   level_idc   seq_parameter_set_id   chroma_format_idc   separate_colour_plane_flag   bit_depth_luma_minus8   bit_depth_chroma_minus8   pic_width_in_mbs_minus1   pic_height_in_map_units_minus1 PPS => 7.3.2.2 Picture parameter set RBSP syntax   pic_parameter_set_id   seq_parameter_set_id   num_slice_groups_minus1 Table 7-1 – NAL unit type codes, syntax element categories, and NAL unit type classes 讀取bit stream的函數定義在7.2中介紹 7.2 Specification of syntax functions, categories, and descriptors 關於ue(v), me(v), se(v), te(v)在9.1多作解釋 9.1 Parsing process for Exp-Golomb codes NALU/RBSP/SODB http://yumichan.net/video-processing/video-compression/introduction-to-h264-nal-unit/ http://yumichan.net/video-processing/video-compression/introduction-to-h264-2-sodb-v...

用ffmpeg解出影片yuv像素資料

先用ffprobe查看一下媒體資訊, 確定使用解出來的像素類型是yuv420或是yuv420p ffprobe -i fhd_h264_video.mp4 Program 1      Stream #0:0[0x1023]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(tv, bt709, top first), 1920x1080 [SAR 1:1 DAR 16:9], 29.97 fps, 59.94 tbr, 90k tbn, 59.94 tbc 上面就是我輸入的影片(fhd_h264_video.mp4)的執行結果,該影片用h.264的High profile設定,像素資料是yuv420p,解析度是1920x1080,30fps(29.97),另外SAR和DAR的解釋可以參考 這篇 依照影片資訊我們想解出最適合YUV檔案 ffmpeg -i fhd_h264_video.mp4 -t 10 -pix_fmt yuv420p -y output.yuv -t 10是指定只要取10秒的資料; 如果要指定起始時間, 需要用-ss {秒數}來指定 -pix_fmt yuv420p 就是解壓縮出來的yuv像素資料 -y 是如果輸出得檔案已經存在就覆蓋掉 Full HD解出來的yuv像素資料大小,應該是1920x1080解析度 x 每秒30張 x 10秒 x 每個yuv像素大小為1.5 bytes = 933120000 bytes 不過-t這參數的位置會影響運行結果,例如我寫在-i之前,最後會輸出304 frames,所以計算檔案大小的時候就需要,而寫在-i後面的話,最後會輸出300 frames。 更直接的方式就是用-frame指定處理張數100張 ffmpeg -i  fhd_h264_video.mp4  -frames 100 -pix_fmt yuv420p -y output.yuv  如果是要轉youtube上的4k超高畫質影片,媒體資訊印出來的可能會是yuv422p或者是yuv420p10le的像素資料,所以檔案大小的計算就會不同。以yuv420p10le, 3840x2160...

Android Studio 2的adb檔案位置

圖片
Windows上預設安裝在  C:\User\{你得的使用者名稱}\AppData\Local\Android\sdk\platform-tools