2013年8月7日 星期三

Android 開發筆記 - 執行 script 筆記,特別是會處理 stdin 的 script 案例

最近在處理 LOA 開機啓動的設定,發現在 Android app 可以這樣就呼叫 sh 來執行 script 程式:

try {
Process mProcess = Runtime.getRuntime().exec("sh");
DataOutputStream mDataOutputStream = new DataOutputStream(mProcess.getOutputStream());
mDataOutputStream.writeBytes("sh /sdcard/test.sh > /sdcard/run.log \n");
mDataOutputStream.flush();
mDataOutputStream.close();
mProcess.waitFor();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


而此例 /sdcard/test.sh 為:

# cat test.sh
echo "Begin"
date

read something
#while [ 1 ] ;
#do
#        echo -n "."
#done

echo "End"
date


上述在 Android app 執行後,可以看到 /sdcard/run.log 顯示:

Begin
Wed Aug  7 21:54:13 CST 2013
End
Wed Aug  7 21:54:13 CST 2013


發現跑起來後,又緊接著關掉,追了很久才發現是 mDataOutputStream.close() 的影響 Orz 比較安全的解法是把 mProcess 和 mDataOutputStream 拉倒 class variable 等級,可隨著物件(此例為 Activity)存在而不被釋放:

public class TestActivity extends Activity {
Process mProcess;
DataOutputStream mDataOutputStream;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
mProcess = Runtime.getRuntime().exec("sh");
mDataOutputStream = new DataOutputStream(mProcess.getOutputStream());
mDataOutputStream.writeBytes("sh /sdcard/test.sh > /sdcard/run.log \n");
mDataOutputStream.flush();
//mDataOutputStream.close();
//mProcess.waitFor();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// …
}


回到對 LOA 的問題,是在於執行 sh 後,再透過 chroot 後就交給一隻 /root/init.sh  處理,而它會等 stdin 的資料,而 mDataOutputStream.close() 的結果就像給予 exit/logout/EOF 的現象,使得 LOA 一直起來後馬上又關掉了。

Android 開發筆記 - 開發需要 root 權限的程式,解決 Superuser Prompt 不顯示的問題

最近跟一間硬體商配合,發現他們提供的 root 版 Android 環境有點怪,以前我用 SSHDroid (ssh server) 去開 port 22 時,因為小於 1024 所以會需要 root 權限,這時候就會預期他們家安裝的 Superuser 會彈跳視窗出來,但…什麼卻沒發生且失敗了 Orz 當然,只要把 Superuser 設定成 all pass 時,就沒問題。

而後測試幾百次,應該可以用這招來強制 Superuser 彈跳出詢問視窗:

Process mProcess;
try {
mProcess = Runtime.getRuntime().exec("sh");
DataOutputStream mDataOutputStream = new DataOutputStream(mProcess.getOutputStream());
mDataOutputStream.writeBytes("su;");
mDataOutputStream.flush();
mDataOutputStream.close();
mProcess.waitFor();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


因此,若需要執行 root 權限,建議先用這招頂替一下 XD

2013年8月6日 星期二

Android 開發筆記 - 取得目前 Activity 資訊以及啓動特定 Activity 方法

最近在開發程式時,想要啓動特定 Activity 出來,這部分倒還滿容易找到資訊,順手筆記一下:

Command 用法:

$ am start -n com.google.android.browser/com.android.browser.BrowserActivity

程式碼呼叫:

Intent res = new Intent();
res.setComponent(new ComponentName("com.google.android.browser", "com.android.browser.BrowserActivity"));
this.startActivity(res);


提醒一下,並非所有 Activity 都可以被呼叫(沒有提供被呼叫的功能或其它問題),若用上述方式強制開啓會收到 java.lang.SecurityException: Permission Denial: starting Intent ... 等訊息。

此外,既然有想要開啓特定 Activity 的話,就會有得知目前 Activity 需求 :P 一樣用 adb shell 處理:

$ adb shell dumpsys window windows  | grep "mCurrentFocus\|mFocusedApp"
  mCurrentFocus=Window{### com.android.launcher/com.android.launcher2.Launcher paused=false}
  mFocusedApp=AppWindowToken{### token=Token{### ActivityRecord{### com.android.launcher/com.android.launcher2.Launcher}}}

2013年8月3日 星期六

[OSX] ls 顏色筆記 @ Mac 10.8

設定方式:

$ vim ~/.bash_profile
export CLICOLOR=1

另一種則是用 alias 來解:

$ vim ~/.bashrc
alias ls='ls -GF'

最後則是調色:

$ vim ~/.bash_profile
export CLICOLOR=1
export LSCOLORS=exfxcxdxbxegedabagacad

方便的調色服務:http://geoff.greer.fm/lscolors/

一歲的偽天龍人

night market

在台北不知不覺過了一年了,想起來也算是退伍一年,更仔細想想這一年似乎沒什麼成長?總是太餓了嗎?還是太蠢了呢?

回想起來,從萬華這邊起頭似乎很有緣分,扣除房東外,第一個跟我交談的是水電工,輕描淡寫地說住在這邊不要多想什麼,堅定正派信念,更要懂得珍惜長者。很妙地這些正不是資訊業的縮影?大家自恃著擁有搜尋引擎、開源碼,前輩們的價值以超過指數速度狂降,更別說生活上的大小事,都是先 Google 再說 :P 但一個銅板拍不響,也存在非常非常多的前輩只扛著年資討生活。

有一陣子我總想 PTT 上曾出現過的跑馬燈:「人人都想拯救世界,但是沒人幫媽媽洗碗…」,這句話含義真的很深很深。當我有機會陪家人時,發現自己也因此沒有多餘的行動力,一天總是只有那 24 小時,所以,這句話更重要的提醒是等價交換。極端點就是幫媽媽洗碗無法讓你拯救世界。

此外,想起市場規模的影響,年輕人回鄉不是壞事,以鄉村的角度是多了人力、青春活力,但以年輕人的角度來看,可能會因為缺少特別的資源而局限自己的長才,讓我想起跟一位上海 RD 聊天,他總說著有機會真的要去上海走一趟!以 Set-top box 來說,台灣最猛的頂多 400萬用戶,一年淘汰也了不起 20~40萬裝置,而每年的裝置可以養多大的公司?而大陸光一個省就超過了!這件事也讓我想起周邊一個雲端案例,用了 Hadoop/HBase 作出不錯的模組,但最後卡在台灣用量沒那麼多,真正會買單的客戶少,最後也終究遠離家鄉。這些例子或許都是特例,卻也紮實地說明了目前台灣有些東西為何如此。

經過這一年奇妙的旅程及回顧,讓我的思緒越來越清楚了。生活化的角度是要珍惜青春,但不必整天計較著付出就一定要得到什麼,卻也別忘了想要得到什麼就必須捨棄東西。