android代码混淆总结,Android代码混淆的写法总结

Apk文件被反编译出来能被获取到里面的代码。对于这种情况,我们可以对项目代码进行混淆,随机生成难理解的类名,方法名,让代码难以阅读,加大功能被盗取的难度。混淆可以起到压缩Apk,混淆文件,预检,优化的作用。

1. 使用方式,在gradle文件中设置minifyEnabled为true即可开启混淆

buildTypes {

release {

minifyEnabled ture //是否开启代码混淆

proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

}

}

混淆内容在proguard-android.txt文件中写。

2. 混淆设置参数

-optimizationpasses 4 代码混淆的压缩比例,值介于0-7

-dontusemixedcaseclassnames 混淆后类型都为小写

-dontskipnonpubliclibraryclasses 不去忽略非公共的库类

-dontoptimize 不优化输入的类文件

-dontpreverify 不做预校验的操作

-ignorewarnings 忽略警告

-verbose 混淆时是否记录日志

-keepattributes Annotation 保护注解

-printmapping proguardMapping.txt 生成原类名和混淆后的类名的映射文件

-optimizations !code/simplification/cast,!field/ ,!class/merging/ 指定混淆是采用的算法

3. 保持不被混淆的设置

保持实体类不混淆

-keep class 你的实体类所在的包.** { *; }

保持四大组件,Application,Fragment不混淆

-keep public class * extends android.app.Application

-keep public class * extends android.app.Activity

-keep public class * extends android.app.Fragment

-keep public class * extends android.support.v4.app.Fragment

-keep public class * extends android.app.Fragment

-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.preference.Preference

保持 native 方法不被混淆

-keepclasseswithmembernames class * {

native ;

}

保持枚举enum类不被混淆

-keepclassmembers enum * {

public static **[] values();

public static ** valueOf(java.lang.String);

}

保持 Parcelable 不被混淆

-keep class * implements android.os.Parcelable {

public static final android.os.Parcelable$Creator *;

}

保持第三方包不混淆,比如这里用到微信、支付宝支付第三方

#支付宝混淆

-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.tencent.mm.opensdk.** {*;}

-keep class com.tencent.wxop.** {*;}

-keep class com.tencent.mm.sdk.** {*;}

4. 完整混淆示例:

#指定代码的压缩级别

-optimizationpasses 5

#包名不混合大小写

-dontusemixedcaseclassnames

#不去忽略非公共的库类

-dontskipnonpubliclibraryclasses

#优化 不优化输入的类文件

-dontoptimize

#预校验

-dontpreverify

#混淆时是否记录日志

-verbose

#忽略警告

-ignorewarning

#保护注解

-keepattributes *Annotation*

-keep public class * extends android.app.Application

-keep public class * extends android.app.Activity

-keep public class * extends android.app.Fragment

-keep public class * extends android.support.v4.app.Fragment

-keep public class * extends android.app.Fragment

-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.preference.Preference

-keepclasseswithmembernames class * {

native ;

}

-keepclassmembers class * extends android.app.Activity {

public void *(android.view.View);

}

-keepclassmembers enum * {

public static **[] values();

public static ** valueOf(java.lang.String);

}

-keep class * implements android.os.Parcelable {

public static final android.os.Parcelable$Creator *;

}

-keepclassmembers class **.R$* {

*;

}

-keep class * extends android.view.View{*;}

-keep class * extends android.app.Dialog{*;}

-keep class * implements java.io.Serializable{*;}

#butterknife

-keep class butterknife.** { *; }

-dontwarn butterknife.internal.**

-keep class **$$ViewBinder { *; }

#volley

-dontwarn com.android.volley.**

-keep class com.android.volley.**{*;}

#fastjson

-dontwarn com.alibaba.fastjson.**

-keep class com.alibaba.fastjson.**{*;}

#happy-dns

-dontwarn com.qiniu.android.dns.**

-keep class com.qiniu.android.dns.**{*;}

#okhttp

-dontwarn com.squareup.okhttp.**

-keep class com.squareup.okhttp.**{*;}

-keep class okio.**{*;}

-keep class android.net.**{*;}

-keep class com.android.internal.http.multipart.**{*;}

-keep class org.apache.**{*;}

-keep class com.qiniu.android.**{*;}

-keep class android.support.annotation.**{*;}

-keep class com.squareup.wire.**{*;}

-keep class com.ant.liao.**{*;}

#腾讯

-keep class com.tencent.**{*;}

-keep class u.aly.**{*;}

#ImageLoader

-keep class com.nostra13.universalimageloader.**{*;}

#友盟

-dontwarn com.umeng.**

-keep class com.umeng.**{*;}

#pulltorefresh

-keep class com.handmark.pulltorefresh.** { *; }

-keep class android.support.v4.** { *;}

-keep public class * extends android.support.v4.**{

public protected *;}

-keep class android.support.v7.** {*;}

自己试着用一个简单的项目加入混淆,打个包试试效果吧。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 中使用 Socket 进行通讯可以分为服务端和客户端两种角色,下面分别介绍它们的写法: ### 服务端 服务端需要监听一个端口,并在有客户端连接接受客户端的请求并返回响应。以下是服务端的基本写法: ```java try { // 创建一个 ServerSocket 对象,指定监听的端口号 ServerSocket serverSocket = new ServerSocket(8888); Log.d("Server", "Server started: " + serverSocket); while (true) { // 接受客户端的连接请求,返回一个 Socket 对象 Socket clientSocket = serverSocket.accept(); Log.d("Server", "Client connected: " + clientSocket); // 从输入流中读取客户端发送的数据 InputStream inputStream = clientSocket.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); String request = reader.readLine(); // 读取一行数据 // 向输出流中写入响应数据 OutputStream outputStream = clientSocket.getOutputStream(); outputStream.write("Hello, client!\n".getBytes()); // 关闭连接 clientSocket.close(); } } catch (IOException e) { e.printStackTrace(); } ``` ### 客户端 客户端需要连接到服务端指定的端口,并向服务端发送请求并接收响应。以下是客户端的基本写法: ```java try { // 创建一个 Socket 对象,指定服务端的 IP 地址和端口号 Socket socket = new Socket("server-ip-address", 8888); Log.d("Client", "Connected to server: " + socket); // 向输出流中写入请求数据 OutputStream outputStream = socket.getOutputStream(); outputStream.write("Hello, server!\n".getBytes()); // 从输入流中读取服务端的响应数据 InputStream inputStream = socket.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); String response = reader.readLine(); // 读取一行数据 Log.d("Client", "Response from server: " + response); // 关闭连接 socket.close(); } catch (IOException e) { e.printStackTrace(); } ``` 注意,在 Android 中访问网络需要在 AndroidManifest.xml 中声明网络访问权限:`<uses-permission android:name="android.permission.INTERNET" />`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值