您的位置:首页 > 移动开发 > Android开发

Android生成Jar包并混淆

2017-07-10 19:27 295 查看
公司下发新任务,需要提供SDK给合作伙伴,需求大概是这个样子的:

Created with Raphaël 2.1.0APPAPPSDKSDKBLE设备BLE设备请求数据处理数据返回给APP请求数据处理数据返回给SDK

这个SDK需要从我们已有的项目中提出来的,还好该项目再前段时间整改过,使用的是目前比较流行的框架dagger2+Rxjava+retrofit+volley+butterknife,其中关于蓝牙通讯的代码已经整合成模块,这样再打成Jar也不是那么痛苦。废话不多说,进入正题。

一、开始第一行代码(将目标模块独立出来)

1.创建新工程

撸主使用Android studio开始了一个新工程,将上述蓝牙通讯模块移植进来。

这里面需要注意的是要以library的形式存在于主工程下:



2.配置gradle

先上图:





类库中依赖了第三方的maven,这里先Mark下,后面在混淆的时候有使用到。

这里面还有两个生成和删除jar的gradle语法,撸主对gradle也没有深入研究,有兴趣的同学可以自行查阅资料。

3.运行生成jar

在Android studio中使用Gradle Projects管理上述gradle,如图所示:



在mylibrary下的tasks点击other找到我们在gradle中定义的makeJar,双击运行,运行成功,日志如下:



然后我们build目录下找到该Jar文件



撸主这里一直没有找到release的文件夹,所以使用debug(虽然也是一样可以用),这也算是个心结,哪位同学知道,还请留言指点。

4.第一阶段完成

已生成的jar包,导入新工程中验证没问题。算是第一步有惊无险的完成了。

二、开始混淆jar

1.准备工作

使用Android SDK中自带工具proguard来实现混淆,其实这个混淆并不是很彻底,改变了一些变量的名称,以及将一些实例对象独立出类来,已达到混淆视听的目的。这个效果对于你我而言,已足够啦!

找到proguard工具,记得使用proguardgui.jar图形化的:



查看proguard版本:



建议使用5.1以上版本,猛戳地址:
http://download.csdn.net/detail/hello_json/9894770
下载5.1版本。

2.开始混淆代码

混淆前jar的文件目录如下(这里留图做对比):



执行proguard程序



配置Input/Output选项



配置Shrnking选项



配置Obfuscation选项



配置Optimization选项



配置Information选项



配置Process选项



撸主在运行的过程中出现了以下问题:



以及找不到no.nordicsemi.android.dfu.ota等文件。因为我再配置Input选项中没有添加nordic的依赖,所以才会出现此情况。

因此需要增加代码如下:

-dontwarn no.nordicsemi.android.dfu.*,android.support.annotation.Nullable

表示不去理会这个两个错误。

如何增加?先将配置好的pro文件保存到本地,然后使用edit文档编辑器打开进行编辑,然后再打开proguard加载该配置文件。

3.混淆后的效果

老规矩,先上图:



其中增加的很多a b c 的类?比如说在A类中有个监听点击事件的listener,混淆后这个listener就有可能单独出去成为了a类。这样别人阅读起来就有些麻烦了。

三、关于proguard配置

参数:

-include {filename} 从给定的文件中读取配置参数

-basedirectory {directoryname} 指定基础目录为以后相对的档案名称

-injars {class_path} 指定要处理的应用程序jar,war,ear和目录

-outjars {class_path} 指定处理完后要输出的jar,war,ear和目录的名称

-libraryjars {classpath} 指定要处理的应用程序jar,war,ear和目录所需要的程序库文件

-dontskipnonpubliclibraryclasses 指定不去忽略非公共的库类。

-dontskipnonpubliclibraryclassmembers 指定不去忽略包可见的库类的成员。

保留选项:

-keep {Modifier} {class_specification} 保护指定的类文件和类的成员

-keepclassmembers {modifier} {class_specification} 保护指定类的成员,如果此类受到保护他们会保护的更好

-keepclasseswithmembers {class_specification} 保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。

-keepnames {class_specification} 保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除)

-keepclassmembernames {class_specification} 保护指定的类的成员的名称(如果他们不会压缩步骤中删除)

-keepclasseswithmembernames {class_specification} 保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)

-printseeds {filename} 列出类和类的成员-keep选项的清单,标准输出到给定的文件

压缩 :

-dontshrink 不压缩输入的类文件

-printusage {filename}

-whyareyoukeeping {class_specification}

优化:

-dontoptimize 不优化输入的类文件

-assumenosideeffects {class_specification} 优化时假设指定的方法,没有任何副作用

-allowaccessmodification 优化时允许访问并修改有修饰符的类和类的成员

混淆:

-dontobfuscate 不混淆输入的类文件

-printmapping {filename}

-applymapping {filename} 重用映射增加混淆

-obfuscationdictionary {filename} 使用给定文件中的关键字作为要混淆方法的名称

-overloadaggressively 混淆时应用侵入式重载

-useuniqueclassmembernames 确定统一的混淆类的成员名称来增加混淆

-flattenpackagehierarchy {package_name} 重新包装所有重命名的包并放在给定的单一包中

-repackageclass {package_name} 重新包装所有重命名的类文件中放在给定的单一包中

-dontusemixedcaseclassnames 混淆时不会产生形形色色的类名

-keepattributes {attribute_name,…} 保护给定的可选属性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClasses.

-renamesourcefileattribute {string} 设置源文件中给定的字符串常量
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息