Wednesday, June 25, 2014

Conversion to Dalvik format failed with error 1的可能性

文章攢寫時間︰2014/06/26 14:53

一、問題

今天在使用正式keystore編譯Android Project輸岀成apk時,
遇到Conversion to Dalvik format failed with error 1

網路上已經提過非常多的解法,
但因為造成這個問題的原因非常多,
所以找到的solution不一定能解決問題。

二、解決辦法

這幾年遇到這個問題很容易的發生原因都是專案裡用的第3方套件在proguard時,
因為腳本沒寫齊全造成無法正常編譯成Dalvik格式導致產不了apk。

就我現在的例子來說,
我用了android的support v7兼容性套件來繪製Notification(訊息通知欄),
但我並沒有在腳本檔proguard.cfg或proguard-project.txt替support v7寫混淆腳本,
導致Conversion to Dalvik format failed with error 1。

底下附上support v4要添加的proguard腳本
-libraryjars /你的lib jar檔路徑/android-support-v4.jar
-keep class android.support.v4.** { *; }  
-keep interface android.support.v4.app.** { *; }  
-keep public class * extends android.support.v4.**  
-keep public class * extends android.app.Fragment
-dontwarn android.support.v4.**

攢寫完腳本後我就可以正常export APK檔了。

相關文章︰

Tuesday, June 24, 2014

@TargetApi 和 @SuppressLint 的差別

文章攢寫時間︰2014/06/25 14:10

Android自從加入Lint工具後,
會自動幫開發者們檢查是否在不對的版本使用超岀版本的api。
倘若此事成立,
Android Lint就會跳岀來問你要在此scope上方加上@TargetApi還是@SuppressLint。

剛才在stackoverflow論壞看到一個很有趣的解釋︰
@TargetApi(NN) says "Hey, Android! Yes, I know I am using something newer than what is allowed for in my android:minSdkVersion. That's OK, though, 'cause I am sure that I am using Build (or something) such that the newer code only runs on newer devices. Please pretend that my minSdkVersion is NN for the purposes of this (class|method)".
@TargetApi 意思是說︰「嘿!Android兄,我知道我現在正用一些比我AndroidManifest.xml裡android:minSdkVersion還要新的的API。我想這是沒問題的。因為我很確定我的編譯環境是在新的SDK和新的機器上,我minSdkVersion設那麼低其實只是假的啦(為了在Google Play上被更多人看到我的App)!

@SuppressLint, to address the same error, says "Hey, Android! Yes, I know I am using something newer than what is allowed for in my android:minSdkVersion. Quit complaining.".
@SuppressLint 則是指︰「嘿!Android兄,我知道我現在正用一些比我AndroidManifest.xml裡android:minSdkVersion還要新的的API。不要再跟我碎唸了!

Hence, given a choice of @TargetApi(NN) or @SuppressLint, go with @TargetApi(NN). There, if you start using something newer than NN -- and therefore your existing version-checking logic may be insufficient -- you will get yelled at again.
因此,如果要在@TargetApi或@SuppressLint裡做選擇,盡量選@TargetApi就是了。