android产品研发(六)-->Apk混淆

 

android产品研发(十八)-->webview问题集锦

本文中我们将介绍一下android中webview在使用过程中会遇到的一些问题。这些问题主要是webview在使用过程中我已经趟过的坑,希望通过这篇文章的介绍能够帮助大家更好的使用webview...
  阅读(2440)  评论(0)
 

android产品研发(十七)-->Hybrid开发

本文将介绍android中hybrid开发相关的知识点。hybrid开发实际上是混合开发的意思,这里的混合是H5开发与Native开发混合的意思。下面的文章中我们将逐个介绍一下hybrid开发的概念、hybrid开发的优势、android中如何实现hybrid开发、简单的hybrid开发的例子,以及在产品实践中对hybrid开发的应用,希望通过本篇文章的介绍让您能够对android中的hybrid开发有一个基本的认识...
  阅读(4400)  评论(2)
 

android产品研发(十六)-->开发者选项

本文主要介绍Android开发中常常涉及到但又不是被人重视知识点:开发者选项。主要涉及到如何打开开发者模式,开发者选项中有哪些操作菜单以及各自的作用,如何清除手机数据,清除手机数据具体清除那些数据等等...
  阅读(7309)  评论(0)
 

android产品研发(十五)-->内存对象序列化

本文将讲解android中数据传输中需要了解的数据序列化方面的知识,我们知道android开发过程中不同Activity之间传输数据可以通过Intent对象的put**方法传递,对于java的八大基本数据类型(char int float double long short boolean byte)传递是没有问题的,但是如果传递比较复杂的对象类型(比如对象,比如集合等),那么就可能存在问题,而这时候也就引入了数据序...
  阅读(5827)  评论(0)
 

android产品研发(十四)-->App升级与更新

本文将讲解app的升级与更新。一般而言用户使用App的时候升级提醒有两种方式获得: - 一种是通过App Store获取 - 一种是打开应用之后提醒用户更新升级 而更新操作一般是在用户点击了升级按钮之后开始执行的,这里的升级操作也分为两种形式: - 一般升级 - 强制升级...
  阅读(4316)  评论(6)
 

android产品研发(十三)-->App轮询操作

本文将讲解app端的轮训请求服务,一般而言我们经常将轮训操作用于请求服务器。比如某一个页面我们有定时任务需要时时的从服务器获取更新信息并显示,比如当长连接断掉之后我们可能需要启动轮训请求作为长连接的补充等,所以这时候就用到了轮训服务...
  阅读(6361)  评论(9)
 

android产品研发(十二)-->App长连接实现

本文中我们将讲解一下App的长连接实现。一般而言长连接已经是App的标配了,推送功能的实现基础就是长连接,当然了我们也可以通过轮训操作实现推送功能,但是轮训一般及时性比较差,而且网络消耗与电量销毁比较多,因此一般推送功能都是通过长连接实现的...
  阅读(7414)  评论(8)
 

android产品研发(十一)-->应用内跳转scheme协议

这里的scheme是一种页面内跳转协议,主要用于支持一下几种场景: - 服务器下发跳转路径,客户端根据服务器下发跳转路径跳转相应的页面; - H5页面点击锚点,根据锚点具体跳转路径App端跳转具体的页面; - App端收到服务器端下发的PUSH通知栏消息,根据消息的点击跳转路径跳转相关页面...
  阅读(4107)  评论(3)
 

android产品研发(十)-->不使用静态变量保存数据

转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了Android中的几种常见网络协议:xml,json,protobuf等,以及各自的优缺点,一般而言主要我们的App涉及到了网络传输都会有这方面的内容,具体可根据项目的需求确定各自的网络传输协议。 而本文讲解的其实并不是一个技术方面,而是一个android产品研发过程中的技巧:尽量不使用静态变量保存核心数据。 而本文中将要介绍的是App...
  阅读(4102)  评论(1)
 

[置顶] android产品研发-->总结(持续更新中)

本个系列的文章主要是讲解android产品研发过程中一些需要注意的技术技巧与实践。其主要面对产品研发,对App稳定性,友好型,兼容性要求较高的App...
  阅读(1368)  评论(2)
 

android产品研发(九)-->App网络传输协议

