原标题:Android去掉/混淆Log,反编译都看不到

出发点:

当然是由于编程习惯太好,打了一堆中文log,其实只是想给测试看。然而如果包被反编译,看log基本都能理解流程了,有点尴尬。所以此文主要探究proguard配置,以去除log。

以下过程示例,来自于这段代码。

publicclassMainActivityextendsAppCompatActivity{

privatestaticfinalString TAG = "MainActivity";

privateString a = "a";

privateString b = "b";

@Override

protectedvoidonCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Log.d(TAG, "This is"+ a + b);

}

}

啥都不配置的情况下,反编译的smali代码如下:

# virtual methods

. method publiconCreate(Landroid/os/Bundle;)V

.locals 2

invoke-super {p0, p1}, Landroid/support/v7/app/c;->onCreate(Landroid/os/Bundle;)V

constp1, 0x7f09001b

invoke- virtual{p0, p1}, Lcom/rentee/logremove/MainActivity;->setContentView(I)V

const- stringp1, "MainActivity"

new-instance v0, Ljava/lang/StringBuilder;

const- stringv1, "This is"

invoke-direct {v0, v1}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V

iget- objectv1, p0, Lcom/rentee/logremove/MainActivity;->m:Ljava/lang/String;

invoke- virtual{v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

iget- objectv1, p0, Lcom/rentee/logremove/MainActivity;->n:Ljava/lang/String;

invoke- virtual{v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

invoke- virtual{v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

move-result- objectv0

invoke- static{p1, v0}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

return- void

.end method

很明显,整条字符串拼接过程是由StringBuilder完成的。

1.在build.gradle配置proguard-android-optimize.txt,因为默认的proguard-android.txt优化开关是关了的,而proguard的assumenosideeffects、

assumenoexternalsideeffects配置是需要开启优化开关的。

buildTypes{

release{

minifyEnabledtrue

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

}

}

在proguard-rules.pro文件中配置assumenosideeffects。这是网上的通用大解。

-assumenosideeffects classandroid.util.Log{

publicstaticbooleanisLoggable(java.lang.String, int);

publicstaticintv(...);

publicstaticinti(...);

publicstaticintw(...);

publicstaticintd(...);

publicstaticinte(...);

}

不过也的确存在一个问题,就是去除不干净,反编译后,smail如下:

# virtual methods

. method publiconCreate(Landroid/os/Bundle;)V

.locals 1

invoke-super {p0, p1}, Landroid/support/v7/app/c;->onCreate(Landroid/os/Bundle;)V

constp1, 0x7f09001b

invoke- virtual{p0, p1}, Lcom/rentee/logremove/MainActivity;->setContentView(I)V

new-instance p1, Ljava/lang/StringBuilder;

const- stringv0, "This is"

invoke-direct {p1, v0}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V

iget- objectv0, p0, Lcom/rentee/logremove/MainActivity;->m:Ljava/lang/String;

invoke- virtual{p1, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

iget- objectv0, p0, Lcom/rentee/logremove/MainActivity;->n:Ljava/lang/String;

invoke- virtual{p1, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

return- void

.end method

Log的相关代码没了,但是还是有StringBuilder的拼接过程在,这个从根本上解决不了问题。

2.进化版,proguard 6.0以上版本新增了assumenoexternalsideeffects和assumenoexternalreturnvalues,这两个属性6.0才引入,Android自带proguard-gradle插件并没有这么新,所以要在工程项目根目录配置如下strategy,强制将progurad指定到6.0以上版本。

build {

configurations.all {

resolutionStrategy {

force "net.sf.proguard:proguard-gradle:6.0.3"

}

}

}

然后在progaurd-rules.txt文件中增加如下配置:

-assumenoexternalsideeffects classjava.lang.StringBuilder{

publicjava.lang.StringBuilder();

publicjava.lang.StringBuilder( int);

publicjava.lang.StringBuilder(java.lang.String);

publicjava.lang. StringBuilder append(java.lang.Object);

publicjava.lang. StringBuilder append(java.lang.String);

publicjava.lang. StringBuilder append(java.lang.StringBuffer);

publicjava.lang. StringBuilder append(char[]);

publicjava.lang. StringBuilder append(char[], int, int);

publicjava.lang. StringBuilder append(boolean);

publicjava.lang. StringBuilder append(char);

publicjava.lang. StringBuilder append(int);

publicjava.lang. StringBuilder append(long);

publicjava.lang. StringBuilder append(float);

publicjava.lang. StringBuilder append(double);

publicjava.lang. String toString();

}

-assumenoexternalreturnvalues publicfinalclassjava.lang.StringBuilder{

publicjava.lang. StringBuilder append(java.lang.Object);

publicjava.lang. StringBuilder append(java.lang.String);

publicjava.lang. StringBuilder append(java.lang.StringBuffer);

publicjava.lang. StringBuilder append(char[]);

publicjava.lang. StringBuilder append(char[], int, int);

publicjava.lang. StringBuilder append(boolean);

publicjava.lang. StringBuilder append(char);

publicjava.lang. StringBuilder append(int);

publicjava.lang. StringBuilder append(long);

publicjava.lang. StringBuilder append(float);

publicjava.lang. StringBuilder append(double);

}

这段配置的作用是,去除返回值无用的StringBuilder的相关操作,由于在第2点配置后,Log相关代码被去除,所以Log中的字符串拼接也是无用的,会被去除。配置后smali代码是:

# virtual methods

. method publiconCreate(Landroid/os/Bundle;)V

.locals 0

invoke-super {p0, p1}, Landroid/support/v7/app/c;->onCreate(Landroid/os/Bundle;)V

constp1, 0x7f09001b

invoke- virtual{p0, p1}, Lcom/rentee/logremove/MainActivity;->setContentView(I)V

return- void

.end method

是的,一句都没有了,干干净净,爽!

android 混淆 去掉log,Android去掉/混淆Log,反编译都看不到相关推荐

  1. Android APK程序加密,防止被别人反编译

    作为Android应用开发者,不得不面对一个尴尬的局面,就是自己辛辛苦苦开发的应用可以被别人很轻易的就反编译出来. Google似乎也发现了这个问题,从SDK2.3开始我们可以看到在android-s ...

  2. Android如果对APK进行加密,提高反编译难度(思路)

    提高反编译难度的几种方式: 对于软件安全来说,有攻就要有防才对.不然,Android整个产业链就会被这样的Crack给毁掉. 第一种办法:将核心代码用JNI写进so库中.由于so库的反编译和破解的难度 ...

  3. 自己写的android apk反编译,获取Android自己写好了的apk以及反编译

    今天,我们先说一下,获取Android自带的apk以及反编译它们来学习Android工程师是怎样写的,今天我们就以拿到Android自带的短信管理器的apk为例子 你可能有疑问,为什么要那么麻烦,从系 ...

  4. Android逆向去掉某功能,逆向教程之-反编译apk完全精简删除菜单功能(二)

    本帖最后由 liuxiaoxin 于 2020-12-3 19:00 编辑 授人以鱼,不如授人以渔! 本教程图文并茂,步骤非常详细,偏小白向,大佬请自觉屏蔽. 使用工具:MT管理器免费版 被修改的软件 ...

  5. 使用VS自带的混淆器防止你的程序被反编译

    这里就介绍大家使用VS自带的混淆器dotfuscator.exe来阻止这种行为. 首先要做的找到dotfuscator.exe: D:/Microsoft Visual Studio .NET 200 ...

  6. android 混淆规则作用,Android混淆规则

    简介 Java代码是非常容易反编译的.为了很好的保护Java源代码,我们往往会对编译好的class文件进行混淆处理. ProGuard是一个混淆代码的开源项目.它的主要作用就是混淆,当然它还能对字节码 ...

  7. Android混淆编译、反混淆、反编译

    混淆编译 为了保护APK代码和架构,不轻易被外部人员反编译和破解,对发布的APK,所以必须进行代码混淆编译. Java 是一种跨平台的.解释型语言,Java 源代码(.java文件)编译成中间&quo ...

  8. android开发笔记之 Android代码混淆打包

    大家应该都听过代码混淆吧,如果大家有去反编译过别人的APK的话,应 该会看到好多包名和类名是a,b.c-.之类的的吧,这里就提到了一个概念: 混淆. 那就让我们了解下这个东西吧 作用:为了防止自己的劳 ...

  9. android proguard 不起作用,Android-ProGuard 混淆

    前言 现在写的app 基本都是经过混淆了的,如果不混淆, 发布出去,别人一反编译 就可以直接看你的源码了 我现在用的AndroidStudio , 只需要在 build.grade 的配置文件中配置如 ...

最新文章

  1. 缅怀袁隆平院士:一颗稻谷里的爱国情怀
  2. 计算机可以待机无法关机,win7怎么设置不待机?如何设置自动关机的方法【详解】...
  3. 存储过程系列之存储过程返回值总结
  4. new对象后的代码块(匿名类)
  5. MongoDB数据库学习
  6. mac双系统w ndows8,U盘如何安装MAC双系统
  7. 【Python】 Python小游戏-贪吃蛇大冒险
  8. java程序员月薪3万需要掌握哪些技术?技术水平需要到什么程度?
  9. 微信JSAPI支付调不起收银台问题
  10. dvwa上传php文件,DVWA之文件上传漏洞
  11. 手机读卡但显示无服务器,手机不读卡了怎么修复
  12. PHP Fatal error: Uncaught Error: Class ‘\Elasticsearch\Serializers\SmartSerializer‘ not found in /h
  13. 加载json文件注意事项
  14. 创业日志(十二) 关于怠惰
  15. ArcBlock 将出席以太坊经典峰会 | ABT 预告
  16. 夏天你给你的爱车保养该怎么做
  17. php获取中文字符拼音首字母
  18. 时间戳和日期转换工具
  19. kernel启动优化
  20. ChatGPT写2023高考语文新课标I卷作文

热门文章

  1. 2019考研西交大软件工程
  2. 数据仓库之【用户行为数仓】01:项目效果展示、背景
  3. 青软集团蝉联华为云「千万俱乐部奖」「最佳销售黑钻奖」两大奖项
  4. 华大HC32F460时钟简介
  5. c语言免杀程序源码,Window下基于C/C++源码免杀理论及思路(新手篇)
  6. Spring常见错误 - Bean构造注入报空指针异常
  7. fabric基本概念
  8. linux下的svn服务器部署搭建
  9. Redis面试连环炮,你能撑到第几关?(持续更新中)
  10. 冰冰学习笔记:进程控制