android代码APK混淆

2023-05-16

   实际的产品研发中为了防止自己的劳动成果被别人窃取,混淆代码能有效防止apk文件被反编译,进而查看源代码。说来惭愧,作为互联网创业公司的我们也确实对竞品Apk反编译研究过,如果Apk混淆之后确实对理解源码的业务流程造成了困扰,这也从侧面说明了Apk混淆的重要性。

面我们将分别介绍代码混淆与资源文件混淆具体实践- 代码混淆-Progurd

下面来总结以下混淆代码的步骤:

  1. 在Android studio的Android项目中找到module的gradle配置文件,添加proguard配置
buildTypes {
        debug {
            // 显示Log
            buildConfigField "boolean", "LOG_DEBUG", "true"
            //混淆
            minifyEnabled false
            //Zipalign优化
            zipAlignEnabled true
            // 移除无用的resource文件
            shrinkResources true
            //加载默认混淆配置文件
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
            //签名
            signingConfig signingConfigs.debug
        }
        release {
            // 不显示Log
            buildConfigField "boolean", "LOG_DEBUG", "false"
            //混淆
            minifyEnabled true
            //Zipalign优化
            zipAlignEnabled true
            // 移除无用的resource文件
            shrinkResources true
            //加载默认混淆配置文件
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
            //签名
            signingConfig signingConfigs.relealse
        }
    }

2.ProGuard常用语法

下面列出一些常用的语法

  • -libraryjars class_path 应用的依赖包,如android-support-v4
  • -keep [,modifier,…] class_specification 不混淆某些类
  • -keepclassmembers [,modifier,…] class_specification 不混淆类的成员
  • -keepclasseswithmembers [,modifier,…] class_specification 不混淆类及其成员
  • -keepnames class_specification 不混淆类及其成员名
  • -keepclassmembernames class_specification 不混淆类的成员名
  • -keepclasseswithmembernames class_specification 不混淆类及其成员名
  • -assumenosideeffects class_specification 假设调用不产生任何影响,在proguard代码优化时会将该调用remove掉。如system.out.println和Log.v等等
  • -dontwarn [class_filter] 不提示warnning

 

3.编写proguard-rules.pro文件,添加混淆配置

(1)混淆原则

1.jni方法不可混淆
2.反射用到的类不混淆(否则反射可能出现问题)
3.AndroidMainfest中的类不混淆,四大组件和Application的子类和Framework层下所有的类默认不会进行混淆
4.Parcelable的子类和Creator静态成员变量不混淆,否则会产生Android.os.BadParcelableException异常
5.使用GSON、fastjson等框架时,所写的JSON对象类不混淆,否则无法将JSON解析成对应的对象
6.使用第三方开源库或者引用其他第三方的SDK包时,需要在混淆文件中加入对应的混淆规则
7.有用到WEBView的JS调用也需要保证写的接口方法不混淆

(2)第三方库的混淆原则

一般的第三方库都有自身的混淆方案,
可直接引用其自身的混淆配置即可
若无混淆配置,一般的可配置不混淆第三方库

(3)proguard混淆基本语法

#忽略警告,避免打包时某些警告出现
-ignorewarnings
#指定代码的压缩级别 设置混淆的压缩比率 0 ~ 7 
-optimizationpasses 5
#是否使用大小写混合
-dontusemixedcaseclassnames
#如果应用程序引入的有jar包,并且想混淆jar包里面的class 
-dontskipnonpubliclibraryclasses
#混淆时是否做预校验 这里表示不用预先检查
-dontpreverify
#混淆时是否记录日志 添加了表示不用输出详细的过程
-verbose

#表示混淆采用的算法
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
#表示对所有Activity的子类不会进行混淆
-keep public class * extends android.app.Activity
#表示对所有Application 的子类不会进行混淆
-keep public class * extends android.app.Application  
#表示对所有Service 的子类不会进行混淆
-keep public class * extends android.app.Service  
#表示对所有BroadcastReceiver的子类不会进行混淆
-keep public class * extends  android.content.BroadcastReceiver
#表示对所有ContentProvider 的子类不会进行混淆   
-keep public class * extends android.content.ContentProvider
-keep public class com.android.vending.licensing.ILicensingService
#对support.v4包的申明
-keep class android.support.v4.** { *; }  
#表示对所有继承support.v4包里面类的子类不会进行混淆
-keep public class * extends android.support.v4.** 
 #缺省proguard 会检查每一个引用是否正确,但是第三方库里面往往有些不会用到的类,没有正确引用。如果不配置的话,系统就会报错。
