發表文章

目前顯示的是 2月, 2017的文章

筆記:Ubuntu產生Core dump

圖片
1. 產生執行中程序的Core Dump gcore -o {output dump file} {process id}  輸出的檔案名稱-o指定的檔名,加上process id作為副檔名 例如: $ gcore -o chrome_dump 8283 [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". warning: Target and debugger are in different PID namespaces; thread lists and other data are likely unreliable pthread_cond_timedwait@@GLIBC_2.3.2 () at ../sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S:225 225 ../sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: No such file or directory. Saved corefile chrome_dump.8283 2. 強制停止程序讓系統產生Core dump kill -6 {process ID} -6是SIGABRT信號,可讓process中止,如果沒效,可嘗試SIGSYS(-31)或是SIGXCPU(-24)信號 參考資料: https://www.ibm.com/support/knowledgecenter/en/SSYKE2_9.0.0/com.ibm.java.multiplatform.90.doc/diag/tools/obtaining_dump_hung_jvm.html 如果沒有在工作目錄下產生core或coredump,表示需要暫時解除限制 暫時不限制 ulimit -c unlimited 查看目前的限制狀態,若為0表示不dump,Ubuntu就是預設為0 ulimit -c 其他ulimit選項

cat指令使用簡記

cat #印出使用者輸入的內容,請用Ctrl+D結束或是Ctrl+C中斷 cat {file} #印出檔案內容 cat < cat {file1} {file2} > concated_file  #把file2的內容接到file1的後面 cmd | cat {file1} - {file2}  #將cmd的螢幕輸出丟給cat並依照file1,螢幕輸出,file2的順序銜接 cat -A {file} #全部的不可印字元以特殊符號顯示 cat -n {file} #印出檔案的每一行,每一行前面會加上行號(從1開始), 也可以接螢幕輸出,例如:ls | cat -n

Ubuntu垃圾筒(Trash)位置

同事遇到其他使用者的檔案移動到Trash後無法讓他清除(empty)的功能 實際上Ubuntu Trash的位置應該是在 /home/$USER/.local/share/Trash/ 而root沒有Trash資料夾 若是使用sudo開檔案總管將檔案丟到Trash時,正常是會放到在當前使用者的Trash中 要被刪除的檔案在 /home/$USER/.local/share/Trash/files 裡頭

Ubuntu常用快捷鍵

長按Win  顯示按鍵的Shortcut (Ubuntu內寫Super等於Win鍵) Ctrl+數字鍵 左方第N個, Ctrl+Win+D 縮小所有視窗,回到桌面/返回原視窗 Ctrl+W 顯示所有視窗 Alt+拖曳視窗任意位置 可移動視窗位置(這功能在視窗超出畫面的時候好用) Ctrl+Alt+數字 將目前視窗變小移動到螢幕中相對數字鍵盤的位置,例如7是左上方、6是右方 Ctrl+Alt+T 開啟Terminal Alt+`  在同名稱的應用程式間切換視窗(我Terminal就很開很多個,所以很常用) Alt+Tab 在所有已開啟的應用程式間切換視窗

取得檔案大小

如果要獲得檔案byte數的檔案名稱儲存在參數1裏面 方法1: ls -l $1 | awk '{print $5}' 方法2: du -b $1 | awk '{print $1}' 方法3: stat -c "%s" $1 方法4: wc -c $1| awk '{print $1}' 應用取得檔案大小產生git用的sha1雜湊值 #!/bin/bash for var in "$@" do     if [ -f "$var" ]; then         echo -en "$var" "\t"         wc -c "$var"| awk '{printf "blob " $1 "\0"}' | cat - "$var" | sha1sum - | awk '{print $1}'     else         echo "$var is not file"     fi done

git電子書

PeepCode - Git Internals https://github.com/pluralsight/git-internals-pdf/releases

Android簡短Webview範例

    private WebView mWebView = null;     @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         Log.i(TAG, "new WebView(this)");         mWebView = new WebView(this);         WebSettings webViewSettings = mWebView.getSettings();         webViewSettings.setJavaScriptEnabled(true);         // packages/apps/Browser/src/com/android/browser/BrowserSettings.java         webViewSettings.setAllowContentAccess(false);         webViewSettings.setAppCacheEnabled(true);         webViewSettings.setDatabaseEnabled(true);         webViewSettings.setDomStorageEnabled(true);         mWebView.setWebViewClient(mWebViewClient);         mWebView.setWebChromeClient(mWebChromeClient);         //String target_url = "http://tw.yahoo.com";         //String target_url = "http://www.youtube.com";         //String target_url = "https://www.youtube.com/embed/QjMBw2bTDLQ";         String

Android預設開啟adb功能並且有root權限

修改檔案1 build/core/main.mk 修改位置1  enable_target_debugging := true  tags_to_install :=  ifneq (,$(user_variant))    # Target is secure in user builds. -  ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=1 +  ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=0    ifeq ($(user_variant),userdebug)      # Pick up some extra useful tools 修改位置2  ifeq (true,$(strip $(enable_target_debugging)))    INCLUDE_TEST_OTA_KEYS := true  else # !enable_target_debugging    # Target is less debuggable and adbd is off by default -  ADDITIONAL_DEFAULT_PROPERTIES += ro.debuggable=0 +  ADDITIONAL_DEFAULT_PROPERTIES += ro.debuggable=1  endif # !enable_target_debugging 修改檔案2 system/core/adb/Android.mk 修改位置  ifneq (,$(filter userdebug eng,$(TARGET_BUILD_VARIANT)))  LOCAL_CFLAGS += -DALLOW_ADBD_ROOT=1  endif +LOCAL_CFLAGS += -DALLOW_ADBD_ROOT=1

Ubuntu on Windows 10測試&體驗

圖片
上年度中微軟就已經發布Ubuntu on Windows 10的消息,因為有大大說該嘗試看看,所以就來測試一下,安裝方法可以參考 官方 的或者是 T客幫 的教學。 安裝要開啟系統開發者模式,需要重新開機 然後從控制台的新增移除程式裡面開啟這個隱藏功能 第一次使用Ubuntu on Windows 10要建立使用者 登入使用者 基本的系統資訊是顯示Ubuntu 14.04.5和Linux 3.4.0版核心 並可以安裝git和build-essential,基本的程式開發功能都能夠做了 官方說不支援GUI相關的程式,所以也不能取代VM版進行Android APP的開發。

Ubuntu的vim編輯器設定

圖片
預設14.04安裝的vim是功能比較少的版本,在開發上我都會再安裝vim-gtk sudo apt-get update sudo apt-get install vim-gtk 察看安裝的vim版本與編譯時的設定 進入vim,輸入:version可以察看狀態。開啟的功能前面會寫+,而關閉的功能會寫- 設定成預設編輯器 Ubuntu上可以同時安裝好多種編輯器和vim,因為他們套件名稱不同,要如何設定你想用的版本, 就要用這個指令來選擇預設 sudo update-alternatives --config editor 另外在一些指令會呼叫外部編輯器,例如tig,會需要設定環境變數來改變開啟的編輯器 export EDITOR="vim" gvim (GUI vim) 有圖形界面的vim版也就是gvim,其實只是加了獨立視窗及一些視窗設定,好處是不知道指令也可以用滑鼠來按功能 如果直接輸入gvim後要等很久才能開始打字,或是command line出現下面的訊息的話 ** (gvim:20320): WARNING **: Unable to create Ubuntu Menu Proxy: Timeout was reached 請在.bashrc加入下面這行讓他快速跳過 alias gvim="gvim -f"

BASH的管線與重導向

圖片
cmd >file          # stdout導出檔案 cmd 1>file          # stdout導出檔案 cmd 2>file          # stderr導出檔案 cmd >file 2>&1     # stdout&stderr都放到file中 cmd >file 2>file2  # stdout到file;stderr到file2 cmd >>file         # stdout加到檔案後 cmd 1>>file        #  stdout加到檔案後 cmd 2>>file        #  stderr加到檔案後 cmd >>file 2>&1    # stdout和stderr都加到檔案後 cmd  <input_file         # stdin輸入指定檔案 cmd 3 <input_file       # 輸入指定檔案到指定的fd, 這裡是指定fd=3 cmd  < < LABEL         #  開啟可讓使用者輸入的stdin, 並以LABEL來結尾。要使用這個寫法, cmd需要能夠讀入stdin的輸入 cmd1 | cmd2        # cmd1的stdout導入cmd2 cmd1 2>&1 | cmd2   # cmd1的stdout和stderr導入cmd2 cmd1 | cmd2 | cmd3 > file1     # 串聯指令的執行 cmd1 | tee file_cmd1 | cmd2 | cmd3 > file1     # 將cmd1的輸出順便導入file_cmd1 重導注意事項 重導向時,如果用到2>&1和1>&2需注意要輸出的檔案要寫再前面, 因為bash實作管線導向時,是close原本 變數中 的fd,再dup另一個fd接上該變數。 如果寫的指令為 cmd 2>&1 > log.txt # 與預想結果不同的寫法 拆解成B

用Android workspace簽章system app

指定AOSP目錄與要簽章成system app的檔案進行簽章 #!/bin/bash if [ $# -lt 2 ]; then     echo "usage: signapp "     exit -1 fi WORKSPACE="$1" APKFILE="$2" if [ -z "${WORKSPACE}" -o ! -d "${WORKSPACE}"  ] ; then     echo "ERROR! not found the workspace directory ${WORKSPACE}"     exit -2 fi if [ -z "${APKFILE}" -o ! -f "${APKFILE}"  ] ; then     echo "ERROR! not found APP file! ${APKFILE}"     exit -3 fi OUTDIR=$(dirname "${APKFILE}") APKFILENAME=$(basename "${APKFILE}") APKNANE_WITHOUT_EXT="${APKFILENAME%.*}" OUTFILENAME="${OUTDIR}/${APKNANE_WITHOUT_EXT}_signed.apk" #echo ${OUTDIR} #echo ${APKFILENAME} #echo ${APKNANE_WITHOUT_EXT} #echo ${OUTFILENAME} if [ -z "${APKFILE}" -o ! -f "${APKFILE}"  ] ; then     echo "ERROR! not found APP file! ${APKFILE}"     exit -4 fi TOOLFILE="${WORKSPACE}/prebuilts/sdk/tools/lib

BASH指令顯示二進位資料/轉換2進位10進位/彩色文字/檔案反序列印

10進位數值轉2,8,16進位 echo 'obase=2; 10' | bc 結果會輸出:1010 echo 'obase=16; 10' | bc 結果會輸出:A echo 'obase=8; 10' | bc 結果會輸出:12 echo印出彩色文字 echo -e 主要是為了在terminal中印出彩色文字 echo -e "Processing .....  \e[1;31m  failed \e[0m" 相關色碼可以參考 http://unix.stackexchange.com/questions/43408/printing-colored-text-using-echo Dump二進位資料 hd { file_path}  # short command hd就是hexdump, 將檔案以16進位列出, 它預設印出的方式(-x)是雙byte,所以高低byte位置會受到big/little-endian影響。 在開發時我們都是一個個byte照順序看來查bug,所以我會建議用hexdump的-C來印出二進位資料,hd雖然可以用-C參數,但是不會照我們想的列印,所以用-C請打hexdump完整名稱! hexdump -C  { file_path} 另外要指定列印位置跟長度用-s和-n hexdump  -s {start_pos}  -n {length}  -C  { file_path} 反轉換二進位資料 xxd -r # conver the hexdump into binary data 反序列印檔案內的行 tac  filename.txt 用cat來想這個指令就知道tac是反序列印 參考資料 http://linux.die.net/man/1/xxd

grep指令使用簡集

圖片
查找目前目錄與子目錄下的檔案內含有text字串的檔案的位置 grep -r "text" ./ # r遞迴搜尋 grep -rn "text" ./ #n印出行號 grep -ri "text" ./ # i忽略大小寫 grep -c "prepared" # 統計指定檔案內搜尋該文字出現的次數,不印出該行內容 grep -rI "text" ./ # 忽略2進位檔 grep -rl "text" ./ # 只出含有text的檔案名, 一般是會用管線和檔案處理指令如cp, rm等一起使用 想要順便看grep內容的上下文, 可以用-A, -B或是 -C -A {n} 是之後(after)的數行 -B {n}是之前(before)的數行 -C {n}是上下都印數行 如果文字檔案包含一些非字元的內容, grep就只會當作binary檔案印出match或不match, 如果想要grep視為文字檔處理, 就用-a。 -b是印出檔案的byte-offset 真的你是要看binary裡面的字串, 我會建議先用string 將binary檔案內的文字析出, 再接上grep 會比較恰當。 忽略無法讀取或不存在加上-s或是--no-messages 忽略.git目錄 grep --exclude-dir=".git" -r text_start ./ 忽略搜尋二進位檔/執行檔 grep --exclude-dir=".git" -r text_start ./ -I 從前個指令的螢幕輸出來查找 例如: ps aux | grep "ps aux" 搜尋android logcat的logfile.txt中某個時間區段的log awk '$0 > "08-08 11:35:30.000" && $0 < "08-08 11:38:35.322"' logfile.txt 搜尋MediaPlayerService的訊息並指定時間在08-08 11:35:3

Linux指令筆記

chmod 變更檔案權限 權限則是依照User(Owner), Group, Other的讀取,寫入和來排列 - rwx rwx rwx 是權限全開,可用chmod 0777 filename來設定 - rwx rwx r-x 是Other無法寫入,可用chmod 0775 filename來設定 - rw- rw- rw- 是開啟讀寫權限,但不可執行,可用chmod 0666 filename來設定 - rwx --- --- 是User本身權限全開,可用chmod 0700 filename來設定 目錄的r是可以查看目錄中有哪些檔案 目錄的w是建立,移除目錄下的檔案 目錄的x是可以cd 切換到該目錄中 如果想要開啟某個script的執行權限可以用chmod +x filename設定 chmod u+x   是賦予擁有者執行權限 chmod a=rw  表示所有人都賦予讀寫權限 除了上面的9個設定外,還有3個權限控制用的設定,這只要是Linux的file system都會支援這12種的檔案存取模式。如果是用Windows使用的FAT則沒有這些設置,NTFS的話則是下沒有下面這三種設定。 SUID chmod o+s file SUID是Set User ID的意思,如果有設定,則在Owner的執行權限會寫成S或是s,因為它的特性是為了讓執行檔被執行時,有檔案擁有者的權限,所以才會設計寫在Owner的x位置,讓一般使用者可以執行某些原本需要root或是其他系統權限的指令。例如改密碼的passwd指令,就是設定SUID的方式達成。 -rwsr-xr-x 1 root root 47032 May 17 2017 /usr/bin/passwd 然後擁有者是root,所以passwd執行時,可以存取root可存取的密碼檔案/etc/passwd -rw-r--r-- 1 root root 1207 Feb 12  2017 /etc/passwd 只不過有些執行檔千萬這麼設置,例如是vim,不然所有的使用者都可以使用vim,編輯系統上所有的檔案,包含重要的系統檔。 SGID chmod g+s file Set Group ID則是對執行檔和目錄有效,如果有設定,則Group執行權限會寫成S或是s,小

Repo使用筆記

圖片
repo其實就是管理眾多git與專案的工具,他本身是用python所構成 下載Repo並設定系統路徑 $ mkdir -p ~/bin/ $ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo $ chmod a+x ~/bin/repo $ export PATH=${HOME}/bin:${PATH} repo的網址我已經看到很多不同的URL,我會建議使用 Android文件 上提供的網址 設定Repo要下載的專案庫 例如AOSP的repo是https://android.googlesource.com/platform/manifest $ repo init -u https://android.googlesource.com/platform/manifest 如果是要ssh登入的就是用下面類似格式 $ repo init -u ssh://帳號@可供下載的Repo網址 設定來源的同時指定要切換的branch使用-b $ repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1 repo init之後實際上會在當前目錄建立隱藏目錄.repo,並將manifest的設定從server上帶下來, 裏面會有個manifest.xml,用ls -l察看該檔案可以看到他連結到manifests目錄內的某個.xml 這個manifests目錄就是可以供選擇的專案,如果想要選擇的不是預設的專案,可以透過repo init -m 來指定要變更的xml名稱。 $ repo init -m proj20151031.xml 跟你直接改manifest.xml連結的對象也是同樣意思 看repo init的指令說明 $ repo init -h 開始下載或更新 $ repo sync -j8 -j後面的數字是連線數目 如果下載有問題可以使用proxy和更改系統設定增加穩定性,設定請參考 android文件 說明 列出目前Repo的git projects $ repo lis

Ubuntu上取得/設定硬碟UUID

取得某個硬碟裝置的UUID $sudo blkid 結果會像是這樣 /dev/sda1: UUID="07a0dda7-b031-4c64-bec3-648a60e4eeac" TYPE="ext4" /dev/sda5: UUID="e2ba810a-6117-4749-a382-d2d6ca240bd1" TYPE="swap" /dev/sdb1: UUID="97a8ce48-4eaa-42cf-995f-b9e89bc812d3" TYPE="ext4" UUID就是長的類似亂碼的07a0dda7-b031-4c64-bec3-648a60e4eeac 只顯示device and UUID資訊 $sudo blkid -s UUID android上的toolbox有提供這個指令 busybox也有提供這個指令 設置UUID $sudo tune2fs {硬碟裝置路徑} -U  {你要設定的UUID} 例如:sudo tune2fs /dev/sde5 -U  97a8ce48-4eaa-42cf-995f-b9e89bc812d3 busybox有會供該指令,但是沒有-U的option 察看硬碟裝置資訊 $sudo tune2fs -l /dev/sda1 參考資料: http://puremonkey2010.blogspot.tw/2010/10/linux-tune2fs-ext2.html http://android.stackexchange.com/questions/5232/how-can-i-view-the-android-internal-partition-table

如何確認apk所簽章的key?

如何確認apk所sign的key? unzip -p your.apk META-INF/CERT.RSA | keytool -printcert | sed -n '/SHA1:/s/.*: //p' keytool是jre/jdk內建的指令

查詢某個Action會由哪些BroadcastReceivers接收

開個新的APP把下面這段code放進去,然後可以在onCreate或者onResume呼叫看看     public boolean isIntentAvailable(String action) {         Log.d(TAG, "isIntentAvailable()");         if (action ==null) action = Intent.ACTION_BOOT_COMPLETED;         final PackageManager packageManager = getApplicationContext().getPackageManager();         final Intent intent = new Intent(action);         List resolveInfo = null;         resolveInfo = packageManager.queryBroadcastReceivers(intent, 0);         //List resolveInfo = packageManager.queryIntentActivities(intent, PackageManager.0);         if (resolveInfo.size()<=0) {             Log.d(TAG, "info is empty, try another option " + resolveInfo.size());             resolveInfo = packageManager.queryBroadcastReceivers(intent, PackageManager.MATCH_DEFAULT_ONLY);         }         Log.d(TAG, "queryBroadcastReceivers(action={" + action + "}) info len=" + resolveInfo.size());         if (resolveInfo.size() &g