2014年3月13日星期四

升級 SDK Tools & ADT 22.6 後 ProGuard 錯誤的問題

升級 SDK Tools & ADT 22.6 後,從 Eclipse 輸出 Signed APK 可能出現以下錯誤:
Error: Unable to access jarfile ..\lib\proguard.jar

看起來是路徑有問題找不到 proguard.jar,解決方法如下:
到 SDK 中修改 proguard.bat 檔內容,proguard.bat 檔的位置如下:
yourSDK\tools\proguard\bin\proguard.bat

將 proguard.bat 裡面的這行
java -jar "%PROGUARD_HOME%"\lib\proguard.jar %*
修改成 proguard.jar 的絕對路徑 (SDK 路徑請依您安裝而定)
java -jar C:\yourSDK\tools\proguard\lib\proguard.jar %*
改好後再嘗試輸出 Signed APK 應該就會正常了~

參考資料:
https://code.google.com/p/android/issues/detail?id=66733

2013年9月19日星期四

升級 SDK Tools & ADT 22.2 後無法創建新專案的解法

#此問題已經在 22.2.1 版被修正,請直接用SDK Manager更新即可。

又來了~
前幾天有升級 SDK Tools & ADT 到 22.2 的開發者,應該會發現怎麼無法建立新專案了?
當建立新專案到最後一步時,會出現下面這個畫面:


Unsupported template dependency: Upgrade your Android Eclipse plugin

This template depends on the Android Support library which is either not installed or the template depends on a more recent version than the one you have installed.
Required version:
Installed version: 18

真是令人摸不著頭緒,不是才剛更新的嗎...
而且不管按 Install/Upgrade 或 Check Again 都沒效

查了一下,又有人包了。
https://code.google.com/p/android/issues/detail?id=60149#c55
不過他也提供了解決方案,只要用上面連結中#55樓提供的 activities.zip 壓縮檔,解開後置換掉 sdk/tools/templates/activities 目錄就可以了!

2013年8月13日星期二

使用<uses-feature>的注意事項

<uses-feature>最早是在Android 1.6 SDK (API Level 4)中出現的,他的用途是用來宣告App會使用到哪些軟硬體功能(比如Camera、Bluetooth、OpenGL ES version...)。不過事實上系統本身並不會去檢查這些設定,但Google Play確會用這些設定去過濾要呈現哪些App給使用者。

比如說我宣告了下面這行,表示我會使用到Camera功能。這樣Google Play就不會將我的App顯示在沒有Camera的裝置上。

<uses-feature android:name="android.hardware.camera" />

不過後來在Android 2.0 SDK (API Level 5)中,<uses-feature>多了一個屬性叫android:required。當某功能在App中是必要時要設定為trueGoogle Play就會針對該功能進行過濾。某功能是非必要時則設成falseGoogle Play就不會針對該功能進行過濾。咦...那我直接省略該功能的<uses-feature>不是更省事嗎?

在看完落落長的開發者文件後才瞭解,原來嚴格來說,每個App都應該要清楚宣告哪些功能是必要或非必要的。但因為種種原因,開發者可能忽略或未正確宣告。所以Google Play除了檢查<uses-feature>外,還會參考<uses-permission>的設定。當有設定<uses-permission>時,Google Play會假定相關的功能是必要的,並加入過濾。

舉例來說,我的App會使用到Camera,但不是必要的。為此我宣告了Camera的<uses-permission>,但省略了<uses-feature>。
<uses-permission android:name="android.permission.CAMERA" />
此時Google Play發現了這個<uses-permission>,便會將Camera視為必要而進行過濾,沒有Camera的裝置就看不到我的App了,這樣跟我想要的結果不同。

該怎麼改善呢? 只要加上Camera的<uses-feature>,並把android:required設成false即可。這樣Google Play就不會進行Camera的過濾。(<uses-feature>的優先程度高於<uses-permission>)
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
這麼一來,我的App既取得了Camera權限,而且在沒有Camera的裝置上也不會被過濾掉。