android打包apk的时候一般会选择混淆,而在eclipse中常使用的是proguard来混淆。有很多时候引用了第三方包的时候会导致打包不成功,或者打包成功不能运行的情况。

首先看看正常的proguard.cfg文件里面可以怎么写:

简单的android系统,没有第三方包

[html]  view plain copy print ?

 
  1. -injars      bin/classes
  2. -outjars     bin/classes-processed.jar
  3. -libraryjars /usr/local/java/android-sdk/platforms/android-9/android.jar
  4. -dontpreverify
  5. -repackageclasses ''
  6. -allowaccessmodification
  7. -optimizations !code/simplification/arithmetic
  8. -keep public class mypackage.MyActivity

完整的android系统

[html]  view plain copy print ?

 
  1. -injars bin/classes
  2. -injars libs
  3. -outjars bin/classes-processed.jar
  4. -libraryjars /usr/local/java/android-sdk/platforms/android-9/android.jar
  5. -dontpreverify
  6. -repackageclasses ''
  7. -allowaccessmodification
  8. -optimizations !code/simplification/arithmetic
  9. -keepattributes *Annotation*
  10. -keep public class * extends android.app.Activity
  11. -keep public class * extends android.app.Application
  12. -keep public class * extends android.app.Service
  13. -keep public class * extends android.content.BroadcastReceiver
  14. -keep public class * extends android.content.ContentProvider
  15. -keep public class * extends android.view.View {
  16. public <init>(android.content.Context);
  17. public <init>(android.content.Context, android.util.AttributeSet);
  18. public <init>(android.content.Context, android.util.AttributeSet, int);
  19. public void set*(...);}
  20. -keepclasseswithmembers class * {
  21. public <init>(android.content.Context, android.util.AttributeSet);}
  22. -keepclasseswithmembers class * {
  23. public <init>(android.content.Context, android.util.AttributeSet, int);}
  24. -keepclassmembers class * extends android.content.Context {
  25. public void *(android.view.View);
  26. public void *(android.view.MenuItem);}
  27. -keepclassmembers class * implements android.os.Parcelable {
  28. static android.os.Parcelable$Creator CREATOR;}
  29. -keepclassmembers class **.R$* { public static <fields>;}

如果加了android.support包的话,那么要加上

[html] 
view plain
copy
print
?

 

  1. -keep class android.support.**{*;}
[html] 
view plain
copy
print
?

 

  1. -dontwarn android.support.**

一劳永逸,免得打包的时候就报错。加上keep就是 告诉proguard不用混淆这个包里面的类,如果不加这个,报错会比较明显,会报出support包的错,其它的第三方的包最好也不要混淆,原样就可以了。

还有一些是打包的时候不会出错,但是在打成包之后安装运行就不行了。这时候要注意观察一下提示的信息,比如空指针异常,或者是反射的时候报错,那么这个时候要注意了,是不是实体类被混淆了。导致找不到实体类无法get或者set,那么这个时候应该做的事情是阻止proguard对实体类的混淆,比如:

[html] 
view plain
copy
print
?

 

  1. -keep public class mypackage.MyBean { public void setMyProperty(int); public int getMyProperty();}

这样的话实体类被保存下来了,就不会出现找不到的情况了,一般引用了json类的包或者orm类的包可能会有这样的错误出现。

当有注解的时候

[html] 
view plain
copy
print
?

 

  1. -keepattributes Signature
  2. -keepattributes *Annotation*

别忘了加上这两句,减少错误的发生。

如果还有一些不明的错误的话,可以试着更新一下proguard的版本,使用最新的版本。毕竟再成熟的系统也是有BUG的。好了,先总结这么多吧。晚安~!

