Android应用程序签名打包,混淆代码时报错的处理方法

看了很多关于如何解决android应用程序打包出错的帖子,试用之后,发现并不能完全解决我所遇到的问题。纠结了几天,终于解决了我所遇到的问题,现将处理方法写出来以备自己日后查阅,也为遇到相同问题的朋友提供一点思路。

 

在我的程序中使用到了ksoap2.jar,关于这个Jar包的使用这里不再说明,网上有很多资料。如果要访问WebService服务,使用这个库会很方便。

下载地址:http://code.google.com/p/ksoap2-android/

 

使用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

 

这是一个很头疼的问题,后来查了很多资料,找到了解决办法。

1.      http://kxml.sourceforge.net/下载kxml2.jar并添加到lib目中;

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

下载地址:http://download.csdn.net/download/shlzxjp/4708356

 

然后,重新将ksoap2.jar拷贝到lib目录下覆盖原来的jar文件,clean一下工程,重新导出apk即可。

 

总之,要注意console的输出信息,多google一下,不过好多网页都打开不了,不过我相信你会有办法的,大家懂得!

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页