Android studio 使用心得(五)---代码混淆和破解apk
来源:互联网 发布:供销大数据集团陈静红 编辑:程序博客网 时间:2024/05/16 04:49
版权声明:本文出自veidy的博客,转载必须注明出处
转载请注明出处:http://my.oschina.net/aibenben/blog/371889
这篇文章等是跟大家分享一在Android studio 进行代码混淆配置。之前大家在eclipse上也弄过代码混淆配置,其实一样,大家可以把之前在eclipse上的配置文件直接拿过来用。不管是.cfg文件还是proguard-rules.pro文件都一样。
先给大家贴一个混淆模板吧。注释很清楚。是我目前一个项目用的proguard.cfg配置文件
#指定代码的压缩级别-optimizationpasses5 #包明不混合大小写-dontusemixedcaseclassnames #不去忽略非公共的库类-dontskipnonpubliclibraryclasses #优化 不优化输入的类文件-dontoptimize #预校验-dontpreverify #混淆时是否记录日志-verbose # 混淆时所采用的算法-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* #保护注解-keepattributes *Annotation* # 保持哪些类不被混淆-keeppublicclass* extendsandroid.app.Fragment-keeppublicclass* extendsandroid.app.Activity-keeppublicclass* extendsandroid.app.Application-keeppublicclass* extendsandroid.app.Service-keeppublicclass* extendsandroid.content.BroadcastReceiver-keeppublicclass* extendsandroid.content.ContentProvider-keeppublicclass* extendsandroid.app.backup.BackupAgentHelper-keeppublicclass* extendsandroid.preference.Preference-keeppublicclasscom.android.vending.licensing.ILicensingService#如果有引用v4包可以添加下面这行-keeppublicclass* extendsandroid.support.v4.app.Fragment #忽略警告-ignorewarning #####################记录生成的日志数据,gradle build时在本项目根目录输出################ #apk 包内所有 class的内部结构-dumpclass_files.txt#未混淆的类和成员-printseeds seeds.txt#列出从 apk 中删除的代码-printusage unused.txt#混淆前后的映射-printmapping mapping.txt #####################记录生成的日志数据,gradle build时 在本项目根目录输出-end################ ################<span></span>混淆保护自己项目的部分代码以及引用的第三方jar包library##########################-libraryjars libs/umeng-analytics-v5.2.4.jar#-libraryjars libs/alipaysd<span></span>k.jar#<span></span>-libraryjars libs/alipaysecsdk.jar#-libraryjars libs/alipayutdid.jar#-libraryjars libs/wup-1.0.0-SNAPSHOT.jar#-libraryjars libs/weibosdkcore.jar #三星应用市场需要添加:sdk-v1.0.0.jar,look-v1.0.1.jar#-libraryjars libs/sdk-v1.0.0.jar#-libraryjars libs/look-v1.0.1.jar #我是以libaray的形式引用了一个图片加载框架,如果不想混淆 keep 掉-keepclasscom.nostra13.universalimageloader.** { *; } #友盟-keepclasscom.umeng.**{*;} #支付宝-keepclasscom.alipay.android.app.IAliPay{*;}-keepclasscom.alipay.android.app.IAlixPay{*;}-keepclasscom.alipay.android.app.IRemoteServiceCallback{*;}-keepclasscom.alipay.android.app.lib.ResourceMap{*;} #信鸽推送-keepclasscom.tencent.android.tpush.** {* ;}-keepclasscom.tencent.mid.** {* ;} #自己项目特殊处理代码 #忽略警告-dontwarn com.veidy.mobile.common.**#保留一个完整的包-keepclasscom.veidy.mobile.common.** { *; } -keepclass com.veidy.activity.login.WebLoginActivity{*;}-keepclass com.veidy.activity.UserInfoFragment{*;}-keepclass com.veidy.activity.HomeFragmentActivity{*;}-keepclass com.veidy.activity.CityActivity{*;}-keepclass com.veidy.activity.ClinikActivity{*;} #如果引用了v4或者v7包-dontwarn android.support.** ############<span></span>混淆保护自己项目的部分代码以及引用的第三方jar包library-end################## -keeppublicclass* extendsandroid.view.View { public<init>(android.content.Context); public<init>(android.content.Context, android.util.AttributeSet); public<init>(android.content.Context, android.util.AttributeSet, int); publicvoidset*(...);} #保持 native 方法不被混淆-keepclasseswithmembernamesclass* { native <methods>;} #保持自定义控件类不被混淆-keepclasseswithmembersclass* { public<init>(android.content.Context, android.util.AttributeSet);} #保持自定义控件类不被混淆-keepclasseswithmembersclass* { public<init>(android.content.Context, android.util.AttributeSet, int);}#保持自定义控件类不被混淆-keepclassmembersclass*extendsandroid.app.Activity { publicvoid*(android.view.View);} #保持 Parcelable 不被混淆-keepclass*implementsandroid.os.Parcelable { publicstaticfinal android.os.Parcelable$Creator *;} #保持 Serializable 不被混淆-keepnamesclass*implementsjava.io.Serializable #保持 Serializable 不被混淆并且enum 类也不被混淆-keepclassmembersclass*implementsjava.io.Serializable { staticfinallongserialVersionUID; privatestaticfinal java.io.ObjectStreamField[] serialPersistentFields; !static!transient <fields>; !private<fields><span></span>; !private<methods>; privatevoidwriteObject(java.io.ObjectOutputStream); privatevoidreadObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve();} #保持枚举 enum 类不被混淆 如果混淆报错,建议直接使用上面的 -keepclassmembers class*implementsjava.io.Serializable即可#-keepclassmembers enum * {# publicstatic**[] values();# publicstatic** valueOf(java.lang.String);#} -keepclassmembersclass* { publicvoid*ButtonClicked(android.view.View);} #不混淆资源类-keepclassmembersclass**.R$* { publicstatic<fields>;} #避免混淆泛型 如果混淆报错建议关掉#–keepattributes Signature #移除log 测试了下没有用还是建议自己定义一个开关控制是否输出日志#-assumenosideeffectsclassandroid.util.Log {# publicstaticboolean isLoggable(java.lang.String, int);# publicstaticint v(...);# publicstaticint i(...);# publicstaticint w(...);# publicstaticint d(...);# publicstaticint e(...);#}
另外加上一段,如果用用到Gson解析包的,直接添加下面这几行就能成功混淆,不然会报错。
#gson#-libraryjars libs/gson-2.2.2.jar-keepattributes Signature# Gson specific classes-keep class sun.misc.Unsafe { *; }# Application classes that will be serialized/deserialized over Gson-keep class com.google.gson.examples.android.model.** { *; }
# webview + js-keepattributes *JavascriptInterface*# keep 使用 webview 的类-keepclassmembersclass com.veidy.activity.WebViewActivity { public*;}# keep 使用 webview 的类的所有的内部类-keepclassmembers class com.veidy.activity.WebViewActivity$*{ *;}
大家可以先看看这篇文章
Android studio 使用心得(四)---android studio 多渠道打包(二)
了解一下打包过程。
然后大家看看打包的配置文件build.gradle里面的一段配置代码
一切就绪后,就是打包了。这里我就不再多说了,大家可以去看
Android studio 使用心得(四)---android studio 多渠道打包
Android studio 使用心得(四)---android studio 多渠道打包(二)
我这里用第二种,gradle 命令打包.我建议大家在gradle clean后,不要直接gradle build,而是用gradle assembleRelease .用gradle build第一是因为慢,第二,我自己项目打包时这样遇到一个错误,现在也没解决
Lint found errors in the project; aborting build.
Fix the issues identified by lint, or add the following to your build script to proceed with errors:
...
android {
lintOptions {
abortOnError false
}
}
...
可以我明明已经设置
//执行lint检查,有任何的错误或者警告提示,都会终止构建,我们可以将其关掉。
lintOptions {
abortOnError false
}
搞不清楚。希望大家谁知道的也告诉下我。
当我们执行命令 gradle build或者gradle assembleRelease后,会自动进行混淆操作。。。直到成功。
各位 注意下,如果你的混淆配置有问题,可能会报错。Execution failed for task ':proguardUmengRelease'.大家可以根据报错去排除问题,
比如说我遇到的一个问题,
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();
}
- Android studio 使用心得(五)---代码混淆和破解apk
- Android studio 使用心得(五)—代码混淆和破解apk
- Android studio 使用心得(五)—代码混淆和破解apk
- Android studio 使用---代码混淆和破解apk
- Android studio 代码混淆和破解apk
- Android Studio代码混淆和破解apk
- Android studio 代码混淆和破解apk
- Android studio gradle 代码混淆和破解apk
- Android 代码混淆和破解apk
- 混淆apk:Android中使用eclipse混淆apk和studio混淆app的不同
- Android studio 代码混淆及打包apk
- Android studio 代码混淆及打包apk
- android studio apk混淆
- Android APK反编译和代码混淆
- android apk 代码混淆
- android .apk 混淆代码
- android apk 代码混淆
- 【Android】Android Studio 进行代码混淆,打包release APK
- 工作笔记之复杂字符串的json解析,使用gson
- Can't compress a recycled bitmap的解决方案
- VirtualBox上Ubuntu Server虚拟机配置双网卡
- 每个程序员都必读的11篇文章
- [剑指offer:30]最小的k个数
- Android studio 使用心得(五)---代码混淆和破解apk
- 高通聚焦功能
- 搜索引擎
- 转载Bmob移动支付
- ListView嵌套ListView涉及到的子ListView无法显示完全,以及父ListView无法执行item的点击事件的处理
- OpenGL学习入门-GLFW配置
- 【JQuery UI】面板折叠插件——accordion
- sql
- Parameter 'xxxx' not found. Available parameters are [list] at java.util.concurrent.FutureTask