Android 隱藏 signing config

其實官方網站有介紹過做法,不過就令到 build 那時一定要有 keystore.properties,否則就不能 build。部分 CI 可能會針對 Android 會提供專門的方式來設定 release keystore 和密碼。而在 VCS checkout source code 後在 file system 補上 keystore.properties 和 keystore 未必可以在 CI 環境上做到。所以我將那個教學稍作改動,令到當 keystore.properties 不存在時就不提供 signing config,使它能 build 未加簽的 apk,然後才讓 CI 加簽 apk。

build.gradle
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
apply plugin: 'com.android.application'
// Release signing properties
def keystorePropertiesFile = rootProject.file("keystore.properties");
def keystoreProperties = new Properties()
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}
android {
compileSdkVersion 25
buildToolsVersion '25.0.2'
defaultConfig {
applicationId "com.example.helloworld"
minSdkVersion 16
targetSdkVersion 25
versionCode 1
versionName "1.0"
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
signingConfigs {
debug {
storeFile file("../app/debug.keystore")
storePassword "android"
keyAlias "androiddebugkey"
keyPassword "android"
}
if (keystorePropertiesFile.exists()) {
release {
storeFile file(keystoreProperties['storeFile'])
storePassword keystoreProperties['storePassword']
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
}
}
}
buildTypes {
debug {
debuggable true
minifyEnabled false
signingConfig signingConfigs.debug
}
release {
minifyEnabled true
shrinkResources true
if (keystorePropertiesFile.exists()) {
signingConfig signingConfigs.release
}
}
}
}
dependencies {
// ...
}
keystore.properties
1
2
3
4
storeFile = ../app/release.keystore
storePassword = mypassword
keyAlias = myalias
keyPassword = mypassword

Spek

之前一直都有留意 Kotlin 這個程式語言在 Android app 開發的應用。最近試用 Spek 來做 Android project 的 local test。Spek 是一個用 Kotlin 寫的 testing framework,用法和 Ruby 的 RSpec 差不多。對比 Android project 預設用的 JUnit 4,Spek 的寫法會比較清楚。因為 JUnit 4 只靠 class 和method 來為 test 分類,不能 nested(JUnit 5 才支援)。Spek 就用 nested 的方式來把 test 分類,還有就是用 string 來定義 test 名,比起 JUnit 4 用 method 名較易閱讀。

Spek 有提供 IntelliJ IDEA/Android Studio plugin,而且還有 JUnit platform engine。所以在 Android project 上面使用都沒有太大問題。

Read More

小米藍牙手柄

之前提及過只需要在 Windows 安裝 mapper 就能將小米藍牙手柄模擬成 Xbox 360 手掣,試過之後確實可以用到。在 The Crew 可以用手掣操作,在刹掣時手掣還會震動,比起在 Android 用功能還多。

除了 desktop game 之外,原來 HTML5 有 Gamepad API。我特別在 HTML5 Gamepad Tester 試了一次(未有用 Xbox mapper)。

  • Vendor ID: 2717
  • Product ID: 3144

其他按鍵的 keycode 可以看下面的影片:

小米盒子國際版開箱

小米盒子相信大家都聽過,亦都可能用過。不過這次小米香港推出的是「國際版」,用的是包含 Google Services 的 Android TV 而不是客製化的 Android。這個就是國際版和中國版的最大分別,這亦都是應否購買小米盒子國際版的主要考慮因素。

小米盒子國際版

Read More

nodetree 和 jazzy

這次想介紹兩個 documentation 相關的工具﹔nodetreejazzy

nodetree 是用來生成 ASCII 樹狀目錄結構圖。先前一篇有關 iOS 的文章就是用 nodetree 生成相關的樹狀目錄結構圖。它的用法非常簡單,只需要輸入 nodetree 指令就能印出目前目錄的結構。

而 jazzy 就是一個 Swift 和 Objective-C 的文檔生成器。它和 Java 的 JavaDoc 功能相近,都是按照源碼檔案中以特定格式輸入的註解來生成 HTML 網頁。如果是 Objective-C 的話,註解形式和 JavaDoc 相近。而生成出來的 HTML 網頁外觀和 Apple 官方的 API documentation 非常相似。如果不喜歡的話還可以自訂範本。

Android Pay 登陸香港

之前有傳聞在今個月推出的 Android Pay 終於在昨日正式登陸香港。目前支援滙豐、恆生、渣打、東亞、星展及大新銀行的 Visa 及 MasterCard 信用卡,Tap & Go 都可以加入去 Android Pay。我有一張恒生 Visa 和一張中銀 MasterCard,但因為不支援中銀的關係只可以加入恒生信用卡。

除了信用卡,Android Pay 可以加入會員卡。這個功能就是用來儲存會員卡的條碼,Android Pay 是不會檢查會員卡號碼的真確性。在付款前可以在電話展示條碼。這樣就可以不用帶太多會員卡,而且還會在你經過商鋪時提醒你可以用會員卡。不過有人在 759 阿信屋試過被職員拒絶,要他一定要出示實體會員卡。

Read More

自己造一個 CocoaPods Framework Pod

最近工作需要將一個 tvOS app 的某些 class 抽出來變成能被 CocoaPods 安裝的私家 close source framework 讓其他人用。我都是第一次做 framework,在網上的教學主要都是教純 Xcode 的做法和使用 CocoaPods 下載 project dependency,詳細提及如何造一個 CocoaPods Pod 就比較少人寫。所以就寫出來跟大家分享。

Read More

xUnique

Xcode project 有個特色就是 VCS unfriendly。例子有 project.pbxproj 會有自動產生的 hash 和開啟 xib、storyboard 時不論有沒有修改過內容都好 Xcode 還是自動會將 macOS 和 Xcode 版本寫入。如果是 xib、storyboard 的版本問題就不難解決,因為比較難出現 conflict。但 project.pbxproj 就很容易 conflict。這是因為 Xcode project 和 Java 之類的 project 不同,Xcode 是可以讓 user 自訂 project 檔案排序,還有就是可以讓 user 決定那些檔案是屬於 project 的一部分,不是純綷只定義 file system 的某幾個資料夾就是 project 的一部分。然而這個特色卻容易出現 merge conflict。只要你和另一個組員在 Xcode file tree 同時將檔案排列次序改變,那就會在 merge 時出現 conflict。尤其是在前期開發時因為不時要開新檔案,會令 conflict 更容易出現。而解決 conflict 又特別麻煩,因為 project.pbxproj 的設計是讓 Xcode 讀,不是讓人去閱讀。

而解決 project.pbxproj 容易出現 VCS conflict 的方法就是用 xUnique。它是一個 Python 寫的 script,它會將 project.pbxproj 的所有項目的 UUID 都改用 MD5 hash;而項目都會以英文字母順序排列好。這會確保 UUID 的產生方式和檔案排列次序一致,不會再有個人色彩。這樣就能減低 merge conflict 的機會。

留意 xUnique 要全部組員一齊用才會有效。使用方法可以將它設成 Git 的 pre-commit hook 又或者設定在 Xcode build 時執行。xUnique 暫時發現的缺點就是在執行完 xUnique 後如果令 project.pbxproj 有改動的話 Xcode file tree 的資料夾都會被摺疊,之後要再人手展開才可以回復先前的狀態。

註:在寫這篇文時看到解決 storyboard merge conflict 可以用 StoryboardMerge

在 Android app 內顯示 Git commit hash

有些 Android app 除了顯示版本號碼之外,還會有該版本的 Git commit hash。如果有好幾部測試機做測試的話,可能會在開發時先後在不同的機安裝過不同版本的 app。但就沒有每次都更新版本號碼。加了 commit hash 就容易分辨 app 的實際版本。其實要顯示 commit hash 的做法不太難,不需要每次人手更改的。只需要改一下 appbuild.gradle 就可以了。

Read More