繁簡中文轉換 OpenCC

最近在做繁簡中文的科技翻譯,我本身用的是繁體中文,市面上雖然有不少繁簡轉換的工具,例如「同文堂」,但它僅能用於網頁,Word也有繁簡轉換的功能,可是它是逐字翻譯,實際使用起來,功能上仍有不足。

我們都知道,繁簡中文轉換最困難的是術語的轉換,例如 Document,台灣叫「文件」,大陸叫「文檔」;File,台灣叫「檔案」,大陸叫「文件」;Column,台灣叫「欄位」,大陸叫「字段」。關於術語的轉換,前輩侯捷大師有先見之明,早在二十多年前就整理了一份繁簡術語對照表

今天,在 GitHub 上則出現了一個「開放中文轉換」的開源專案,這個專案能轉換大陸、台灣、香港三地的習慣用詞,非常強大。

可以使用這個網站做線上中文轉換 http://opencc.byvoid.com/

因為開源的關係,也產生不少相關的應用,如果你有使用 Sublime Text 編輯器,可以安裝 ChineseOpenConvert 這個套件,就能在 Sublime 直接做繁簡中文的轉換。


分類:

WordPress 搬移方法

如果將 WordPress 放置在免費的 VPS 空間,可能時常會遇到因為環境不穩定,而需要搬遷到其他 VPS 的狀況。以下就來說明  WordPress 搬遷的步驟:

資料匯出

多數 VPS 無法直接備份資料庫,要匯出資料,只能透過 phpMyAdmin 介面。先登入到舊站的 phpMyAdmin,選擇「匯出」功能

(phpMyAdmin 的介面,可能會因爲 VPS 提供的版本而有差異)

 選擇「儲存為檔案」

為了簡化程序,這裡只勾選資料,我們只需要將資料匯出後,再匯入到新站的資料庫

指定資料新增前先清除舊資料,以避免資料重複,最後按下「執行」,下載 SQL 檔


檔案匯出

使用 FTP 工具,或 VPS cPanel 提供的線上檔案工具,將 wp-content 資料夾匯出。如果 VPS 有提供線上壓縮功能,可以先將該資料夾壓縮,再下載壓縮檔,以節省檔案下載的時間


新建環境

在新站建立全新的 WordPress 環境,某些 VPS 會提供一鍵安裝的功能來安裝 WordPress,或者可直接從 WordPress 官網下載安裝檔來安裝

資料匯入

登入新站的 phpMyAdmin,使用「匯入」功能,將剛才從舊站匯出的 SQL 資料檔上傳,選擇不要自動遞增,然後按下「執行」開始匯入


檔案匯入

使用 FTP,或 VPS cPanel 提供的線上檔案工具,將舊站的 wp-content 資料夾上傳到新站,並覆蓋原先的檔案

設定網址

如果要搬遷的 WordPress 有自訂網址,請將網址指向新站
如果沒有自訂網址,則要從 phpMyAdmin 將 wp_options table 的 siteURL 和 home 修改成新站 VPS 提供的網址。





分類:

[iOS] 使用 AVSpeechSynthesizer 實現文字轉語音 (TTS) 功能

iOS 7 開始提供 TTS(Text to Speech) API,可以實現文字轉語音的功能。

範例程式畫面如下,由 Text Field 和 Button 組成的簡單畫面。
首先要在專案中加入 AVFoundation.framework 這個函式庫
然後開始撰寫程式,要先匯入 AVFoundation 函式庫
import AVFoundation
Button 的程式碼如下:
let synth = AVSpeechSynthesizer()
    var myUtterance = AVSpeechUtterance(string: "")
 
    @IBAction func textToSpeechButton(_ sender: UIButton) {

        myUtterance = AVSpeechUtterance(string: txtFieldText.text!)
        myUtterance.rate = 0.4
        myUtterance.pitchMultiplier = 1.2
        myUtterance.postUtteranceDelay = 0.1
        myUtterance.volume = 1
        myUtterance.voice = AVSpeechSynthesisVoice(language: "zh-TW")
        synth.speak(myUtterance)
        
    }
utterance 可用的屬性如下,上面的數值已經是經過調整後,聽起來較正常的聲音:
  • rate:發音速度,數值越大讀的越快
  • pitchMultiplier:音高
  • postUtteranceDelay:讀完一段話後的停頓時間
  • preUtteranceDelay:讀一段話之前的停頓時間
  • volume:音量
  • voice:使用的聲音(可以指定不同語系的語言)