-dontwarn android.support.v4.**     
#表示对所有android.app.Fragment 的子类不会进行混淆 
-keep public class * extends android.app.Fragment 
#表示对所有android.support.v4.widget 的子类不会进行混淆 
-keep public class * extends android.support.v4.widget  
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
# Gson混淆脚本
-keep class com.google.gson.stream.** {*;}
-keep class com.youyou.uuelectric.renter.Network.user.** {*;}
# ---------------- eventbus避免混淆 ------------
-keepclassmembers class ** {
    public void onEvent*(**);
    void onEvent*(**);
}
# Glide图片库的混淆处理
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
    **[] $VALUES;
    public *;
}

4.混淆配置完成之后编译混淆包,测试

有的时候混淆之后可能会出现一些奇形怪状的bug,有条件的话,可以让QA回滚一次混淆包的测试。

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android代码APK混淆 的相关文章

  • 使用DBFlow,如何加密已经存在的数据库?

    我正在使用 DBFlow 来处理项目中的数据库 并且我想对现有数据库进行加密 我知道我可能必须删除现有的未加密数据库并创建另一个加密数据库 我也知道我可以将 SQLCipher 与 DBFlow 一起使用 如上所述文档 https gith
  • 如何访问 Android 心率传感器原始数据? (反射光,不是心跳)

    心率传感器上的 android sdk 仅返回计算出的 bpm 我对此不感兴趣 我需要访问 Android 心率传感器原始数据 例如就反射值的强度而言将会很大 因为心率传感器基本上使用 LED 并测量随时间变化的反射率 如果可能 访问由任何
  • 通过代码在创建时突出显示 ListView 项目

    我想在创建 listView 时突出显示 ListView 的第一行 0 我尝试了不同的方法 就像您在注释代码中看到的那样 但没有任何效果 这很奇怪 因为 OnItemClickListener 中的突出显示工作正常 它通过 xml 选择器
  • 我无法再在后台应用程序中接收任何 FCM 消息

    当应用程序处于后台时 我无法再在应用程序中接收任何数据消息 请注意 直到最近它在我的应用程序中都运行良好 也许在我的开发环境最近更新后它停止工作了 我不能说 所以我尝试用快速入门 android 项目 https github com fi
  • 无法在 Android Studio 中导出签名的 APK

    当我使用keytool list keystore path to keyfile jks并提供我的密码 我可以看到那里的条目 但是当我在尝试使用相同的密码生成签名的 APK 时使用相同的密码时 我收到错误 无法加载密钥库 密钥库被篡改 或
  • relativelayout导致动画不起作用?

    我有一个活动 其布局仅包含一个 VideoView 这是 XML
  • 如何使用 RecyclerView 创建此布局?

    我正在尝试使用这种类型的布局创建回收器视图 这些项目是字符串 可以以不同的大小出现 我不知道每行中有多少项目 我可以使用 StaggeredGridLayoutManager 来做到这一点吗 该图像只是一个假示例 每行可以有更多项目 您可能
  • Play 商店中的应用描述更新

    我想更新应用程序的描述以及 Play 商店上的屏幕截图 但应用程序保持相同 即相同的版本号 我不想发布新应用程序 因为应用程序中没有任何更改 这可能吗 谷歌也会要求更新应用程序吗 您可以更新描述 也可以更改屏幕截图 您的应用程序将保持不变
  • 如何清除Android剪贴板?

    我发现的方法都不起作用 这是我尝试过的 1 使用clearPrimaryClip 的方法ClipboardManager class ClipboardManager clipboard ClipboardManager getSystem
  • Android 和 Google 地图内部片段以及其他控件和 viewpager

    我是android编程新手 我有一个带有 3 个页面 片段 的小应用程序 使用 pageradapter 和 viewpager 在它们之间滑动 其中一个页面包含复选框 和其他控件 和地图 我的问题是程序在启动时崩溃 Fragment co
  • 模拟器无法加载

    我正在使用 hello android 教程并通过 eclipse 创建 avd 启动模拟器时不使用图像 它只是显示一个黑色的后屏 中间有 ANDROID 字样 并且在 ANDROID 字样的末尾有一个闪烁的光标 我已按照 T 的步骤安装
  • Android 认为我没有关闭数据库!为什么?

    我有一个 SQLiteDatabase 数据成员 我在 onCreate 中初始化它 并在 onPause onStop 和 onDestroy 中调用 close 它在 onResume 中重新初始化 它似乎运行得很好 但当我查看调试器时
  • 使用 Proguard 通过 Dropbox.com 库混淆 Android 应用程序

    我刚刚创建了一个需要 Dropbox com API 库的 Android 应用程序 我现在尝试在 发布 模式下构建应用程序 并希望在代码上运行混淆器以对其进行混淆 但是 每当我尝试运行 Proguard 时 都会收到以下错误 Progua
  • 活动加载缓慢

    我的应用程序中有大约 50 个活动 但其中一个活动非常慢 我的意思是当我按下按钮进入该活动时 需要很长时间 有时会出现黑屏 在该活动中 我有一个按钮 如果我单击该按钮 则需要很长时间才能执行 代码很轻 只有一个Button EditText
  • 文本视图不显示全文

    我正在使用 TableLayout 和 TableRow 创建一个简单的布局 其中包含两个 TextView 这是代码的一部分
  • 了解应用程序在后台时何时收到 Firebase 消息

    我知道这个标题有同样的问题 但不幸的是它没有得到正确的回答 它被接受了 here https stackoverflow com questions 37711082 how to handle notification when app
  • Android计算两个日期之间的天数

    我编写了以下代码来查找两个日期之间的天数 startDateValue new Date startDate endDateValue new Date endDate long diff endDateValue getTime star
  • onPrepareOptionsMenu 复制 ActionBar 中的项目

    当我使用 onPrepareOptionsMenu 添加菜单项时 该菜单项会在操作栏中复制其自身 我正在使用片段并在主要活动的 ActionBar 中创建初始菜单 如下所示 Override public boolean onCreateO
  • Android AppWidgetManager 方法 updateAppWidget 无法设置意图、加载数据。而且它是随机发生的

    我的小部件由 2 个按钮和一个显示数据的列表视图组成 大多数时候 当调用小部件提供程序的 onUpdate 方法时 一切都会正常加载 每个人都很高兴 但是我注意到有时在调用更新方法后 小部件完全无法加载其数据 列表视图为空 所有按钮均无响应
  • 如何从DataSource.Factory获取数据

    我必须调用此方法才能获取所有人员 我根本无法修改这个方法 Query SELECT FROM PERSON TABLE ORDER BY NAME DESC abstract fun getElements DataSource Facto

