AndroidStudio封装jar并混淆

原文地址:https://www.cnblogs.com/hsji/p/5310175.html

公司和A公司有技术合作,需要把接口封装成sdk供A公司调用,我被安排来做这个事情。这里记录一下封装jar并混淆的过程中遇到的一些问题,本文使用的IDE是AndroidStudio。

    1.新建项目之后看到proguard-rules.pro中并没有混淆java文件的代码,于是百度-->>复制-->>粘贴-->>运行,可是反编译apk之后发现根本没有混淆代码。这是真么回事呢?proguard-rules.pro文件写错了?没有配置到gradle文件里?查了很多资料,再加上多次的实验,我终于找到问题的所在。之前一直看到gradle文件配置混淆文件的上面还有一行——minifyEnabled false 从来没有深究过有什么意义(以后还是要多研究一下这些不起眼的小细节,没准那一天就把你拌趴下了),原来这个标志就是代码混淆的开关,默认是关闭的,所以之前虽然配置了混淆文件,但是并没有执行代码混淆。把这个标志位置为true,再运行就发现混淆起作用了。结论:进行代码混淆时,要先把开关(minifyEnabled )打开!

    2.如何封装jar包呢?只在AndroidStudio上创建过工程,怎么才能达成jar包呢?网上介绍了一些方法,让我在gradle文件里面新建任务大概是这个样子

复制代码

task makeJar(type: Copy) {
    delete 'build/libs/mysdk.jar'
    from('build/intermediates/bundles/release/')
    into('build/libs/')
    include('classes.jar')
    rename ('classes.jar', 'mysdk.jar')
}

makeJar.dependsOn(build)

复制代码

    一开始我也是这么做的,还真的在build/libs目录下面生成了一个mysdk.jar文件。后来仔细看了这一段代码,发现这段代码先是执行了build,然后把build/intermediates/bundles/release目录下生成的classes.jar文件改了一个名字而已,实在是太鸡肋了。你自己运行工程,直接把build/intermediates/bundles/release目录下的classes.jar拷贝出来就行了,没必要这么麻烦。结论:build输出文件中已包含jar包,不必再想办法生成jar,jar包位置build/intermediates/bundles/release/classes.jar

    3.封装什么东西?由于合作的事情还在谈,我并不知道最终的交付的sdk有什么要求,所以我做了两个方面的尝试,第一:仅封装接口;第二:提供接口和UI。先说第一种,我使用的方法和一般添加Module Library并不相同,我只是添加了一个普通的java的jar,Module中只有代码和gralde没有Manifest,没有res。下面是我的gradle文件,帮助理解

复制代码

apply plugin: 'java'
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile files('libs/android.jar')
    compile 'com.google.code.gson:gson:2.5'
    compile 'com.squareup.okhttp:okhttp:2.5.0'
    compile 'com.squareup.okio:okio:1.6.0'
}

复制代码

 

    这个地方有几点需要注意的,android.jar去哪里找?我注意到工程的最下面有一个External Library目录,这个目录关联了工程的依赖文件。右键之后选择file path就可以看到jar的位置了,然后去这个目录下边拷贝出来就行了。像这样

我尝试讲gson、okhttp的jar包也通过compile files引用,但是在主工程里面提示类没有定义,只有通过这种方式,才不会报错。结论:我封装的jar和界面没有关系,所以我用了一种更干净的方法,来生成jar。

    4.运行程序,因为我没有使用“apply plugin: 'com.android.library'”所以目录结构跟上面又不太一样,我的目录结构是这样的,module名为meddo

可以看到build/libs下面已经生成好了一个jar。我把meddo.jar文件拷贝出来开始进行混淆。

    5.jar混淆,这里使用的是sdk中包含的工具,具体位置sdk\tools\proguard\bin\proguardgui.bat。使用这个工具之前要做好准备工作:a.准备好要混淆的jar(上面的meddo.jar);b.准备好jar中使用的第三方jar(我这里使用到了android.jar,okhttp-2.5.0.jar,okio-1.6.0.jar,gson-2.5.jar);c.准备好混淆配置文件。

    介绍一下我这边项目的具体情况:I)我写了一个外观类MeddoInterface,并在这个类中开放出两个方法init(Context)和UserLogin(HashMap<String,String>,ResultCallBack<UserLoginResponse>)  II)封装了访问网络的操作,使用的是okhttp,中间用到了Gson,反射来解析数据

下面是混淆文件,有些冗余的东西,不要见怪

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

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

-optimizationpasses 5

-dontusemixedcaseclassnames

-dontskipnonpubliclibraryclasses

-dontpreverify

-dontshrink#混淆jar的时候一定要配置,不然会把没有用到的代码全部remove   我本来封装一个jar就是给别人调用的,全部删掉就没有东西了

-verbose

 

-keepattributes Signature #过滤泛型 用到发射,泛型等要添加这个

-keepattributes *Annotation*

 

-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

 

#如果你使用了ProGuard来导入第三方jar这个地方就不用配置了

#-libraryjars ../meddo/libs/android.jar

#-libraryjars ../meddo/libs/gson-2.5.jar

#-libraryjars ../meddo/libs/okhttp-2.5.0.jar

#-libraryjars ../meddo/libs/okio-1.6.0.jar

 

-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 com.android.vending.licensing.ILicensingService

 

-keepclasseswithmembernames class * {

    native <methods>;

}

 

-keepclasseswithmembernames class * {

    public <init>(android.content.Context, android.util.AttributeSet);

}

 

-keepclasseswithmembernames class * {

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

}

 

-keepclassmembers enum * {

    public static **[] values();

    public static ** valueOf(java.lang.String);

}

 

-keep class * implements android.os.Parcelable {

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

}

#公开两个方法供使用者调用

-keep public class com.hsji.makejar.MeddoInterface{

 public static void UserLogin(java.util.HashMap, com.hsji.makejar.network.ResultCallback);

 public static void init(android.content.Context);

}

#解析数据是用的的bean  完全不混淆,不然解析json数据时什么都找不到

-keep public class com.hsji.makejar.UserLoginResponse{*;}

#不要混淆ResultCallback的public方法

-keep public class com.hsji.makejar.network.ResultCallback{

 public <methods>;

}

 

#okhttp

-dontwarn com.squareup.okhttp.**

 

-keep class com.squareup.okhttp.** { *;}

 

-dontwarn okio.**

 

-keep class okio.** {*;}

 

#json

-dontwarn com.google.gson.**

 

-keep class com.google.gson.**{*;}

 ok,现在我们原料都有了,开始混淆吧!

 step1:

 导入ProGuard配置文件

step2:导入需要混淆的jar和第三方jar,填写输出文件,这里额外添加一个一个java\jre7\lib\rt.jar(具体以自己电脑环境为准)

step3:进入Process标签页,点击右下角的Process!按钮,开始混淆,很快就混淆好了

 

注:以上为个人的方法,不喜勿喷

      关于proguard文件的配置可以参考这篇文章《android 混淆文件proguard.cfg详解》

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值