android打包apk时混淆遇到的问题的更多相关文章

  1. Android Studio 打包APK时,出现3个或多个APK

    Android Studio 打包APK时,原来只会出现一个apk,结果现在出现3个apk,仔细检查了一下项目文件发现: Android Studio 的 buid.gradle文件里有个配置项被更改 ...

  2. ReactNative之Android打包APK方法(趟坑过程)

    欢迎大家加群讨论 点击链接加入群[ReactNative-解决问题交流群] :644124441 点击链接加入群[ReactNative技术交流群2] :687663534 多余的不解释了.直接上车吧 ...

  3. Cocos2dx打包apk时变更NDK引发问题及解决

    现在官方的Cocos Studio已经支持打包apk文件,写该随笔的时候还没试过官方的打包功能,所以就按自己的学习顺序先把打包的心得写下. 问题及最终解决方案: 其中耗时最长的问题就是ndk-r10改 ...

  4. Android Studio打包APK时出现 is not translated in "en" (English) [MissingTranslation]

    错误信息: Error:(16) Error: "baidutieba_client_inavailable" is not translated in "en" ...

  5. Cocos Creator Android打包 apk

    这一篇讲的是用 Cocos Creator 编译器打包 Android APP 的时候遇到的一些问题,虽然说打包的过程不是很复杂,但是在其中还是会遇到各式各样的坑. 我们将项目用CCC(Cocos C ...

  6. unity调用安卓打包apk时的错误unable to convert classes into dex format

    出现这种问题一般是由于有重复的文件所致,看下unity报的错误那些文件重复了,把重复的文件删了即可 例如,将eclipse中的安卓工程bin\class导出jar包时,会将下面的.class文件打包, ...

  7. React Native Android打包apk

    按照官方的5步曲: 1.在终端里面,cd 到项目的根目录后.执行下面这行命令: keytool -genkey -v -keystore my-release-key.keystore -alias ...

  8. 关于 Android导出apk时碰到的[Unable to execute dex: Multiple dex files define]

    这是一个编译错误,在ADT的编译器和SDK的工具有差异或是版本不一致时常会出现的一个问题,解决的方案如下: 第一步: updated eclipse (Help->Check for updat ...

  9. [置顶] Android 打包apk无敌报错

    前言: 这个问题从昨天上午一直到现在,请教了很多大佬,都没有给出确定的解决方案,可能他们也没碰到过可能,不过还是挺感谢他们的建议,一直到今天中午午休,我一直都在想这个问题,就是下面的这个,看了国内很多 ...

随机推荐

  1. android Listview,gridview局部刷新,部分刷新

    众所周知Listview和Gridview的刷新界面的方式是调用adapter.notifyDataSetChanged()进行界面刷新. 但是此方法有其弊端,他是将界面中的数据全部刷新一遍,不论数据 ...

  2. Hadoop HDFS (3) JAVA訪问HDFS之二 文件分布式读写策略

    先把上节未完毕的部分补全,再剖析一下HDFS读写文件的内部原理 列举文件 FileSystem(org.apache.hadoop.fs.FileSystem)的listStatus()方法能够列出一 ...

  3. Qt属性系统

    The Property System Qt提供一个类似于其他编译器供应商提供的精致的属性系统.然而,作为一个编译器和平台独立的库,Qt并不依赖于非标准编译器特性,如__property 或 [pro ...

  4. Qt容器类(总结)(新发现的QQueue和QStack,注意全都是泛型)

    Introduction Qt库提供了一组基于模板的一般化的容器类.这些容器可以存储指定的类型的元素.例如,如果你需要一个可变大小的Qstring数组,可以用QVector<QString> ...

  5. hive怎样处理多分隔符数据

    问题描写叙述:     大数据维稳需求中,客户提供的測试数据为多个字符做分隔符('|#'),在pig中会直接报错,hive中仅仅认第一个分隔符. 因为数据量比較大(160G),在文本中替换成单个字符分 ...

  6. linux head命令

    head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然尔就是看档案的结尾. 1.命令格式: hea ...

  7. c++,为什么要引入虚拟继承

      虚拟基类是为解决多重继承而出现的.   以下面的一个例子为例: #include <iostream.h> #include <memory.h> class CA { i ...

  8. C语言,数据类型

    #include <stdio.h> void f0(void) { printf("in linux:\n"); printf("sizeof(char) ...

  9. Python基础入门教程

    Python基础入门教程 Python基础教程 Python 简介 Python环境搭建 Python 基础语法 Python 变量类型 Python 运算符 Python 条件语句 Python 循 ...

  10. JSP页面小脚本实现日期比較,Java同理,精简过后的,可能在效率上不太好,有大大能够给优化下就更好了

    <%         java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat("yyyy-MM-dd ...