完成以上的程式,模擬器已經可以正常運作,可是實體機仍沒有聲音,要讓實體機有聲音,請在 viewDidLoad 加入以下程式碼
do{
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)         
            do{
                try AVAudioSession.sharedInstance().setActive(true)
            }catch{
                
            }
        }catch{
            
        }

完整程式碼如下

分類:

[iOS] CocoaPods 套件管理工具的安裝

最近終於決定踏入 iOS 開發的領域,要寫 iOS,除了要有一台 Mac 之外,還得要安裝 4.43 GB 的 Xcode。然而,Xcode 不像 Android Studio 使用 Gradle 做套件管理和自動化建置,它需要依靠第三方工具來做套件管理,較著名的是 CocoaPods。

安裝 CocoaPods

在安裝之前,請執行下面的指令,先將 Ruby 升級到最新版本
sudo gem update --system

然後開始安裝 CocoaPods
sudo gem install cocoapods

這樣就裝好了

設定 CocoaPods

完成安裝之後,要執行下面的指令,
pod setup
你會發現,它會停在「Setting up CocoaPods master repo」沒有反應,其實背後是在執行程式下載的動作。

也可以使用 --verbose 參數,顯示安裝過程
pod setup --verbose
等待約十五分鐘才會執行完畢,這個設定的動作是將程式下載到 /.cocoapods 目錄下,可以查看這個目錄的大小,有 852 MB!


參考資料:[StackOverflow] Pod install is staying on 「Setting up CocoaPods Master repo」

開始使用 CocoaPods 管理套件

首先,在專案根目錄下執行以下指令,它會自動生成 Podfile 設定檔
pod init
使用文字編輯器編輯 Podfile,加入你要使用的第三方套件。

最後執行安裝指令。
pod install
需等待一段時間,套件會被安裝到 /Pod 目錄下,還會產生 XXX.xcworkspace 檔案,之後要開你的專案就要選這個檔案,不是 XXX.xcodeproj。

分類:

[Android] 使用 Calligraphy 自訂字型

要更改 Android App 的字型,正常的做法是使用 setTypeface,改變 TextView 的字型。可是一旦要變更的 TextView 很多的時候,修改起來相當費時。

Calligraphy 這個函式庫使用注入的方式,自動尋找 Activity 中 TextView,並設置其使用的字型。

先安裝函式庫,然後將你要變更的字型檔放到 assets/ 目錄下
dependencies {
    compile 'uk.co.chrisjenx:calligraphy:2.2.0'
}

在 Application 的 onCleate 初始要使用的字型
@Override
public void onCreate() {
    super.onCreate();
    CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
                     .setDefaultFontPath("fonts/Roboto-Regular.ttf")
                     .setFontAttrId(R.attr.fontPath)
                     .build()
            );
    //....
}
然後在 Activity 的 attachBaseContext 方法中注入 CalligraphyContextWrapper。
@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}

這個 Activity 中的 TextView 字型就會全部改變了,如果有 BaseActivity 的話,建議加在 BaseActivity。

分類:

GTmetrix 網站檢測工具

GTmetrix 是一個線上的網站檢測分析工具,它在全世界 7 個地區(香港、雪梨、巴西聖保羅、溫哥華、美國達拉斯、倫敦、印度孟買)佈建 13 台伺服器。透過這些伺服器的分析,提供使用者效能最佳化的建議。

GTmetrix 首頁可以直接輸入網址分析。首頁的測試只能使用溫哥華的主機,以及 Firefox 瀏覽器做測試。如果要使用其他地區的主機,和 Chrome 瀏覽器測試的話,要另外申請帳號登入做測試。

測試結果有兩個分數:PageSpeed Score 和 YSlow Score,分數越高越好。在下方會列出建議修改的項目。

用帳號登入後,可以選擇測試伺服器的地區、欲測試的瀏覽器種類、以及連線類型

GTmetrix 可以設定定期監控某個網站,當監控值分數過低時會發通知,不過免費版本只能選用溫哥華的測試伺服器。檢測頻率則可選擇每天、每週或每月。


這個網站還有一個有趣的功能,它會檢測 Google 公布的前一千大網站


