1. 程式人生 > >Android應用程式簽名打包,混淆程式碼時報錯的處理方法

Android應用程式簽名打包,混淆程式碼時報錯的處理方法

看了很多關於如何解決android應用程式打包出錯的帖子,試用之後,發現並不能完全解決我所遇到的問題。糾結了幾天,終於解決了我所遇到的問題,現將處理方法寫出來以備自己日後查閱,也為遇到相同問題的朋友提供一點思路。

在我的程式中使用到了ksoap2.jar,關於這個Jar包的使用這裡不再說明,網上有很多資料。如果要訪問WebService服務,使用這個庫會很方便。

使用Eclipse在工程目錄下新建一個lib目錄,將這個Jar包放進去,右擊選擇Build Path--->Add to Build Path

之後會在工程目錄下生成一個Referenced Libraries目錄,裡面有剛剛新增進去的Jar包

再次右擊該Jar包,選擇Build Path--->Configure Build Path

在Order and Export選項卡中將剛剛新增進來的Jar包勾選中,OK退出。不勾選的話編譯不會報錯,執行時會報錯。

Could not find class 'org.ksoap2.serialization.SoapObject', referenced from method xxx

下面就是要開啟程式碼混淆的功能,預設情況下是關閉的。

在project.properties檔案的末尾加上:

proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt::proguard-project.txt

網上都說加上:proguard.config= proguard.cfg,但是我的工程中並沒有找到proguard.cfg檔案,但是在工程目錄下有一個proguard-project.txt,開啟它會發現裡面的內容和proguard.cfg的內容差不多,所有不必為沒有proguard.cfg檔案而糾結,也不需要手動建立一個,使用proguard-project.txt就可以了。

接下來就是匯出apk,選擇檔案Export--->Export  Android  Application,其他的按照提示進行操作就可以了,如果是第一次匯出的話,需要為該程式建立一個keystore,上面都設定好了之後就直接點選Finish,等待匯出完成。

但是匯出的過程並沒有那麼的順利,可能會彈出如下提示:

提示程式碼混淆時發生錯誤,錯誤程式碼為1,讓檢視控制檯輸出資訊,控制檯輸出如下:

Proguard returned with error code 1. See console
Note: there were 4 duplicate class definitions.
Warning: library class android.content.res.XmlResourceParser extends or implements program class org.xmlpull.v1.XmlPullParser
Warning: library class android.content.Intent depends on program class org.xmlpull.v1.XmlPullParser
Warning: library class android.content.IntentFilter depends on program class org.xmlpull.v1.XmlSerializer
Warning: library class android.content.IntentFilter depends on program class org.xmlpull.v1.XmlPullParser
Warning: library class android.content.res.ColorStateList depends on program class org.xmlpull.v1.XmlPullParser
Warning: library class android.graphics.drawable.Drawable depends on program class org.xmlpull.v1.XmlPullParser
Warning: library class android.graphics.drawable.Drawable depends on program class org.xmlpull.v1.XmlPullParser
Warning: library class android.graphics.drawable.Drawable depends on program class org.xmlpull.v1.XmlPullParser
Warning: library class android.view.LayoutInflater depends on program class org.xmlpull.v1.XmlPullParser
Warning: library class android.view.LayoutInflater depends on program class org.xmlpull.v1.XmlPullParser
You should check if you need to specify additional program jars.
Warning: there were 10 instances of library classes depending on program classes.
	You must avoid such dependencies, since the program classes will
	be processed, while the library classes will remain unchanged.
	java.io.IOException: Please correct the above warnings first.
	at proguard.Initializer.execute(Initializer.java:321)
	at proguard.ProGuard.initialize(ProGuard.java:211)
	at proguard.ProGuard.execute(ProGuard.java:86)
	at proguard.ProGuard.main(ProGuard.java:492)

大概意思是說發現有4個完全相同的類定義。

網上的解決辦法是在proguard.cfg檔案中新增如下兩行程式碼遮蔽警告:

-dontwarn org.xmlpull.v1.XmlPullParser