转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了App的数据统计,其主要分为两种:使用第三方服务统计和自身实现数据统计。一般而言我们使用第三方统计服务已经可以很好的满足我们的也无需求了,只是部分数据敏感性App,可能自身实现数据统计服务是一个更好的选择。 而本文中将要介绍的是App端的网络传输协议。那么这里首先需要明确一点的是什么是网络传输协议呢?好吧,这里首先套用一段百度百科的定义:...
  阅读(6376)  评论(0)
 

android产品研发(八)-->App数据统计

上一篇文章中我们介绍了android社区中很火的热修复功能,主流的热修复原理上其实分为两种,一种是通过利用dex的加载顺序实现热修复功能,一种是通过native层实现指针替换实现热修复功能,两种各有利弊可以根据自身产品的需要选择不同的方案。 而文本将要介绍一下android产品中另一项基础功能-数据统计。App数据统计的意义在于通过统计用户的行为方式有针对性的更新展示算法,根据用户的行为习惯更新...
  阅读(4474)  评论(1)
 

android产品研发(七)-->Apk热修复

上一篇文章中我们讲解了App的数据统计,其主要分为两种:使用第三方服务统计和自身实现数据统计。一般而言我们使用第三方统计服务已经可以很好的满足我们的也无需求了,只是部分数据敏感性App,可能自身实现数据统计服务是一个更好的选择。 而本文中将要介绍的是App端的网络传输协议。那么这里首先需要明确一点的是什么是网络传输协议呢?好吧,这里首先套用一段百度百科的定义: 网络传输协议或简称为传送协...
  阅读(5894)  评论(0)
 

android产品研发(六)-->Apk混淆

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

android产品研发(五)-->多渠道打包

国内众多android开发环境有众多的应用市场,产品存在着不同渠道统计的需求,为此android开发人员需要为每个应用市场发布一个安装包,这是一件很苦逼的事,更换成android studio之后自带的编译工具gradle其实已经可以实现多渠道打包的功能了;下面主要简单介绍一下gradle如何实现的多渠道打包。 gradle多渠道打包; 美团对渠道打包; 第三方多渠道打包; (一)在and...
  阅读(4900)  评论(0)
 

android产品研发(四)-->减小Apk大小

随着移动技术的深入发展,各种炫酷效果的更新,在我们追求UI与UE的同时一个不如忽视的问题逐渐暴露出来,那就是apk文件越来越大,可能有的童鞋会说现在都是wifi环境,apk文件增大几M不是什么大不了的问题,这其实也是有一定道理的,但是作为开发人员的我们这绝不是我们认为可以忽略这个问题的理由。优化Apk大小也是优化我们App体验的一个重要方面,虽然可能它不是那么的重要。那么到底是那些原因让我们的Apk...
  阅读(2400)  评论(0)
 

android产品研发(三)-->基类Activity

在实际的android产品研发中,一般的我们在写Activity的时候都会继承于一个基类Activity,该Activity是所有的Activity的基类。在该基类中我们主要用于重写一些共有的逻辑。好处是显而易见的对于一些Activity的共有逻辑我们不必要在每个Activity中都重新写一遍,只需要在基类Activity中写一遍就好了...
  阅读(1239)  评论(0)
 

android产品研发(二)-->启动页优化

上一篇文章中我们介绍加单说明了一下android的编码规范,这里我是强烈建议大家在团队合作中约定编码规范的,哪怕是一个并不是十分规范的规范总比没有规范好得多,尤其是团队产品的研发,对产品的持续迭代过程中你会越发的意识到编码规范对产品迭代的好处,当然了,这里并不是要求大家一定按照文中给出的编码规范作为团队中使用的编码规范,而是希望大家在团队合作中能够约定出自身的编码规范,哪怕其并不是十分的规范。...
  阅读(1440)  评论(6)
 

android产品研发(一)-->实用开发规范

前面一系列的文章中我们主要讲解了Android系统中的一些源码流程,而从本文开始讲解一下android产品中经常需要使用的技术,方法,实践等等。 这里暂时大概列一下产品研发中常见的方法技术等: 1.android产品研发之代码规范 2.android产品研发之启动页优化 3.android产品研发之 而本文中主要讲解的是对Android产品优化之启动页优化。 最近观看友盟统计发现App...
 


  分类:
 

转载请标明出处:一片枫叶的专栏

