android 混淆压缩比例,Android压缩代码(混淆)

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

前言  最近项目中需要对AAR进行代码混淆,踩了不少坑,所以这里主要针对AAR混淆整理一下,方便以后的问题的解决。

混淆的优点减小APK文件的大小

移除封装应用中未使用的类、字段、方法和属性

用短名称混淆其余的类、字段和方法,可令APK难以逆向工程。混淆的缺点拖慢项目的构建速度如何开启混淆  在build.gradle文件中设置:1

2

3

4

5

6

7

8

9

10

11

12

13android{

buildTypes {

release {

minifyEnabled true

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

}

debug {

minifyEnabled false

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

}

}

...

}

这里minifyEnabled就是控制是否开启混淆的(这里要注意区分release和debug)。而proguard-rules.pro这个文件就是用来配置混淆的。配置混淆文件不能混淆的文件

比如四大组件、自定义View、实体类、枚举类、序列化类、第三方jar包等等。1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45-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.view.View

-keep public class com.android.vending.licensing.ILicensingService

-keep class android.support.** {*;}

-keepclasseswithmembernames class * {

native ;

}

-keepclassmembers class * extends android.app.Activity{

public void *(android.view.View);

}

-keep public class * extends android.view.View{

*** get*();

void set*(***);

public (android.content.Context);

public (android.content.Context, android.util.AttributeSet);

public (android.content.Context, android.util.AttributeSet, int);

}

-keepclasseswithmembers class * {

public (android.content.Context, android.util.AttributeSet);

public (android.content.Context, android.util.AttributeSet, int);

}

-keep class * implements android.os.Parcelable {

public static final android.os.Parcelable$Creator *;

}

-keepclassmembers class * implements java.io.Serializable {

static final long serialVersionUID;

private static final java.io.ObjectStreamField[] serialPersistentFields;

private void writeObject(java.io.ObjectOutputStream);

private void readObject(java.io.ObjectInputStream);

java.lang.Object writeReplace();

java.lang.Object readResolve();

}

-keep class **.R$* {

*;

}

-keepclassmembers class * {

void *(**On*Event);

}

一些第三方jar包的使用说明中也会有混淆说明,需要自行去添加,这里就不举例说明了。接下来就是针对自己项目的需求进行混淆了,比如因为我是一个AAR,所以一些暴露出来的接口就不能被混淆,还有自己的实体类也不能混淆(所以把实体类归在一个包下是最方便的了)。1

2

3-keep class com.eric.android.hs.activity.HSVideoSDK{*;}

-keep class com.eric.android.hs.bean.**{*;}

-keep class com.eric.android.hs.callback.HSSDKListener{*;}

好,这时候我们开始编译,大功告成了?怕是想多了。可能遇到的问题  紧接着我们可能会遇到类似这样的问题。1. 报出许多Warning1

2

3

4

5

6

7

8

9

10

11Warning:android.http.b: can't find referenced class java.lang.invoke.LambdaForm$Hidden

Warning:com.ainemo.a.c: can't find referenced class java.lang.invoke.LambdaForm$Hidden

Warning:com.ainemo.a.d: can't find referenced class java.lang.invoke.LambdaForm$Hidden

Warning:com.ainemo.a.e: can't find referenced class java.lang.invoke.LambdaForm$Hidden

Warning:com.ainemo.a.f: can't find referenced class java.lang.invoke.LambdaForm$Hidden

....

Warning:there were 80 unresolved references to classes or interfaces.

Warning:there were 2 unresolved references to program class members.

Warning:Exception while processing task java.io.IOException: Please correct the above warnings first.

Error:Execution failed for task ':heysharevideo:transformClassesAndResourcesWithProguardForDebug'.

> Job failed, see logs for details

虽然不知道为什么会有这么多警告,反正我目前的解决方法就是警告什么,我就设置忽略警告。1

2

3

4

5-dontwarn com.ainemo.a.**

-dontwarn com.ainemo.sdk.module.**

-dontwarn android.http.b

-dontwarn com.ainemo.sdk.otf.**

-dontwarn vulture.module.call.**

2. jar包被重复声明1

2Warning:Exception while processing task java.io.IOException: The same input jar [D:ASProjectHSVideosdkDemoheysharevideolibsgson-2.7.jar] is specified twice.

Error:Execution failed for task ':heysharevideo:transformClassesAndResourcesWithProguardForDebug'.> Job failed, see logs for details

这里的原因应该是在Android Studio中的build.gradle里,这句话1implementation fileTree(include: ['*.jar'], dir: 'libs')

默认将libs里的jar包进行排除混淆,所以无需在混淆配置里像这样声明:1-libraryjars libs/gson-2.7.jar

3. 项目相关的问题

这时候你可能已经可以编译AAR了,但是使用起来可能还是会报错。大部分原因是你混淆了不能混淆的代码,这时候就需要你根据异常信息找到相关的文件,在proguard-rules.pro进行不混淆。

为了方便异常信息追踪,我们可以保留代码行号:1-keepattributes SourceFile,LineNumberTable

找到相关文件,然后不混淆:1-keep class com.eric.android.hs.**{*;}//**可以换成具体类名,*可以换成具体的字段

这里就需要大家自行操作了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值