随机推荐

  • SonarQube整合maven

    64 author xff1a zxw 64 email xff1a 502513206 64 qq com 64 Jishou University sonarLint xff1a https www sonarlint org refe
  • Feign源码分析(二) - builder构建

    64 Author xff1a zxw 64 Email xff1a 502513206 64 qq com 目录 Feign源码分析 一 初探Feign 1 前言 通过上篇文章 xff0c 我们得知了Feign类中主要的元数据 xff0c
  • vector容器的三种遍历方法

    STL Standard Template Library 中vector容器是最常见的容器之一 xff0c 设计中经常需要遍历vector容器 xff0c 本文介绍三种常用的vector遍历方式 一 下标索引遍历 span class t
  • Sentinel源码分析(三) - 调用链路

    64 Author xff1a zxw 64 Email xff1a 502513206 64 qq com 目录 Sentinel源码分析 一 初识SentinelSentinel源码分析 二 Entry构建 1 前言 之前已经分析过En
  • Sentinel源码分析(四) - 限流规则

    64 Author xff1a zxw 64 Email xff1a 502513206 64 qq com 目录 Sentinel源码分析 一 初识SentinelSentinel源码分析 二 Entry构建Sentinel源码分析 三
  • Sentinel源码分析(五) - 熔断降级

    64 Author xff1a zxw 64 Email xff1a 502513206 64 qq com 目录 Sentinel源码分析 一 初识SentinelSentinel源码分析 二 Entry构建Sentinel源码分析 三
  • 无人机姿态解算:四元数及其与欧拉角的转换

    无人机姿态解算 xff1a 四元数及其与欧拉角的转换 引言 xff1a 获得无人机飞行时的飞行姿态对于无人机稳定控制来说至关重要 无人机主要通过传感器数据融合来进行状态估计 xff0c 常用于无人机的传感器包括 xff1a MPU xff0
  • 无涯教程:Docker - Node.js安装

    无涯教程网 Node js是一个JavaScript框架 xff0c 用于开发服务器端应用程序 xff0c 它是一个开放源代码框架 xff0c 可以在各种操作系统上运行 现在 xff0c 我们将看到启动和运行用于Node js的Docker
  • MVVM + dataBinding

    MVVM 43 dataBinding mvvm模式不做过多讲解 xff0c 参考下面文章或其他文章对mvvm描述 http www jianshu com p 6872b699879d 后面又发现一篇比较好的文章 xff0c 补上 htt
  • IDEA中报错 java: 程序包org.apache.ibatis.annotations不存在

    执行一句 xff1a mvn idea xff1a idea 问题解决了 xff0c 应该是maven版本不一致导致的错误 xff01
  • Windows Server 2016 重置密码

    问题描述 xff1a 今天上午的时候 xff0c 系统提示我 xff0c 密码过期 xff0c 需要修改密码 xff0c 我上午就没处理 xff0c 等到下午去处理的时候 xff0c 告诉我 xff0c 在登陆前 xff0c 必须修改用户的
  • 城市列表第三方集成

    城市列表首先要导入两个依赖 xff0c 根据信息放入正确的位置 1 在本app的gradle里面 compile 39 com github andyoom citypicker v1 0 4 39 2 在项目的工作空间build grad
  • Srpingboot+Redis redisTemplate 报空指针异常(注入为NULL)

    今天整合Springboot 43 redis做测试的时候发现了 redisTemplate报空指针错误 原因是注入时候redisTemplate就是null 查了一下后面发现是容器没有启动 单纯的测试是无法注入的 要在测试类上加上 spa
  • KDD 2020 推荐系统论文一览

    作者 学派 链接 https zhuanlan zhihu com p 161705748 编辑 深度传送门 KDD是推荐领域一个顶级的国际会议 本次接收的论文按照推荐系统应用场景可以大致划分为 xff1a CTR预估 TopN推荐 对话式
  • android Button按下及抬起监听事件

    首先我们在 布局中 xff0c 写入Button按钮 lt xml version 61 34 1 0 34 encoding 61 34 utf 8 34 gt lt LinearLayout xmlns android 61 34 ht
  • JZVIdeoPlayer(节操视频播放)

    比如jiecao的视频播放 依赖一个是视频 xff0c picasso 图片加载框架 compile 39 cn jzvd jiaozivideoplayer 6 0 0 39 compile 39 com squareup picasso
  • Android Apk编译的apk安装失败解决

    一 xff1a 如果直接拷贝到手机进行安装 提示安装失败 xff0c 解决有两种 第一 xff1a 在我们项目中的 gradle properties 文件中加入 xff0c 下面的那句 android injected testOnly
  • Android APP第三方支付流程

    手机APP 支付宝接入 1 开发前准备 xff1a 申请一个通过实名认证的企业支付宝账号 下载SDK开发包 提供APP apk以备审核 xff0c 审核通过后即可进行代码集成 2 流程 流程图 xff1a 流程解释 xff1a app携带支
  • Android介绍如何生成keystore 文件并使用

    cmd下 进入到jdk的bin目录 xff0c 这样的话 xff0c android keystore文件就会生成在这个目录下 签名的时候我们需要这个文件 C Program Files Java jdk1 7 0 01 bin gt ke
  • android代码APK混淆

    实际的产品研发中为了防止自己的劳动成果被别人窃取 xff0c 混淆代码能有效防止apk文件被反编译 xff0c 进而查看源代码 说来惭愧 xff0c 作为互联网创业公司的我们也确实对竞品Apk反编译研究过 xff0c 如果Apk混淆之后确实