前面一篇文章中我们讲解了android里面的多渠道打包,对于大型的app来说,几百个上千个渠道包都是很正常的事,所以效率定制化是一件很重要的事。主要讲解了三种多渠道打包方式,并分析了其各自的利弊,在各自产品多渠道打包的时候,可以根据自身的产品需求选择相应的打包方式,具体可参考:android产品研发(五)–>多渠道打包

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

所以对于android apk安装文件来说如何混淆代码实现对apk文件的保护是一个很重要的问题,而android提供了Progurd方式来混淆apk中的代码,其核心的逻辑是在代码层将一些易懂的源代码类名,方法名称替换成毫无意义的a、b、c、d…,这样当别人反编译出你的Apk文件时,看到的源代码也无法还原其本身的逻辑。

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

- 代码混淆-Progurd

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

  1. 在android studio的android项目中找到module的gradle配置文件,添加proguard配置
<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">buildTypes {
        debug {
            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 显示Log</span>
            buildConfigField <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"boolean"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"LOG_DEBUG"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"true"</span>
            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//混淆</span>
            minifyEnabled <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">false</span>
            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//Zipalign优化</span>
            zipAlignEnabled <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>
            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 移除无用的resource文件</span>
            shrinkResources <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>
            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//加载默认混淆配置文件</span>
            proguardFiles getDefaultProguardFile(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'proguard-android.txt'</span>), <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'proguard-rules.pro'</span>
            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//签名</span>
            signingConfig signingConfigs.debug
        }
        release {
            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 不显示Log</span>
            buildConfigField <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"boolean"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"LOG_DEBUG"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"false"</span>
            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//混淆</span>
            minifyEnabled <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>
            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//Zipalign优化</span>
            zipAlignEnabled <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>
            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 移除无用的resource文件</span>
            shrinkResources <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>
            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//加载默认混淆配置文件</span>
            proguardFiles getDefaultProguardFile(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'proguard-android.txt'</span>), <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'proguard-rules.pro'</span>
            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//签名</span>
            signingConfig signingConfigs.relealse
        }
    }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li></ul>
  1. 找到项目中的proguard-rules.pro文件,该文件就是我们的混淆配置文件

这里写图片描述

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

(1)proguard混淆语法

<code class="hljs r has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">-libraryjars class_path 应用的依赖包,如android-support-v4  
-keep [,modifier,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>] class_specification 这里的keep就是保持的意思,意味着不混淆某些类 
-keepclassmembers [,modifier,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>] class_specification 同样的保持,不混淆类的成员  
-keepclasseswithmembers [,modifier,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>] 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  </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul>

(2)混淆原则

<code class="hljs javascript has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">jni方法不可混淆
反射用到的类不混淆(否则反射可能出现问题)
AndroidMainfest中的类不混淆,四大组件和Application的子类和Framework层下所有的类默认不会进行混淆
Parcelable的子类和Creator静态成员变量不混淆,否则会产生android.os.BadParcelableException异常
使用GSON、fastjson等框架时,所写的<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">JSON</span>对象类不混淆,否则无法将<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">JSON</span>解析成对应的对象
使用第三方开源库或者引用其他第三方的SDK包时,需要在混淆文件中加入对应的混淆规则
有用到WEBView的JS调用也需要保证写的接口方法不混淆</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul>

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

<code class="hljs  has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">一般的第三方库都有自身的混淆方案,可直接引用其自身的混淆配置即可
若无混淆配置,一般的可配置不混淆第三方库</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

(4)最后帖上我们项目中实际的混淆方案

# Glide图片库的混淆处理
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
    **[] $VALUES;
    public *;
}

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

# 高德地图混淆脚本
-keep class com.android.support.**{ *; }
-keep interface android.support.v4.app.**{ *; }
-keep public class * extends android.support.v4.**
-keep public class * extends android.app.Fragment

-dontwarn com.amap.api.**
-dontwarn com.a.a.**
-dontwarn com.autonavi.**
-keep class com.amap.api.** {*;}
-keep class com.autonavi.** {*;}
-keep class com.a.a.** {*;}

# Gson混淆脚本
-keep class com.google.gson.stream.** {*;}
-keep class com.youyou.uuelectric.renter.Network.user.** {*;}

# butterknife混淆脚本
-dontwarn butterknife.internal.**
-keep class **$$ViewInjector { *; }
-keepnames class * { @butterknife.InjectView *;}

# -------------系统类不需要混淆 --------------------------
-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 * extends android.<span class="hljs-title" style="box-siz
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值