android 子module混淆_Android 多模块打包混淆填坑记

最近有个 sdk 的项目使用了多模块(Module)开发,然后提供 jar 包给接入者使用,要求大部分类是混淆过的,保留几个接口,

Android Studio 能够导出 aar 文件,对于导出 jar 却要大费一番周折。我在网上找到这个比较靠谱的解决方案: [Android Studio分模块自动化构建实战](Android Studio分模块自动化构建实战),它通过 shell 脚本执行 Java 打包命令,解压各个模块的 class 文件然后合成一个完整的 class 文件。

导出 jar 后,下一步就是进行混淆了。根据网上的资料,我自己写了一个 gradle task: proguardJar,专门用来做混淆。遇到的坑就是下面的 libraryjars,加上该参数会忽略 jar 包引用的 Java 和 Android API,保证混淆继续进行,要不然就会出现类似 can't find referenced class java.lang.String 这样的报错。

// 混淆 jar 包

task proguardJar(type: ProGuardTask) {

def properties = new Properties()

def file = file("../../local.properties")

properties.load(new FileInputStream(file))

def sdkDir = properties.getProperty("sdk.dir")

// 输出路径

def path = "../../output/${project.ext.SDK_NAME}.jar"

delete path

// 未混淆的jar路径

injars "../../output/unminified/${project.ext.SDK_PRODUCT}_sdk_unminified.jar"

// 混淆后的jar输出路径

outjars path

// 混淆协议

configuration '../../proguard-rules.pro'

// 忽略 Java 和 Android API

libraryjars "${System.getProperty('java.home')}/lib/rt.jar"

libraryjars "${System.getProperty('java.home')}/lib/jce.jar"

libraryjars "${sdkDir}/platforms/android-${rootProject.ext.pyramidneyCompileSdkVersion}/android.jar"

println("proguardJar done!")

}

另外,混淆规则需要加上 -dontshrink,表示不压缩输入的类文件,比如不会移除无用的方法、域或者类。这样做的目的是保留对外的接口,但是带来的问题是 jar 包体积的增大,所以在编码中就要做好优化工作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527196.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql索引_MySQL索引介绍和实战

索引是什么MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。可以得到索引的本质:索引是数据结构,索引的目的是提高查询效率,可以类比英语新华字典,根据目录定位词语如果没有目录呢&#xff0c…

mysql自增字段_MySQL自增字段的常用语句

学习MySQL数据库,MySQL自增字段是最基础的部分之一,下面为您介绍一些MySQL自增字段的常用语句,希望对您学习MySQL自增字段能些许帮助。1、创建表格时添加: create table table1(id int auto_increment primary key,...)2、创建表格…

mysql安装需要注意什么意思_mysql 安装过程及注意事项

1.1. 下载:我下载的是64位系统的zip包:下载zip的包:下载后解压:D:\软件安装包\mysql-5.7.20-winx641.2. 配置环境变量:变量名:MYSQL_HOME变量值:E:\mysql-5.7.20-winx64path里添加:%…

mysql 语句检查_mysql查询语句

一、简单查询1.最简单查询(查所有数据)select * from 表名 注意:* 代表所有列,并不是代表所有行例:select * from test2.查询指定列select 列名,列名 from 表名例:select code,name from test3.修改结果集的列名 asselect 列名 …

mysql索引 物理文件_MySQL体系结构之物理文件

一、MySQL日志文件mysql日志文件及功能:日志文件功能错误日志记录启动、停止、运行过程中mysqld时出现的问题通用日志记录建立客户端连接和执行的语句二进制日志记录更改数据的所有语句,还用于复制慢查询日志记录执行时间超过long_query_time秒的所有查询…

mysql每次查询1000条数据库_30多条mysql数据库优化方法,千万级数据库记录查询轻松解决...

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,Sql 代码 : select id from t where …

mysql count转字符串_MySQL字符串函数

