Android Studio 混淆打包apk【简单可行】
来源:互联网 发布:凯聪为什么在淘宝消失 编辑:程序博客网 时间:2024/05/17 02:53
自己辛辛苦苦编写、不断调试、具有技巧的代码,当前情况下还不想将代码进行公开,有保护价值,最好进行混淆打包操作。先说下apk文件不进行混淆操作的坏处吧,自己辛苦了两周,代码编译成apk文件,别人拿到你的安装包文件,只需要dex2jar和jd-ui工具就可以看到你的源代码,反编译过程可参考 Android APK反编译就这么简单 详解(附图)。此类情况对于封装jar包同样存在,因此需要加上一层代码保护。
Android Studio提供了两种apk签名打包方式,一种是基于Android Studio的可视化操作,一种是基于gradle的命令打包,第二种打包方式能够得到更多apk文件,但是第一种最简单可行。我参考了三篇博文:AndroidStudio 混淆打包、Android Studio(十一):代码混淆及打包apk、Android Studio多渠道打包和代码混淆教程,生成apk的过程中总是出现error,自己做了一些删减操作,可以做到打包apk简单可行。
Android Studio混淆打包apk的过程可以分为以下3步:
1、修改app目录下的build.gradle文件
2、修改app目录下的proguard-rules.pro文件
3、编译打包操作
1.修改app目录下的build.gradle文件
app是应用主模块,引用剩余的module。
app目录下的build.gradle文件【简化版本】
apply plugin: 'com.android.application'android { compileSdkVersion 25 buildToolsVersion "25.0.2" aaptOptions.cruncherEnabled = false aaptOptions.useNewCruncher = false defaultConfig { applicationId "wifi.ips.casm.com.mywifiscanner" minSdkVersion 16 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } //执行lint检查,有任何的错误或者警告提示,都会终止构建,我们可以将其关掉。 lintOptions { abortOnError false } buildTypes { release { // 不显示Log buildConfigField "boolean", "LOG_DEBUG", "false" //混淆 minifyEnabled true //Zipalign优化 zipAlignEnabled true // 移除无用的resource文件 shrinkResources true //前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,后一个文件是自己的定义混淆文件 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }}dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:25.3.0' testCompile 'junit:junit:4.12'}
2.修改app目录下的proguard-rules.pro文件
这部分是最主要的,由于我的代码里没有引用第三方应用,所以对proguard-rules.pro文件进行简化,可参考AndroidStudio 混淆打包里的相应文件,如proguard-rules.pro文件所示。
# Add project specific ProGuard rules here.# By default, the flags in this file are appended to flags specified# in D:\Android\sdk/tools/proguard/proguard-android.txt# You can edit the include path and order by changing the proguardFiles# directive in build.gradle.## For more details, see# http://developer.android.com/guide/developing/tools/proguard.html# Add any project specific keep options here:# If your project uses WebView with JS, uncomment the following# and specify the fully qualified class name to the JavaScript interface# class:-keepclassmembers class fqcn.of.javascript.interface.for.webview { public *;}#指定代码的压缩级别-optimizationpasses 5#包明不混合大小写-dontusemixedcaseclassnames#不去忽略非公共的库类-dontskipnonpubliclibraryclasses #优化 不优化输入的类文件-dontoptimize #预校验-dontpreverify #混淆时是否记录日志-verbose # 混淆时所采用的算法-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*#保护注解-keepattributes *Annotation*# 保持哪些类不被混淆-keep public class * extends android.app.Fragment-keep public class * extends android.app.Activity-keep public class * extends android.app.Application-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 com.android.vending.licensing.ILicensingService#如果有引用v4包可以添加下面这行-keep public class * extends android.support.v4.app.Fragment#忽略警告-ignorewarning##记录生成的日志数据,gradle build时在本项目根目录输出###apk 包内所有 class 的内部结构-dump proguard/class_files.txt#未混淆的类和成员-printseeds proguard/seeds.txt#列出从 apk 中删除的代码-printusage proguard/unused.txt#混淆前后的映射-printmapping proguard/mapping.txt########记录生成的日志数据,gradle build时 在本项目根目录输出-end#######如果引用了v4或者v7包-dontwarn android.support.**####混淆保护自己项目的部分代码以及引用的第三方jar包library-end#####保持 native 方法不被混淆-keepclasseswithmembernames class * { native <methods>;}#保持自定义控件类不被混淆-keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet);}#保持自定义控件类不被混淆-keepclassmembers class * extends android.app.Activity { public void *(android.view.View);}-keep public class * extends android.view.View { public <init>(android.content.Context); public <init>(android.content.Context, android.util.AttributeSet); public <init>(android.content.Context, android.util.AttributeSet, int); public void set*(...);}#保持 Parcelable 不被混淆-keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *;}#保持 Serializable 不被混淆-keepnames class * implements java.io.Serializable#保持 Serializable 不被混淆并且enum 类也不被混淆-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();}#保持枚举 enum 类不被混淆-keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String);}-keepclassmembers class * { public void *ButtonClicked(android.view.View);}#不混淆资源类-keepclassmembers class **.R$* { public static <fields>;}#避免混淆泛型 如果混淆报错建议关掉#-keepattributes Signature#移除Log类打印各个等级日志的代码,打正式包的时候可以做为禁log使用,这里可以作为禁止log打印的功能使用,另外的一种实现方案是通过BuildConfig.DEBUG的变量来控制#-assumenosideeffects class android.util.Log {# public static *** v(...);# public static *** i(...);# public static *** d(...);# public static *** w(...);# public static *** e(...);#}##################################################################################################################### 以上通用 ###################################################################################################################################################### 常用第三方模块的混淆选项 ####################################gson#如果用用到Gson解析包的,直接添加下面这几行就能成功混淆,不然会报错。-keepattributes Signature# Gson specific classes-keep class sun.misc.Unsafe { *; }# Application classes that will be serialized/deserialized over Gson-keep class com.google.gson.** { *; }-keep class com.google.gson.stream.** { *; }#mob-keep class android.net.http.SslError-keep class android.webkit.**{*;}-keep class cn.sharesdk.**{*;}-keep class com.sina.**{*;}-keep class m.framework.**{*;}-keep class **.R$* {*;}-keep class **.R{*;}-dontwarn cn.sharesdk.**-dontwarn **.R$*#butterknife-keep class butterknife.** { *; }-dontwarn butterknife.internal.**-keep class **$$ViewBinder { *; }-keepclasseswithmembernames class * { @butterknife.* <fields>;}-keepclasseswithmembernames class * { @butterknife.* <methods>;}######引用的其他Module可以直接在app的这个混淆文件里配置# 如果使用了Gson之类的工具要使被它解析的JavaBean类即实体类不被混淆。-keep class com.matrix.app.entity.json.** { *; }-keep class com.matrix.appsdk.network.model.** { *; }#####混淆保护自己项目的部分代码以及引用的第三方jar包library########如果在当前的application module或者依赖的library module中使用了第三方的库,并不需要显式添加规则#-libraryjars xxx#添加了反而有可能在打包的时候遭遇同一个jar多次被指定的错误,一般只需要添加忽略警告和保持某些class不被混淆的声明。#以libaray的形式引用了开源项目,如果不想混淆 keep 掉,在引入的module的build.gradle中设置minifyEnabled=false-keep class com.nineoldandroids.** { *; }-keep interface com.nineoldandroids.** { *; }-dontwarn com.nineoldandroids.**# 下拉刷新-keep class in.srain.cube.** { *; }-keep interface in.srain.cube.** { *; }-dontwarn in.srain.cube.**# observablescrollview:tab fragment-keep class com.github.ksoichiro.** { *; }-keep interface com.github.ksoichiro.** { *; }-dontwarn com.github.ksoichiro.**
在文件里面常用第三方的混淆选项可以不添加,视自己情况而定。
3.编译打包操作
Android Studio中【build】——【generated signed apk】输入keystore和alias(别名)的密码,next,finish,如果出现【**successfully】说明打包成功。
4、反编译混淆打包的apk文件
利用dex2jar将classes文件转为jar包,再利用jar包可视化工具jd-gui查看混淆效果,私有的方法和变量都进行了代码混淆,可读性降低。
阅读全文
0 0
- Android Studio 混淆打包apk【简单可行】
- Android Studio上如何混淆打包apk
- Android studio 代码混淆及打包apk
- Android studio 代码混淆及打包apk
- 【Android】Android Studio 进行代码混淆,打包release APK
- android studio apk混淆
- Android Studio下做打包apk加代码混淆
- Android Studio(十一):代码混淆及打包apk
- Android Studio(十一):代码混淆及打包apk
- Android Studio(十一):代码混淆及打包apk
- Android Studio(十一):代码混淆及打包apk
- 使用Android Studio 混淆签名打包apk流程
- Android Studio 混淆打包
- android studio混淆打包
- Android studio 打包、混淆
- android studio混淆打包
- Android studio 打包混淆
- android studio 混淆打包
- 【旧资料整理】firefox addEventListener用法
- arp脚本
- 折半排序
- makefile中PHONY的重要性
- 五分钟熟悉zeromq消息中间件
- Android Studio 混淆打包apk【简单可行】
- Android实现通讯录功能,排序+字母索引
- Python3之Django框架搭建详细步骤
- ubuntu 14.04 install g++问题
- POJ 2310 Cubic Tick-Tack-Toe 笔记
- VC++下命名管道编程的原理及实现
- Android studio 开发实战笔记----(一)开发环境搭建
- javascript权威指南笔记
- Android自定义键盘详解、自定义输入法简介