Android Stuido代码混淆以及打包
2017-02-16 15:23
351 查看
当代码书写完成之后,我们需要将代码打包,发送到各个app市场,在这之前,我们通常需要将代码进行代码混淆,此文章将介绍代码混淆,并且给大家提供一个比较完成的混淆文档,可以直接拿来即用。
设置minifyEnabled值为true,表示在打release包的时候,会读取 app/proguard-rules.pro文件,并参照里面的代码混淆规则,proguard-rules.pro也是代码混淆的重点,注意,只有在打release包的时候才会进行混淆。
1. -libraryjars libs/sdk-v1.0.0.jar 如果是以jar包的形式集成在项目中的第三方,需要这一步,如果compile形式的话,略过,下一步;
2. -dontwarn com.lippi.recorder.utils** 忽略警告
3. -keep class com.lippi.recorder.utils.* { ; } 保留一个完整的包
OK,完成,打包成功!!!
代码混淆部分
1.修改app/ build.gradle文件
修改build.gradle文件,需要修改如下代码buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { signingConfig signingConfigs.debug } }
设置minifyEnabled值为true,表示在打release包的时候,会读取 app/proguard-rules.pro文件,并参照里面的代码混淆规则,proguard-rules.pro也是代码混淆的重点,注意,只有在打release包的时候才会进行混淆。
2.修改app/proguard-rules.pro文件
proguard-rules.pro即为代码混淆时,编译器会参照这个文件进行混淆还是不混淆,不混淆的需要在这个文件中需要进行声明,只有这样,才能在运行的时候不出现找不到class的情况。否则,就等着程序崩溃吧~~2.1 对于一些基本指令的添加
此部分通常不需要更改,只要将下面的代码粘贴到proguard-rules.pro文件中,作为第一部分即可。# 代码混淆压缩比,在0~7之间,默认为5,一般不做修改 -optimizationpasses 5 # 混合时不使用大小写混合,混合后的类名为小写 -dontusemixedcaseclassnames # 指定不去忽略非公共库的类 -dontskipnonpubliclibraryclasses # 这句话能够使我们的项目混淆后产生映射文件 # 包含有类名->混淆后类名的映射关系 -verbose # 指定不去忽略非公共库的类成员 -dontskipnonpubliclibraryclassmembers # 不做预校验,preverify是proguard的四个步骤之一,Android不需要preverify,去掉这一步能够加快混淆速度。 -dontpreverify # 保留Annotation不混淆 -keepattributes *Annotation*,InnerClasses # 避免混淆泛型 -keepattributes Signature # 抛出异常时保留代码行号 -keepattributes SourceFile,LineNumberTable # 指定混淆是采用的算法,后面的参数是一个过滤器 # 这个过滤器是谷歌推荐的算法,一般不做更改 -optimizations !code/simplification/cast,!field/*,!class/merging/*
2.2 Android开发中一些需要保留的公共部分
这一部分通常也不需要修改,直接粘贴,作为第二部分# 保留我们使用的四大组件,自定义的Application等等这些类不被混淆 # 因为这些子类都有可能被外部调用 -keep public class * extends android.app.Activity -keep public class * extends android.app.Appliction -keep public class * extends android.app.Service -keep public class * extends android.content.BroadcastReceiver -keep public class * extends android.content.ContentProvider -keep public class * extends android.app.backup.BackupAgentHelper -keep public class * extends android.preference.Preference -keep public class * extends android.view.View -keep public class com.android.vending.licensing.ILicensingService # 保留support下的所有类及其内部类 -keep class android.support.** {*;} # 保留继承的 -keep public class * extends android.support.v4.** -keep public class * extends android.support.v7.** -keep public class * extends android.support.annotation.** # 保留R下面的资源 -keep class **.R$* {*;} # 保留本地native方法不被混淆 -keepclasseswithmembernames class * { native <methods>; } # 保留在Activity中的方法参数是view的方法, # 这样以来我们在 4000 layout中写的onClick就不会被影响 -keepclassmembers class * extends android.app.Activity{ public void *(android.view.View); } # 保留枚举类不被混淆 -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } # 保留我们自定义控件(继承自View)不被混淆 -keep public class * extends android.view.View{ *** get*(); void set*(***); public <init>(android.content.Context); public <init>(android.content.Context, android.util.AttributeSet); public <init>(android.content.Context, android.util.AttributeSet, int); } # 保留Parcelable序列化类不被混淆 -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } # 保留Serializable序列化的类不被混淆 -keepclassmembers class * implements java.io.Serializable { static final long serialVersionUID; private static final java.io.ObjectStreamField[] serialPersistentFields; !static !transient <fields>; !private <fields>; !private <methods>; private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve(); } # 对于带有回调函数的onXXEvent、**On*Listener的,不能被混淆 -keepclassmembers class * { void *(**On*Event); void *(**On*Listener); } # webView处理,项目中没有使用到webView忽略即可 -keepclassmembers class fqcn.of.javascript.interface.for.webview { public *; } -keepclassmembers class * extends android.webkit.webViewClient { public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap); public boolean *(android.webkit.WebView, java.lang.String); } -keepclassmembers class * extends android.webkit.webViewClient { public void *(android.webkit.webView, jav.lang.String); } # 移除Log类打印各个等级日志的代码,打正式包的时候可以做为禁log使用,这里可以作为禁止log打印的功能使用 # 记得proguard-android.txt中一定不要加-dontoptimize才起作用 # 另外的一种实现方案是通过BuildConfig.DEBUG的变量来控制 #-assumenosideeffects class android.util.Log { # public static int v(...); # public static int i(...); # public static int w(...); # public static int d(...); # public static int e(...); #}
2.3 项目中特殊处理部分
这一部分的话,通常需要处理我们自己定义好的javaBean对象,注意:需要把com.example.example.bean换成自己的包名,一定要更换,换完之后,作为第三部分粘贴到自己的代码中即可#-----------处理反射类--------------- #-----------处理js交互--------------- #-----------处理实体类--------------- # 在开发的时候我们可以将所有的实体类放在一个包内,这样我们写一次混淆就行了。 -keep public class com.example.example.bean.** { public void set*(***); public *** get*(); public *** is*(); }
2.4 处理第三方依赖库
这里处理了一些常用的第三方的类库,以后有新的会往上面更新,注意:在Gson那边也需要把com.example.example.bean换成自己的包名,否则网络请求得到结果之后也不会解析成功的。# AndroidEventBus -keep class org.simple.** { *; } -keep interface org.simple.** { *; } -keepclassmembers class * { @org.simple.eventbus.Subscriber <methods>; } # 百度地图(jar包换成自己的版本,记得签名要匹配) #-libraryjars libs/baidumapapi_v2_1_3.jar -keep class com.baidu.** {*;} -keep class vi.com.** {*;} -keep class com.sinovoice.** {*;} -keep class pvi.com.** {*;} -dontwarn com.baidu.** -dontwarn vi.com.** -dontwarn pvi.com.** # Bugly -dontwarn com.tencent.bugly.** -keep class com.tencent.bugly.** {*;} # litepal -keep class org.litepal.** { *; } -keep enum org.litepal.** -keep interface org.litepal.** { *; } -keep public class * extends org.litepal.** -keepattributes *Annotation* -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keepclassmembers class * extends org.litepal.crud.DataSupport{*;} #pinyin4j -dontwarn net.soureceforge.pinyin4j.** -dontwarn demo.** -keep class net.sourceforge.pinyin4j.** { *;} -keep class demo.** { *;} -keep class com.hp.** { *;} -dontwarn com.viewpagerindicator.** # ButterKnife -keep class butterknife.** { *; } -dontwarn butterknife.internal.** -keep class **$$ViewBinder { *; } -keepclasseswithmembernames class * { @butterknife.* <fields>; } -keepclasseswithmembernames class * { @butterknife.* <methods>; } # EventBus -keepattributes *Annotation* -keepclassmembers class ** { @org.greenrobot.eventbus.Subscribe <methods>; } -keep enum org.greenrobot.eventbus.ThreadMode { *; } # Facebook -keep class com.facebook.** {*;} -keep interface com.facebook.** {*;} -keep enum com.facebook.** {*;} # FastJson -dontwarn com.alibaba.fastjson.** -keep class com.alibaba.fastjson.** { *; } -keepattributes Signature -keepattributes *Annotation* # Fresco -keep class com.facebook.fresco.** {*;} -keep interface com.facebook.fresco.** {*;} -keep enum com.facebook.fresco.** {*;} # 高德相关依赖 # 集合包:3D地图3.3.2 导航1.8.0 定位2.5.0 -dontwarn com.amap.api.** -dontwarn com.autonavi.** -keep class com.amap.api.**{*;} -keep class com.autonavi.**{*;} # 地图服务 -dontwarn com.amap.api.services.** -keep class com.map.api.services.** {*;} # 3D地图 -dontwarn com.amap.api.mapcore.** -dontwarn com.amap.api.maps.** -dontwarn com.autonavi.amap.mapcore.** -keep class com.amap.api.mapcore.**{*;} -keep class com.amap.api.maps.**{*;} -keep class com.autonavi.amap.mapcore.**{*;} # 定位 -dontwarn com.amap.api.location.** -dontwarn com.aps.** -keep class com.amap.api.location.**{*;} -keep class com.aps.**{*;} # 导航 -dontwarn com.amap.api.navi.** -dontwarn com.autonavi.** -keep class com.amap.api.navi.** {*;} -keep class com.autonavi.** {*;} # Glide -keep public class * implements com.bumptech.glide.module.GlideModule -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { **[] $VALUES; public *; } # Gson -keep class sun.misc.Unsafe { *; } -keep class com.google.gson.stream.** { *; } # 使用Gson时需要配置Gson的解析对象及变量都不混淆。不然Gson会找不到变量。 # 将下面替换成自己的实体类 -keep class com.example.example.bean.** { *; } # Jackson -dontwarn org.codehaus.jackson.** -dontwarn com.fasterxml.jackson.databind.** -keep class org.codehaus.jackson.** { *;} -keep class com.fasterxml.jackson.** { *; } # 极光推送 -dontoptimize -dontpreverify -dontwarn cn.jpush.** -keep class cn.jpush.** { *; } # OrmLite -keepattributes *DatabaseField* -keepattributes *DatabaseTable* -keepattributes *SerializedName* -keep class com.j256.** -keepclassmembers class com.j256.** { *; } -keep enum com.j256.** -keepclassmembers enum com.j256.** { *; } -keep interface com.j256.** -keepclassmembers interface com.j256.** { *; } # Realm -keep class io.realm.annotations.RealmModule -keep @io.realm.annotations.RealmModule class * -keep class io.realm.internal.Keep -keep @io.realm.internal.Keep class * { *; } -dontwarn javax.** -dontwarn io.realm.** # Retrofit -dontwarn retrofit2.** -keep class retrofit2.** { *; } -keepattributes Signature -keepattributes Exceptions # Retrolambda -dontwarn java.lang.invoke.* # RxJava RxAndroid -dontwarn sun.misc.** -keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* { long producerIndex; long consumerIndex; } -keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef { rx.internal.util.atomic.LinkedQueueNode producerNode; } -keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef { rx.internal.util.atomic.LinkedQueueNode consumerNode; } # 微信支付 -dontwarn com.tencent.mm.** -dontwarn com.tencent.wxop.stat.** -keep class com.tencent.mm.** {*;} -keep class com.tencent.wxop.stat.**{*;} # 信鸽 -keep public class * extends android.app.Service -keep public class * extends android.content.BroadcastReceiver -keep class com.tencent.android.tpush.** {* ;} -keep class com.tencent.mid.** {* ;} -keepattributes *Annotation* # 新浪微博 -keep class com.sina.weibo.sdk.* { *; } -keep class android.support.v4.* { *; } -keep class com.tencent.* { *; } -keep class com.baidu.* { *; } -keep class lombok.ast.ecj.* { *; } -dontwarn android.support.v4.** -dontwarn com.tencent.**s -dontwarn com.baidu.** # 讯飞语音 -dontwarn com.iflytek.** -keep class com.iflytek.** {*;} # 银联 -dontwarn com.unionpay.** -keep class com.unionpay.** { *; } # 友盟统计分析 -keepclassmembers class * { public <init>(org.json.JSONObject); } -keepclassmembers enum com.umeng.analytics.** { public static **[] values(); public static ** valueOf(java.lang.String); } # 友盟自动更新 -keepclassmembers class * { public <init>(org.json.JSONObject); } -keep public class cn.irains.parking.cloud.pub.R$*{ public static final int *; } -keep public class * extends com.umeng.** -keep class com.umeng.** { *; } # 支付宝钱包 -dontwarn com.alipay.** -dontwarn HttpUtils.HttpFetcher -dontwarn com.ta.utdid2.** -dontwarn com.ut.device.** -keep class com.alipay.android.app.IAlixPay{*;} -keep class com.alipay.android.app.IAlixPay$Stub{*;} -keep class com.alipay.android.app.IRemoteServiceCallback{*;} -keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;} -keep class com.alipay.sdk.app.PayTask{ public *;} -keep class com.alipay.sdk.app.AuthTask{ public *;} -keep class com.alipay.mobilesecuritysdk.* -keep class com.ut.* #okhttputils -dontwarn com.zhy.http.** -keep class com.zhy.http.**{*;} #okhttp -dontwarn okhttp3.** -keep class okhttp3.**{*;} #okio -dontwarn okio.** -keep class okio.**{*;}
2.5 小结
只要将上面的4部分合在一起,一个完整的proguard-rules.pro就可以了,简单介绍一下:1. -libraryjars libs/sdk-v1.0.0.jar 如果是以jar包的形式集成在项目中的第三方,需要这一步,如果compile形式的话,略过,下一步;
2. -dontwarn com.lippi.recorder.utils** 忽略警告
3. -keep class com.lippi.recorder.utils.* { ; } 保留一个完整的包
打包部分
1点击Build->Generate Singned APK
2.点击创建证书或者选择已经存在的证书
3.如果没有的话,点击create创建证书
4.都填写完成之后,点击Next
OK,完成,打包成功!!!
相关文章推荐
- 关于Android Stuido 代码混淆打包签名后,高德地图定位出不来
- 类文件Android 代码混淆 以及 反编译 的实现类文件
- Android 混淆代码学习以及Android加密工具--APKProtect的使用
- Android 代码混淆及打包相关
- 如何混淆android代码以及注意事项
- android 通过eclipse混淆代码 打包 + proguard 总结
- Android 代码混淆 以及 反编译 的实现
- Android 混淆代码学习以及And… 分类: Android开发 2014-05-30 10:55 95人阅读 评论(0) 收藏
- android代码签名和混淆打包
- android代码签名和混淆打包
- Android - 百度地图打包混淆代码后地图崩溃的解决方法
- android打包混淆代码编译会出现很多warling,然后编译失败问题解决办法
- android代码混淆及打包相关
- android 通过eclipse混淆代码 打包 + proguard 总结
- Android应用程序签名打包,混淆代码时报错的处理方法
- 用ant实现自动打包android(二) -- android代码混淆
- Android 签名打包 混淆代码 proguard
- 【Android】打包过程:生成自动代码->编译->(混淆)->dex文件->生成资源文件->打apk包->(签名)->对齐
- Android混淆代码打包实践总结
- Eclipse打包Android混淆代码降低代码可读性时,出现的Warning:can't find referenced class问题的解决方案