2012年5月12日 星期六

在少於 2GB 記憶體的虛擬機裡編譯 Android 4.0 (ICS)

先前偶爾會在虛擬機器裡編譯 Android,這兩天也試在稍早安裝的 Debian (32bit) 上嘗試編譯 Android 4.0 (ICS),首先遇上的問題是記憶體的部份。首先我將虛擬機器裡的記憶體設定成 1GB,所以編譯時遇上了這個問題:

target Dex: core
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
make: *** [out/target/common/obj/JAVA_LIBRARIES/core_intermediates/noproguard.classes-with-local.dex] Error 1 

這個容易處理,修改 core/definitions.mk 這個檔案是可以解決的,修改方式如下:

diff --git a/core/definitions.mk b/core/definitions.mk
index b678158..b83b299 100644
--- a/core/definitions.mk
+++ b/core/definitions.mk
@@ -1525,7 +1525,7 @@ define transform-classes.jar-to-dex
 @echo "target Dex: $(PRIVATE_MODULE)"
 @mkdir -p $(dir $@)
 $(hide) $(DX) \
-    $(if $(findstring windows,$(HOST_OS)),,-JXms16M -JXmx2048M) \
+    $(if $(findstring windows,$(HOST_OS)),,-JXms16M -JXmx1024M) \
     --dex --output=$@ \
     $(incremental_dex) \
     $(if $(NO_OPTIMIZE_DX), \ 

但,最後卻在編譯 qemu 時又出現錯誤,爬了文之後,在 "Build android ICS on ubuntu 32 bits" 這串討論文章裡看到以下這麼一段:

Indeed, with the emulator moving to 64-bit, building on 32-bit hosts is not an option any more (not even unsupported).

噗~~~既然我主要的環境都是 64 位元,而且在 32 位元的 Debian GNU/Linux 上也只是順手試試,那麼就先暫時到這裡吧! XD

2012年5月8日 星期二

讓 Ubuntu 12.04 的 ibus 倉頡五代輸入法預設使用繁體語系

日前安裝了 Ubuntu 12.04 後,在使用 ibus 裡的「倉頡五代輸入法」打字時發現似乎預設採用了簡體語系。於是爬文找了一下,原來這狀況在之前的版本裡已經存在了,便參考了這篇文章修改一下。

修改方法不難,使用任何一個編輯器開啟 /usr/share/ibus-table/engine/table.py 這個檔案,然後找到第 96 行到第 129 行這段:

  96         # self._chinese_mode: the candidate filter mode,
  97      #   0 is simplify Chinese
  98      #   1 is traditional Chinese
  99      #   2 is Big charset mode, but simplify Chinese first
 100      #   3 is Big charset mode, but traditional Chinese first
 101      #   4 is Big charset mode.
 102      # we use LC_CTYPE or LANG to determine which one to use
 103      self._chinese_mode = self._config.get_value (
 104              self._config_section,
 105              "ChineseMode",
 106              self.get_chinese_mode())
 107
 108  def get_chinese_mode (self):
 109      '''Use LC_CTYPE in your box to determine the _chinese_mode'''
 110      try:
 111          if os.environ.has_key('LC_CTYPE'):
 112              __lc = os.environ['LC_CTYPE'].split('.')[0].lower()
 113          else:
 114              __lc = os.environ['LANG'].split('.')[0].lower()
 115
 116          if __lc.find('_cn') != -1:
 117              return 0
 118          # hk and tw is should use tc as default
 119          elif __lc.find('_hk') != -1 or __lc.find('_tw') != -1\
 120                  or __lc.find('_mo') != -1:
 121              return 1
 122          else:
 123              if self.db._is_chinese:
 124                  # if IME declare as Chinese IME
 125                  return 1
 126              else:
 127                  return -1
 128      except:
 129          return -1 

get_chinese_mode 裡會依 locale 的 LC_CTYPE 來判斷,但由於我將 LC_CTYPE 設定成 en_US.UTF-8,原本在第 125 行就會返回 0 這個值,但依據第 96 行到第 101 行的註解,當返回 0 時則採用簡體中文語系。

所以,修改方式就是將第 125 行的返回值改成 1,這麼一來就可以直接使它使用繁體中文語系了。