把字符串转成小写mysql> select sex,LCASE(job) from string_test where jobDUCK;------------------| sex | LCASE(job) |------------------| 1 | duck |------------------1 row in set (0.00 sec)3,FIND_IN_SET(str,strlist)4,FIELD(str,str1,str…

gitlab 端口_安装Gitlab-注意端口

文档本身并没有什么特殊,安装也很简单,只是修改端口这里如果有需要的可以看一下安装Gitlab[rootdeploy ~]# sudo yum -y install gitlab-ce默认端口是8080,避免冲突还是修改一下[rootlocalhost ~]# cat /etc/gitlab/gitlab.rb |grep 192.168.…

MySQL read-c_技术分享 | MySQL C API 参数 MYSQL_OPT_READ_TIMEOUT 的一些行为分析

作者:戴岳兵MYSQL_OPT_READ_TIMEOUT 是 MySQL c api 客户端中用来设置读取超时时间的参数。在 MySQL 的官方文档中,该参数的描述是这样的:MYSQL_OPT_READ_TIMEOUT (argument type: unsigned int *)The timeout in seconds for each attempt t…

mysql出现core dumped_mysql-为什么我遇到分段错误(核心已转储)?

这是我要运行的代码.它可以编译,并且工作良好,直到昨天.#include #include int main(int argc, char **argv){MYSQL *conn;MYSQL_RES *result;MYSQL_ROW row;int num_fields;int i;conn mysql_init(NULL);mysql_real_connect(conn, "hostname", "username"…

mysql解释中fitered_MySQL的explain中的参数说明

1、id每个被独立执行的操作的标识,表示对象被操作的顺序;id值大,先被执行;如果相同,执行顺序从上到下。若没有子查询和联合查询,id则都是1。Mysql会按照id从大到小的顺序执行query,在id相同的情…

vue脚手架搭建项目_复习之vue脚手架搭建项目的两种方法

安装脚手架node 版本要求: > 8.9 。关于旧版本:如果在这之前已经全局安装了旧版本的vue-cli(1.x 或 2.x),那么需要先卸载掉。卸载旧版本运行:npm uninstall vue-cli -g 或 yarn global remove vue-cli。安装vue/cli&#xff1a…

ubuntu修改mysql账户密码_Ubuntu修改mysql用户重置密码

编辑mysql的配置文件/etc/mysql/my.cnf,或者/etc/mysql//mysql.conf.d/mysqld.cnf,在[mysqld]段下加入一行“skip-grant-tables”。1、安装$ sudo apt-get install mysql-server$ apt install mysql-client$ apt install libmysqlclient-dev以此在终端输入上述代码&…

pythonsocket中tcp通信接收不到数据_TCP 为什么三次握手而不是两次握手(正解版)...

先说结论为了实现可靠数据传输, TCP 协议的通信双方, 都必须维护一个序列号, 以标识发送出去的数据包中, 哪些是已经被对方收到的。 三次握手的过程即是通信双方相互告知序列号起始值, 并确认对方已经收到了序列号起始…

mysql高级查询面试_高级MySQL数据库面试问题 附答案

因为有大家的支持,我们才能做到现在,感谢你们这一路上对我们的支持.在这篇文章中,我们将主要针对MySQL的实用技巧,讲讲面试中相关的问题.1. 如何使用SELECT语句找到你正在运行的服务器的版本并打印出当前数据库的名称?答&#xf…

ecshop清除mysql缓存_ECSHOP缓存清理关闭教程

ECSHOP的缓存存放在templates/caches/文章夹下,时间长了这个文件夹就会非常庞大,拖慢网站速度。还有很多情况我们不需要他的缓存。本文介绍禁用ECSHOP缓存的方法。ECSHOP的缓存有两部分,一部分是SMARTY的页面缓存;另一部分是SQL查…

mysql无法启动如何备份文件_mysql 5.7 停电导致无法启动、如何备份数据,重新安装mysql...

用于记录服务器停电导致,mysql启动失败后,如何备份数据,重新安装mysql,主要分为数据备份,mysql重新安装。1、mysql无法启动时,进行数据备份。执行:systemctl start mysqld,启动失败。…

python tkinter entry默认值_Python ---(六)Tkinter窗口组件:Entry

The Tkinter Entry Widget##简介Entry(输入框)组件通常用于获取用户的输入文本。##何时使用 Entry 组件?Entry 组件仅允许用于输入一行文本,如果用于输入的字符串长度比该组件可显示空间更长,那内容将被滚动。这意味着该字符串将不能被全部看…

java不显示图片_Java图片显示不出来,怎么解决

展开全部有两个问题:图片路径没有写对,图片在 src 下,图片路径应是 src/海洋.png,正e68a84e8a2ad62616964757a686964616f31333365656632确的写法应是 image new ImageIcon("src/海洋.png")image new ImageIcon("…

memcached的java客户端_Memcached Java客户端

代码示例:import com.danga.MemCached.*;import org.apache.log4j.*;public class TestMemcached {public static void main(String[] args) {/*初始化SockIOPool,管理memcached的连接池*/String[] servers { "192.168.1.20:12111" };SockIOP…