-dontwarn org.xmlpull.v1.XmlSerializer

新增這兩行程式碼的確是遮蔽了警告,而且也成功的匯出了apk檔案。

如果你的程式中只是使用到了ksoap2來呼叫WebService的話,可能不會有問題。但是,

如果程式中使用了ksoap2來呼叫WebService服務,在其他地方又使用的XmlPullParser來解析xml文件的話,程式執行到解析xml的是否就會出現如下問題:

W/System.err(427): caused by: a.c.a.b: resource not found: /META-INF/services/org.xmlpull.v1.XmlPullParserFactory make sure that parser implementing XmlPull API is available; nested exception is:
a.c.a.b: resource not found: /META-INF/services/org.xmlpull.v1.XmlPullParserFactory make sure that parser implementing XmlPull API is available

會導致解析xml時丟擲異常,得不到正確的解析結果,但是程式不會崩潰。

這是由於Android系統中已經整合XmlPullParser類,在ksoap2中也有這個類(之前匯出時提示類重複定義的資訊已被遮蔽),在混淆程式碼時產生了衝突,導致Android系統不知該如何處理,就丟擲了異常,自己的理解,理解的不對的話歡迎交流。

這是ksoap2庫中的包。

進入xmlpull--->v1

這是一個很頭疼的問題,後來查了很多資料,找到了解決辦法。

2.       去掉之前在proguard-project.txt檔案中新增的遮蔽警告的程式碼,並且新增

-libraryjars lib/kxml2-2.3.0.jar到該檔案中,此kxml2.Jar包不需要新增到Build Path中,就直接放在lib目錄中就可以了;

3.       再次匯出apk,匯出的過程中又會報錯,資訊如下:

Proguard returned with error code 1. See console
Note: there were 19 duplicate class definitions.
Warning: library class android.content.res.XmlResourceParser extends or implements program class org.xmlpull.v1.XmlPullParser
Warning: library class android.content.Intent depends on program class org.xmlpull.v1.XmlPullParser
Warning: library class android.content.IntentFilter depends on program class org.xmlpull.v1.XmlSerializer
Warning: library class android.content.IntentFilter depends on program class org.xmlpull.v1.XmlPullParser
Warning: library class android.content.res.ColorStateList depends on program class org.xmlpull.v1.XmlPullParser
Warning: library class android.graphics.drawable.Drawable depends on program class org.xmlpull.v1.XmlPullParser
Warning: library class android.graphics.drawable.Drawable depends on program class org.xmlpull.v1.XmlPullParser
Warning: library class android.graphics.drawable.Drawable depends on program class org.xmlpull.v1.XmlPullParser
Warning: library class android.view.LayoutInflater depends on program class org.xmlpull.v1.XmlPullParser
Warning: library class android.view.LayoutInflater depends on program class org.xmlpull.v1.XmlPullParser
	You should check if you need to specify additional program jars.
	Warning: there were 10 instances of library classes depending on program classes.
	You must avoid such dependencies, since the program classes will
	be processed, while the library classes will remain unchanged.
	java.io.IOException: Please correct the above warnings first.
	at proguard.Initializer.execute(Initializer.java:321)
	at proguard.ProGuard.initialize(ProGuard.java:211)
	at proguard.ProGuard.execute(ProGuard.java:86)
	at proguard.ProGuard.main(ProGuard.java:492)

還是說類重複定義,這是由於ksoap2.Jar包與kxml2.Jar包中有重複定義的類,解決辦法就是去掉ksoap2.jar中與kxml2.jar重複衝突的類。 

去掉以下內容:META-INF\maven\net.sourceforge.kxml、META-INF\maven\org.xmlpull、services、org\kxml2、org\xmlpull

然後,重新將ksoap2.jar拷貝到lib目錄下覆蓋原來的jar檔案,clean一下工程,重新匯出apk即可。

總之,要注意console的輸出資訊,多google一下,不過好多網頁都打開不了,不過我相信你會有辦法的,大家懂得!