GTmetrix 也有提供 REST API,可與外部系統整合。因此我們可以整合至 CI 系統,當程式部署之後,可以馬上執行 GTmetrix 檢測。



分類:

[Android] MultiDex

因為前陣子的程式做了重構,加入了 RxJava 相關函式庫,導致 App 內的 Method 總數超過 64435 個,導致 App 無法編譯,於是參考 Google 建議的做法,解決這個問題。
在 App 層級的 build.gradle 加入 multiDexEnabled true
android {
    compileSdkVersion 21
    buildToolsVersion "21.1.0"

    defaultConfig {
        ...
        minSdkVersion 14
        targetSdkVersion 21
        ...

        // Enabling multidex support.
        multiDexEnabled true
    }
    ...
}
如果 App 支援 Android 4.x 的話,要額外做以下的步驟,否則會出現以下的錯誤。
Exception java.lang.NoClassDefFoundError: rx.plugins.RxJavaHooks
rx.Observable.create (Observable.java:98)
retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$SimpleCallAdapter.adapt (RxJavaCallAdapterFactory.java:233)
retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$SimpleCallAdapter.adapt (RxJavaCallAdapterFactory.java:219)
retrofit2.Retrofit$1.invoke (Retrofit.java:147)
首先要引用 Multidex 函式庫
compile 'com.android.support:multidex:1.0.1'
然後,在 Application class 要改成繼承 MultiDexApplication
public class BaseApplication extends MultiDexApplication {
...
}
如果 Application 已繼承自定的方法,也可以直接覆寫 attachBaseContext 方法
@Override 
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base); 
    MultiDex.install(this);
}

結語

Android 的第三方函式庫固然好用,畢竟不用自己造輪子,可是用多了第三方函式庫的話,很容易超過 Android 64K 方法數的限制。即便用了 MultiDex 突破 64K 方法數的限制,可是 MultiDex 可能會有 App 啟動時間過長的問題,在使用前還是事先要評估一下,拿掉不必要的第三方函式庫,也許才是正解。

參考資料


分類:

PHP + MySQL 的 VPS 免費虛擬主機

Byethost 和 000webhost 這兩家都是經營多年的 VPS 虛擬主機供應商,也提供相當不錯的免費方案,我將這兩家的免費方案(2016 年 10 月)列表整理如下。

Byethost 000webhost
檔案空間 1 TB 1.5 GB
每月流量 50 GB 100 GB
每日請求數 50000 無上限
支援 FTP
支援 Cron Job
phpMyAdmin
後台 CPanel CPanel
MySQL 資料庫 5 個 無上限
自訂網域 最多5個 無上限
PHP版本 5.6.32 5.2.x
MySQL版本 5.6.30 5.1.x

000webhost 的系統版本稍舊,檔案空間只能算堪用,可是它每個月的流量較多,也沒有每天請求數的限制。Byethost 則是 1TB 的大容量空間非常吸引人。 我在這兩家 VPS 都試裝過 WordPress,搭配 CloudFlare,連線速度和穩定度都不錯。如果對流量的要求大於空間的話,建議使用 000webhost

對於有架設網站需求的朋友,雖然不少人推薦使用 WixWeebly 之類,號稱快速架站的 Website Builder,但這些網站免費帳號提供的服務,不但不能自訂網域,也有流量上的限制,還不如申請免費的虛擬主機自行架站,也較有主控權。


分類:

使用 Vysor 在電腦上控制 Android 裝置

市面上有很多工具(例如之前介紹過的 Anrdoid Tool for Mac)都能將 Android 裝置畫面投射到電腦上,但這些工具的投射方式,多半使用 ADB 不斷對 Android 裝置截圖,再將截圖畫面傳送到電腦,讓用戶在電腦上感覺到 Android 裝置在操作,而這些工具無法從電腦上控制 Android 裝置。

這裡介紹 ClockworkMod 創辦人及主要開發者 Koush,開發的 Vysor

安裝

首先,在手機上安裝 Vysor App

