最近公司需要将数据进行打包提供给用户,需要我们提供数据解析的jar给用户,为了防止数据格式的泄露,需要进行混淆。这里记录一下封装jar并混淆的过程。

1.创建module 

之后创建了几个需要演示混淆的类。 

2.打包配置 
在Module的gradle里面,添加如下代码,跟dependencies平级;

task makeJar(type: Copy) {
//删除存在的
delete 'build/libs/mysdk.jar'
//设置拷贝的文件
from('build/intermediates/packaged-classes/release/')
//打进jar包后的文件目录
into('build/libs/')
//将classes.jar放入build/libs/目录下
//include ,exclude参数来设置过滤
//(我们只关心classes.jar这个文件)
include('classes.jar')
//重命名
rename ('classes.jar', 'myName.jar')
}
makeJar.dependsOn(build)

之前从网上进行查找的时候,都说打包后的jar包地址是在from('build/intermediates/bundles/release/')下,但是我发现怎么都找不到。原来是因为intermediates的结构发生了改变。 
 
现在在packaged-classes包下。

3.混淆 
因为我们是自己手动混淆了,所以要指定混淆规则,然后打开module的proguard-rules.pro文件,将AndroidStudio默认的混淆文件复制、粘贴到proguard-rules.pro中。 
proguard混淆的资料比较多,笔者就赘述了,需要可以的可以google。 
主要讲一下,需要注意的问题。因为我们需要jar包被别人使用,因此我们需要对外提供接口需要暴露出来,不需要混淆,可在配置文件加上。

-keep public class com.example.mylibrary.JarEntrance{
//保持了类mylibrary里面public 修饰的成员变量和public修饰的方法。
public <fields>;
public <methods>;
}

全部proguard-rules.pro配置如下

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -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.example.mylibrary.JarEntrance{
//保持了类mylibrary里面public 修饰的成员变量和public修饰的方法。
public <fields>;
public <methods>;
} -keep public class com.example.mylibrary.constant.*{*;}//禁止混淆constant下面的类 #忽略警告
-ignorewarnings
#保证是独立的jar,没有任何项目引用,如果不写就会认为我们所有的代码是无用的,从而把所有的代码压缩掉,导出一个空的jar
-dontshrink
#保护泛型
-keepattributes Signature

4.打包 
打开Terminal,输入gradlew makeJar,或者双击 makeJar。 
 
 
显示BUILD SUCCESSFUL,则说明打包成功。 
 
之后可以在/build/libs下看到打包成功的jar。 

======================== 
6月27日 
代码里加入异常抛出,发现混淆后throws FileNotFoundException不见了,后来发现需要在proguard-rules.pro里面加入-keepattributes Exceptions才可以。 
 

Android studio3.1.3 打包jar,混淆的更多相关文章

  1. Android Studio 使用 Gradle 打包 Jar

    Android Studio 打 Jar 包一直是一个麻烦的事,按照网上现有的教程,打包一个混淆的 jar 需要完成下列步骤: 1.将 plugin 修改为 library 后 build 出 aar ...

  2. android studio application应用打包jar

    转载: https://blog.csdn.net/xiayiye5/article/details/79639044 首先我们来说下打成jar包的分类: 1.application应用打成jar包 ...

  3. 【Android Studio安装部署系列】三十、从Android studio2.2.2升级到Android studio3.0之路

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 Android Studio 3.0的新功能 https://mp.weixin.qq.com/s/2XmVG4mKEDX6-bvZ ...

  4. Android 混淆打包不混淆第三方jar包

    项目由于要公布,所以要混淆打包. 混淆打包流程: 1.在proguard-project.txt文件里加入不须要混淆的类和第三方的jar包   这个是保持自己包中不须要混淆的类,假设有些类调用了jni ...

  5. android studio 使用gradle 导出jar包,并打包assets目录

    警告:本文年久失修. 随着android studio的升级 ,gradle的升级,严格按照本文的代码去做可能不会成功,希望依然可以作为解决问题的思路. 最近项目在做一个sdk,供别的开发者使用,所以 ...

  6. [转]--android studio 使用gradle 导出jar包,并打包assets目录

    转自: http://www.cnblogs.com/wuya/p/android-studio-gradle-export-jar-assets.html   最近项目在做一个sdk,供别的开发者使 ...

  7. android打包代码混淆

    android应用打包代码混淆:   1.将project.propertier文件中的proguard.config=proguard-android.txt打开  拷贝指定的文件到应用中 2.更改 ...

  8. Eclipse将android项目打包jar文件

    Eclipse+android打包jar文件 蔡建良 2016-3-12 以Android-SlideExpandableListView开源框架为例,将源码Library打包成jar文件并包含R.c ...

  9. 使用Android Studio手把手教你将应用打包+代码混淆

    最近几天用Google的Design库写了个App,使用Android Studio将app打包时遇到的几个瓶颈,所以把详细步骤写入下来. AS中怎么获取应用签名 这和eclipse不同,eclips ...

随机推荐

  1. SQL中IN和EXISTS用法的区别

    结论 1. in()适合B表比A表数据小的情况 2. exists()适合B表比A表数据大的情况 当A表数据与B表数据一样大时,in与exists效率差不多,可任选一个使用. select * fro ...

  2. day5模块学习--re正则模块

    1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十 ...

  3. html,css.javascript

    基本标签(a.p.img.li.table.div.span).表单标签.iframe.frameset.样式 1:Html  (Hypertext Markup Language) 超文本标记语言 ...

  4. Ubuntu+Fedora进阶学习,指令迅速查询,Bug迅速查询(Ctrl+F)

    There is some notes while I am learning Ubuntu Operate System! (Ask Ubuntu & Fedora) 1-- Hard li ...

  5. How to use Jackson to deserialise an array of objects

    first create a mapper : import com.fasterxml.jackson.databind.ObjectMapper; ObjectMapper mapper = ne ...

  6. 用js来实现那些数据结构04(栈01-栈的实现)

    其实说到底,在js中栈更像是一种变种的数组,只是没有数组那么多的方法,也没有数组那么灵活.但是栈和队列这两种数据结构比数组更加的高效和可控.而在js中要想模拟栈,依据的主要形式也是数组. 从这篇文章开 ...

  7. java代码审计文章集合

    0x00 前言 java代码审计相关文章整理,持续更新. 0x01 java环境基础 搭建Java Web开发环境   配置IDEA编辑器开发java web,从0创建项目   IDEA动态调试   ...

  8. C# DataGridView转DataTable

    public static DataTable ToDataTable(this DataGridView dataGridView, string tableName = null) { DataG ...

  9. AFP溢出攻击模块afp/loginext

    AFP溢出攻击模块afp/loginext   在苹果Mac OS X 10.3.3及以前版本,AFP服务存在缓存区溢出漏洞CVE-2004-0430.利用该漏洞,用户可以基于LoginExt包执行任 ...

  10. 模拟页面获取的php数据(三)

    <?php return array( "aData" => [//通勤方式 "trafficType" => [ 0 => [ &qu ...