首页 >> 数码 >

Android开发之混淆高级教程01

2022-06-18 17:20:18 来源: 用户: 

大家好,我是云百科的客服小柏,我来为大家解答以上问题。Android开发之混淆高级教程01很多人还不知道,现在让我们一起来看看吧!

解答:

1、 我们知道,Java将代码(。java)转换成字节码(。类)。相比源代码,字节码更加简洁,但是由于它只是将源代码编译成字节码,生成的字节码中会包含一些未使用的代码,特别是当你的项目包含一些第三方类库时,未使用的代码会更多。压缩阶段会对生成的字节码进行分析,然后在保证项目正常运行的情况下,去掉一些未被引用的类、字段和方法,这就是所谓的压缩阶段。

2、 要验证未引用的类、字段和方法是否真的被删除,创建一个模块,它包含两个类AdvancedCourseActivity和Subject,其中Subject未被引用。对混淆项进行签名打包,然后反编译生成的apk文件,检查主体字节码文件是否还存在,如下图所示:

3、 反编译的项目结构,如下所示:

4、 从上图可以发现,主体字节码文件已经被移除。接下来,用下面的代码修改Subject类:

5、 然后参考AdvancedCourseActivity中Subject提供的构造方法和get方法。没有引用的set方法会被移除吗?引用的代码如下:

6、 反编译的项目结构,如下所示:

7、 根据上面的分析,混淆代码后,引用的字段:courseName,creditHour,引用的方法:getCourseName(),getCreditHour(),以及构造方法都保留了。我们会在以后的困惑中巧妙的使用压缩规则,有点类似AndroidStudio的App链接助手功能。

8、 然后,打开混淆功能,默认执行压缩过程(即执行字节码分析),然后去掉无用的类、字段和方法。如果我们不想执行代码压缩,我们应该怎么做?

9、 这时候你需要学习一些压缩阶段的规则(除此之外还有优化规则和混淆规则)。压缩规则的选项包括:

10、 -唐斯林克

11、 打开混淆,默认压缩所有类。您可以通过上述关键字关闭压缩过程,并在proguard-rules.pro文件中添加以下规则:

12、 反编译的项目结构,如下所示:

13、 -printusage[文件名]

14、 将压缩阶段未引用的所有类的信息打印到指定文件。如果在proguard-rules.pro中没有指定这个选项,默认的输出路径是:

15、 在上面的例子中,主语不是指set方法。在usage.txt文件中,您可以找到以下信息:

16、 角色:

17、 可以用来检查签名包的apk,在压缩阶段去掉了哪些代码,是否符合自己的要求。

18、 -whyareyoukeepingclass_specification

19、 打印出压缩阶段保留类和内部成员的详细描述。class_specification指定了我们需要知道的类名。可以在Gradle控制台中查看打印的详细描述。例如,如果我们想知道为什么保留主题类信息,请在proguard-rules.pro文件中添加以下规则:

20、 运行当前演示,gradle控制台打印出以下信息:

21、 前面我们说过usage.txt文件记录了未引用的类信息,可以反过来。Subject类引用setCourseName()和setCreditHour()。此外,还引用了get方法和构造方法。从上图可以看出,调用了AdvancedCourseActivity的voidonCreate()。

22、 到目前为止,我们已经完成了压缩阶段的研究。

本文到此讲解完毕了,希望对大家有帮助。

  免责声明:本文由用户上传,与本网站立场无关。财经信息仅供读者参考,并不构成投资建议。投资者据此操作,风险自担。 如有侵权请联系删除!

 
分享:
最新文章
站长推荐