系列文章:
Android的反编译和代码混淆
Android的打包签名
Android的多渠道打包

前言

包括以下内容

  1. 要反编译apk需要下面3个工具
  2. 反编译资源文件
  3. 反编译类文件
  4. 代码混淆

要反编译apk需要下面3个工具

  1. apktool(资源文件获取)
    作用:资源文件获取,可以提取图片文件和布局文件进行使用查看
  2. dex2jar(源文件获取)
    作用:将APK反编译成java源码(classes.dex转化成jar文件)
  3. jd-gui
    作用:查看APK中classes.dex转化成的jar文件,即源码文件

下面进行反编译资源文件和类文件:

反编译资源文件

资源文件:包括图片资源、布局资源、动画、样式等其他资源


image.png image.png image.png

这样资源文件都可以看得到了。

反编译类文件

方式一:反编译得到Java类
1.下载并解压dex2jar-2.0,得到dex2jar-2.0文件夹,里面包含dex2jar.bat及其文件
2.将apk文件改为xx.zip文件,并解压得到classes.dex文件,并将其复制到dex2jar-2.0文件夹中
3


image.png

生成一个classes-dex2jar.jar文件,使用jd-gui.exe打开生成的classes-dex2jar.jar文件

方式二:直接使用smali2java工具
什么是smali?smali是将Android字节码用可阅读的字符串形式表现出来的一种语言,可以称之为Android字节码的反汇编语言。

代码混淆

只能混淆java类,不能混淆资源文件。系统定义的组件不能混淆。必须是导出的apk。
如何实现代码混淆
混淆类文件

  1. 修改module:app下的build.gradle
    buildTypes {        release {            //是否需要混淆,默认false代表不混淆,true代表混淆            minifyEnabled true            //混淆需要用到的一个工具:proguard,对应的一个文件是:proguard-android.txt(这个文件在android-sdk \tools\proguard目录下)            //proguard是一个压缩、优化和混淆Java字节码文件的免费工具            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        }
  1. 在proguard-rules.pro中添加:


    image.png

    把下面代码,放入proguard-rules.pro文末:

#指定代码的压缩级别-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 class_files.txt#未混淆的类和成员-printseeds seeds.txt#列出从 apk 中删除的代码-printusage unused.txt#混淆前后的映射-printmapping mapping.txt########记录生成的日志数据,gradle build时 在本项目根目录输出-end###########混淆保护自己项目的部分代码以及引用的第三方jar包library########-libraryjars libs/umeng-analytics-v5.2.4.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#如果不想混淆 keep 掉-keep class com.lippi.recorder.iirfilterdesigner.** {*; }#友盟-keep class com.umeng.**{*;}#项目特殊处理代码#忽略警告-dontwarn com.lippi.recorder.utils**#保留一个完整的包-keep class com.lippi.recorder.utils.** {         *;}-keep class  com.lippi.recorder.utils.AudioRecorder{*;}#如果引用了v4或者v7包-dontwarn android.support.**####混淆保护自己项目的部分代码以及引用的第三方jar包library-end####-keep public class * extends android.view.View {         public (android.content.Context);         public (android.content.Context, android.util.AttributeSet);         public (android.content.Context, android.util.AttributeSet, int);         public void set*(...);}#保持 native 方法不被混淆-keepclasseswithmembernames class * {         native ;}#保持自定义控件类不被混淆-keepclasseswithmembers class * {         public (android.content.Context, android.util.AttributeSet);}#保持自定义控件类不被混淆-keepclassmembers class * extends android.app.Activity {        public void *(android.view.View);}#保持 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 ;         !private ;         !private ;         private void writeObject(java.io.ObjectOutputStream);         private void readObject(java.io.ObjectInputStream);         java.lang.Object writeReplace();         java.lang.Object readResolve();}#保持枚举 enum 类不被混淆 如果混淆报错,建议直接使用上面的 -keepclassmembers class * implements java.io.Serializable即可#-keepclassmembers enum * {#  public static **[] values();#  public static ** valueOf(java.lang.String);#}-keepclassmembers class * {         public void *ButtonClicked(android.view.View);}#不混淆资源类-keepclassmembers class **.R$* {         public static ;}#避免混淆泛型 如果混淆报错建议关掉#–keepattributes Signature#移除log 测试了下没有用还是建议自己定义一个开关控制是否输出日志#-assumenosideeffects class android.util.Log {#    public static boolean isLoggable(java.lang.String, int);#    public static int v(...);#    public static int i(...);#    public static int w(...);#    public static int d(...);#    public static int 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.** { *; }

同步,然后再打包

以上是根据我的一些理解,做的总结分享,旨在抛砖引玉,希望有更多的志同道合的朋友一起讨论学习,共同进步!

更多相关文章

  1. Android中经常用到的方法--SDcard下文件的操作
  2. android中实现多个apk文件
  3. Android(安卓)将被依赖的库项目打包成aar(非jar)文件
  4. android 启动过程 [ZZ]
  5. Android下 读写文件
  6. android makefile and build system分析
  7. android jni
  8. Android使用自定义字体的方法
  9. NPM 和webpack 的基础使用

随机推荐

  1. 002JavaSE基本语法
  2. 001 JavaSE阶段安装jdk
  3. 仿php中文网右侧导航
  4. ModStartCMS 快速开发框架(支持 Laravel9)v
  5. 字符串和数组的api实例演示
  6. python双向循环链表实例详解
  7. 重装系统时不小心重新分区了的文件寻回办
  8. TP 商品详情页数据、加入购物车、登录、t
  9. C++算法学习之回溯法的应用
  10. 从零开始打造流程图、拓扑图项目【Nuxt.j