然後在電腦上的 Chrome 瀏覽器安裝 Chrome App (個人猜測大概有用到 Chrome Remote Debugging

Windows 平台需要額外安裝 ADB Driver

手機

在手機上安裝 Vysor App 之後,就開啟它。這個 App 只是做連線之用,沒有與使用者互動的功能。只要隨著它的指示跟著操作即可。

首先是歡迎畫面

然後要打開手機上的 USB Debugging,可以從「Open Developer Options」開啟「開發人員選項」去開啟「USB Debugging」

使用 USB 線連接電腦

完成第一次設定後,以後如果要使用 Vysor,手機接上電腦,然後從電腦端的 Chrome App 開啟,就會自動完成連線,不需要從手機端開啟 Vysor App。

Chrome

打開 Chrome 瀏覽器上的 Vysor App

點選「Find Devices」

此時,Vysor 應會找到你連接至電腦的 Android 裝置。如果沒有找到裝置,可以參考這裡的故障排除方法。

選取裝置之後,Android 裝置會出現安全警示訊息,按下確定即可。

如果出現這個畫面,表示 Android 裝置成功連結到手機。

然後,就可以從電腦觀看或操作 Android 裝置了

結語

Vysor 可以將 Android 裝置的畫面投射到電腦,不但操作非常流暢,而且可以從電腦端操作 Android 裝置,非常適合 Demo 簡報時使用。或者打電動時,覺得手機操控不方便,也可以投射到電腦來操作。


分類: ,

[Mac] 使用 QuickTime Player 的螢幕錄製功能

不同於 Windows,Mac 內建的 QuickTime Player 有「螢幕錄影」功能,因此不用再安裝其他軟體,就能將電腦上的操作步驟錄影下來。

螢幕錄製

直接從應用程式開啟「QuickTime Player」

從上方工具列開啟「檔案 > 新增螢幕錄製」

然後會出現螢幕錄製的小工具

螢幕錄製預設是關閉麥克風,如果要錄聲音,要將麥克風選項選擇「內建麥克風」

然後按下中間的紅點按鈕,開始錄製

錄製之前,如果只要錄製部分的螢幕,直接用滑鼠將你要錄製的部分選取

然後按下「開始錄製」,就會開始錄影了

從工具列的「QuickTime Player」按滑鼠右鍵,選擇「停止螢幕錄製」,就會停止錄製

mov 檔轉 mp4 檔

使用 QuickTime Player 錄製出來的影片是 mov 格式,mov 格式檔案會很大,不利於網路傳輸。此時可以用 Mac 內建的功能,將 mov 格式的影片檔轉檔成 mp4 格式。

選擇要轉檔的 mov 檔,按滑鼠右鍵,選擇「為所選的影片檔案編碼」

此時會出現編碼媒體視窗,將 Setting 改選為「720p」,按下「繼續」,就開始轉檔了

轉檔後會產生 m4v 副檔名的檔案,可以直接把副檔名 m4v,改成 mp4 

同場加映:mov 檔案合併

Mac QuickTime Player 可以將多個 mov 檔案合併成一個檔

先開啟第一個影片檔,再將要合併的檔案依序拖曳到第一個影片檔,第一個影片檔下方會出現一個小視窗,顯示合併進來的影片檔內容,待全部拖曳之後,按下「完成」,然後儲存檔案,就完成檔案的合併。



分類:

[Android] Firebase Remote Config

Firebase 稍早時推出新版函式庫(可參考這篇文章的介紹),其中 Remote Config 能讓開發者將系統參數設定在 Firebase 後台,App 會存取遠端的參數設定。當有任何參數異動時,只要修改雲端的參數設定,其參數值馬上會在 App 端生效。

同樣是將資料儲存在 Firebase 後台,Firebase Remote Config 和 Firebase Database 最大的不同是,因為參數值不像一般的資料,其變動性不大,不需要隨時存取。因此 Remote Config 有 Cache 的機制,預設 expiration time 是 12 個小時(這個值是可以變更的),12 個小時內都會從 local 端取得未過期的資料,超過 12 個小時後 App 執行時,才會再向 Firebase 後台要一次資料。若伺服器端的參數值已變更並重新發佈,仍要等待 Cache 過期後,新的參數值才會生效

因為涉及資料安全,Google 建議 Remote Config 的參數不要放例如使用者認證資料、序號等敏感性資料。

Remote Config 設置

登入 Firebase Console,進入應用程式專案的「Remote Config」 ,新增第一個參數。

自訂參數名稱及參數值,目前支援五種資料型態的參數:Boolean、ByteArray、Double、Long、String。

增加參數後,按下「發佈變更」就立即生效。日後如果要更改參數值,一樣要從這裡發佈變更。

程式

在 App 端程式的部分,首先要加入 Firebase Remote Config 函式庫。
compile 'com.google.firebase:firebase-config:9.6.0'

然後參考下面的範例程式,從 Firebase 取得參數值。addOnCompleteListener 中的 onComplete方法,即使在無網路之下也會執行,因此可以直接將取得參數值之後的動作寫在這裡。


設定參數條件

Remote Config 的參數,還可以設定條件針對部分裝置生效,可用於 A/B 測試和階段性上線(Gradual Rollouts)。

從參數設定的右上方「新增條件的值」進入

可以定義這個參數的條件,條件可定義不只一個。

參考資料

分類: ,

免費 VPN(美國和英國 IP)

雖然不是每個國家都和中國一樣,需要「科學上網」,才能瀏覽被 GFW 封鎖的網站。有些時候仍會遇到,國外的網站限制境內 IP 才能使用服務。

newipvpn.com 這個網站提供免費且無線流量的 PPTP VPN,更好康的是,什麼都不必申請,只要在電腦或手機的 VPN 功能,設定他們的帳號就行了

美國和英國的帳號密碼分別如下


我曾經用這個 VPN 觀看英國 BBC 網站的節目,連線品質還算可以接受,不過這種免費的 VPN,不會進行連線加密,使用時要注意安全。


分類:

[Android] Realm Tips

紀錄一下最近使用 Realm 開發的心得。如果不知道 Realm 是什麼的話,請參考這篇文章

deleteRealmIfMigrationNeeded

Realm 若更動了 Table Schema,就要作 Migration 的動作,否則應用程式會因為錯誤而強制退出。可是如果應用程式使用 Realm 當作例如快取等不重要資料的儲存媒介,每次更動 Schema 都要 Migration,反而是多此一舉。此時可以在設定 Realm 時開啟 deleteRealmIfMigrationNeeded。當有需要 Migration 時,會自動重建 Realm Object。

交易 Transaction Block

當 Realm 執行新增和刪除動作時,必須要用 realm.beginTransaction 和 realm.closeTransaction 確保交易正確執行。現在多了 Transaction Block 的方法,可以將要執行的動作寫在方法裡。Transaction Block 還分為同步(executeTransaction)和異步交易(executeTransactionAync),異步交易會回呼成功和失敗。

Realm + RxJava

Realm 從 0.87 版開始支援 RxJava,可以運用 Realm ORM 的特性,結合 RxJava 的數據流特性,讓程式碼更精簡。下面的範例是將資料從資料庫取出後,轉換型態為 List。然後將 Ream 的 Person 物件當作被觀察者,當被觀察者異動(本例是查詢資料),便觸發後續的動作(本例是將查詢出的資料顯示在 ListView,然後逐筆查詢個別 Person 的 GitHub 資料,並將結果更新 ListView。

分類: ,

[Android] 地點自動完成 Google Places Autocomplete API

Google Place API 是 Google Map API 成員之一,結合地點與商家資訊,提供用戶指定地點附近的資訊,市場上同類的 API 還有 YelpFourSquare

Google Places API

目前 Android 支援的 Google Place API 共有三大功能:
  • 地點挑選器(Place Picker):在地圖上顯示挑選地點附近的商家資訊
  • 目前地點(Place Detection):自動偵測目前所在位置,並顯示附近商家
  • 地點自動完成(Place Autocomplete):輸入部分地點字串後,會回傳符合條件的相關地點資訊,可以搜尋商家名稱、景點、地理位置(例如國家、城市)等資訊
要使用 Google Place API,必須從 Google Developers Console 註冊 Google Places API for Android 的 API Key,Android API 的流量限制是每天 1000 筆請求,超過就要計費。

把申請好的 API Key 加入 AndroidManifest.xml
<application...>
        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="xxxxxxxxxxxxxx"/>
        </activity>
</application>

然後加入 Google Play Services 套件
compile 'com.google.android.gms:play-services-places:9.x.x'

Google 的 GitHub 上,有 Google Places API for Android 的範例程式 可參考!

地點自動完成

Google Places API 本身有 Rest Web Service,然而 Android 版本的 API 已經做了包裝,不需要再做網路請求與解析 JSON 資料的動作,這些 API 都已經幫我們做好了。

先增加一個 AutocompleteTextView Layout
<AutoCompleteTextView
    android:id="@+id/autocomplete"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:hint="@string/search_city_hint"
    android:singleLine="true" />

在程式的部分,新建一個 Google API Client
GoogleApiClient googleApiClient = new GoogleApiClient.Builder(this)
                .addApi(Places.GEO_DATA_API)
                .build();

然後需要一個 PlaceAutocompleteAdapter 作為資料顯示的容器,程式碼可以從 Google 範例程式取得,可以直接複製使用。
如果想限制自動完成的結果,可以定義 AutocompleteFilter,再將其傳入 PlaceAutocompleteAdapter,下面的範例是只顯示「城市」。更多篩選類型可參考 Google 文件
AutocompleteFilter filter = new AutocompleteFilter.Builder()
          .setTypeFilter(AutocompleteFilter.TYPE_FILTER_CITIES)
          .build();

adapter = new PlaceAutocompleteAdapter(this, android.R.layout.simple_list_item_1, googleApiClient, null, filter);

以下是執行的結果,也可輸入中文,Google 會自動根據裝置的語系,回傳相對應的名稱。

以下是完整的程式碼

分類:

銀河便車指南

「銀河便車指南」,英文原名「The Hitchhiker's Guide to the Galaxy」(簡稱 H2G2),是英國作家道格拉斯 - 亞當斯(Douglas Adams)在 1979 年間發表的科幻小說,全書共六個系列。這本書的故事情節在 2005 年被拍成電影「星際大奇航」,BBC 也在 1981 年推出電視劇。這本書曾獲得英國 BBC「大閱讀」票選第四名。

分類:

[Android] LeakCanary 檢測記憶體洩漏的工具

在 Android 開發的過程中,時常會遇到某些狀況(通常是網路或資料庫存取),導致物件要作的事情完成了,但沒有正確被回收掉。此時,這個沒被回收的孤兒,就會佔用記憶體,造成記憶體洩漏,也就是一般常說的 Memory Leak。發生 Memory Leak,會發生效能問題導致 Out of Memory、造成 Force Close、甚至可能造成安全問題。

過去在 Eclipse IDE 時代,Eclipse 有推出一個叫做 MAT 的記憶體分析外掛,搭配 Android DDMS 來檢測記憶體洩漏的問題。

在 Android Studio 的時代,Square 這間公司(沒錯,就是推出 okhttpRetrofitPicasso 等一系列知名函式庫,也是大神 Jake Wharton 任職的公司)推出了 LeakCanary 套件,直接安裝在 App 上,藉由在測試環境,以 debug 模式來找出程式中記憶體洩漏的問題。

首先,在 build.gradle 引入下面三個套件,它會藉由 Gradle 的特性,在不同的建置方式,會抓不同的套件。這樣就可以,只在 debug 時正常安裝 LeakCanary 套件,而在 release 到正式環境時,安裝另一個不執行 LeakCanary 檢測的套件。
dependencies {
   debugCompile 'com.squareup.leakcanary:leakcanary-android:1.4-beta2'
   releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2'
   testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2'
 }

然後在 Application 加上一行程式碼。就這樣,夠簡單吧!
public class ExampleApplication extends Application {

  @Override public void onCreate() {
    super.onCreate();
    LeakCanary.install(this);
  }
}

因為 LeakCanary 只在 debug 模式下執行,因此只能在模擬器執行,要在實績執行的話,則要用 Android Studio 包裝不含 sign 的 debug apk 檔,然後手動安裝到實績上。

將 App 安裝在模擬器之後,LeakCanary 會自動安裝一個叫做 Leak 的 App 在模擬器上,之後,在手動測試 App 的過程中,如果 LeakCanary 檢測到記憶體洩漏,除了會以通知方式呈現之外,也會將檢測結果紀錄在這個 App 上。

如果 LeakCanary 檢測到記憶體洩漏,會如下畫面以圖形方式將結果呈現(圖片取自官網)。

正常來說,LeakCanary 只會在 debug 模式下執行。因此要將 App release 上架,可以放心的使用 release 來建置 apk。如果還是擔心 LeakCanary 會在正式環境執行,造成用戶困擾的話,也可以在建置之前先把相關程式移除,反正只有一行程式碼。

關於 Leak Canary 的教學與說明,可觀賞 用 LeakCanary 检测内存泄漏 影片(內附中文翻譯)




分類:

Copyright © Andy Cheng

Distributed By My Blogger Themes | Blogger Theme By NewBloggerThemes Up ↑