Android Studio 使用 Gradle 打包 Jar
Android Studio 打 Jar 包一直是一个麻烦的事,按照网上现有的教程,打包一个混淆的 jar 需要完成下列步骤:
1.将 plugin 修改为 library 后 build 出 aar,再提取 aar 里面的 classes.jar
2.使用 jarjar 等工具剔除多余的 class
3.对第二步得到的 jar 进行混淆
无论哪一步,所做的工作量都不少。于我个人而言,相当麻烦,于是花了些时间研究了下 Gradle 打 Jar 包。
代码
废话不多说,先上代码(注:只在 Gradle Android Plugin 1.2.3 测试过)
build.gradle
import com.android.build.gradle.AppPlugin
import proguard.gradle.ProGuardTask
apply plugin: ‘com.android.application’
android {
compileSdkVersion 22
buildToolsVersion “22.0.1”
defaultConfig {
applicationId “org.chaos.demo.jar”
minSdkVersion 22
targetSdkVersion 22
versionCode 1
versionName “1.0”
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’
}
}
}
dependencies {
compile fileTree(dir: ‘libs’, include: [‘*.jar’])
}
//dependsOn 可根据实际需要增加或更改
task buildJar(dependsOn: [‘compileReleaseJava’], type: Jar) {
appendix = “demo”
baseName = “androidJar”
version = “1.0.0”
classifier = “release”
//后缀名
extension = “jar”
//最终的 Jar 包名,如果没设置,默认为 [baseName]-[appendix]-[version]-[classifier].[extension]
archiveName = “AndroidJarDemo.jar”
//需打包的资源所在的路径集
def srcClassDir = [project.buildDir.absolutePath + “/intermediates/classes/release”];
//初始化资源路径集
from srcClassDir
//去除路径集下部分的资源
// exclude “org/chaos/demo/jar/MainActivity.class”
// exclude “org/chaos/demo/jar/MainActivity$*.class”
exclude “org/chaos/demo/jar/BuildConfig.class”
exclude “org/chaos/demo/jar/BuildConfig$*.class”
exclude “**/R.class”
exclude “*/R$.class”
//只导入资源路径集下的部分资源
include “org/chaos/demo/jar/*/.class”
//注: exclude include 支持可变长参数
}
task proguardJar(dependsOn: [‘buildJar’], type: ProGuardTask) {
//Android 默认的 proguard 文件
configuration android.getDefaultProguardFile(‘proguard-android.txt’)
//会根据该文件对 Jar 进行混淆,注意:需要在 manifest 注册的组件也要加入该文件中
configuration ‘proguard-rules.pro’
String inJar = buildJar.archivePath.getAbsolutePath()
//输入 jar
injars inJar
//输出 jar
outjars inJar.substring(0, inJar.lastIndexOf(‘/’)) + “/proguard-${buildJar.archiveName}”
//设置不删除未引用的资源(类,方法等)
dontshrink
AppPlugin appPlugin = getPlugins().findPlugin(AppPlugin)
if (appPlugin != null) {
List runtimeJarList
if (appPlugin.getMetaClass().getMetaMethod(“getRuntimeJarList”)) {
runtimeJarList = appPlugin.getRuntimeJarList()
} else if (android.getMetaClass().getMetaMethod(“getBootClasspath”)) {
runtimeJarList = android.getBootClasspath()
} else {
runtimeJarList = appPlugin.getBootClasspath()
}
for (String runtimeJar : runtimeJarList) {
//给 proguard 添加 runtime
libraryjars(runtimeJar)
}
}
}
为什么已在 manifest 注册的组件需要在 .pro 文件声明对应的混淆规则?
可能各位注意到 proguardJar task 的第二行注释,在 apk 的打包过程中,aapt 会在解析 manifest 后生成一个用于不混淆 manifest 中已注册的组件的规则文件。Gradle Android Plugin 中配置上述 aapt 生成的规则文件的代码如下:
BasePlugin.groovy
protected File createProguardTasks(@NonNull BaseVariantData variantData,
@Nullable BaseVariantData testedVariantData) {
……
// also the config file output by aapt
proguardTask.configuration(variantData.processResourcesTask.proguardOutputFile)
……
}
碍于个人能力原因,获取不到 processResourcesTask 的实例,所以目前只能先添加对应的组件到规则文件中,还望知道怎么获取的朋友能够分享下,谢谢。
使用方法
不需要混淆则运行命令
gradle buildJar
或
./gradlew buildjar
需要混淆则运行
gradle proguardJar
或
./gradlew proguardJar
最后
buildJar 这部分相对比较简单,很多内容网上都有教程。关键在于混淆,由于团队每个人都有自己的安装习惯,JDK、Android SDK 路径不一定一致,并不能直接写死 runtime 的路径,最后直接看 Android Plugin 源码才写出了 proguardJar task。
Android Studio 使用 Gradle 打包 Jar的更多相关文章
- android studio 使用gradle 导出jar包,并打包assets目录
警告:本文年久失修. 随着android studio的升级 ,gradle的升级,严格按照本文的代码去做可能不会成功,希望依然可以作为解决问题的思路. 最近项目在做一个sdk,供别的开发者使用,所以 ...
- [转]--android studio 使用gradle 导出jar包,并打包assets目录
转自: http://www.cnblogs.com/wuya/p/android-studio-gradle-export-jar-assets.html 最近项目在做一个sdk,供别的开发者使 ...
- 在Android studio中用gradle打 jar 包(Mac下)
这两天公司要重构项目,以前的项目在eclipse上,准备迁移到Android studio上,需要对项目打包,于是我学习了Android studio中gradle打包的内容.我在公司用的Mac,在家 ...
- Android 项目利用 Android Studio 和 Gradle 打包多版本APK
在项目开发过程中,经常会有需要打包不同版本的 APK 的需求. 比如 debug版,release版,dev版等等. 有时候不同的版本中使用到的不同的服务端api域名也不相同. 比如 debug_ap ...
- 利用 Android Studio 和 Gradle 打包多版本APK
在项目开发过程中,经常会有需要打包不同版本的 APK 的需求. 比如 debug版,release版,dev版等等. 有时候不同的版本中使用到的不同的服务端api域名也不相同. 比如 debug_ap ...
- android studio application应用打包jar
转载: https://blog.csdn.net/xiayiye5/article/details/79639044 首先我们来说下打成jar包的分类: 1.application应用打成jar包 ...
- Android studio下gradle Robolectric单元测试配置
android studio下gradle Robolectric单元测试配置 1.Robolectric Robolectric是一个基于junit之上的单元测试框架.它并不依赖于Android提供 ...
- Android Studio(九):引用jar及so文件
Android Studio相关博客: Android Studio(一):介绍.安装.配置 Android Studio(二):快捷键设置.插件安装 Android Studio(三):设置Andr ...
- Android Studio :Android Studio 与 Gradle 深入【二】
转载:http://www.apkbus.com/forum.php?mod=viewthread&tid=255063&extra=page%3D2%26filter%3Dautho ...
随机推荐
- Head First Java设计模式思维导图总结
关于Head First Java设计模式的思维导图总结:
- Python中什么是变量Python中定义字符串
在Python中,变量的概念基本上和初中代数的方程变量是一致的. 例如,对于方程式 y=x*x ,x就是变量.当x=2时,计算结果是,当x=5时,计算结果是25. 只是在计算机程序中,变量不仅可以是数 ...
- python笔记四(dict/set/不可变对象)
一.dict 字典是包含key_value存储方式.在放进去的时候,必须根据key值Hash出value的存放位置,这样,取的时候才能根据key直接拿到value. dict的操作: d = {'Mi ...
- python 常用镜像
pip镜像https://pypi.tuna.tsinghua.edu.cn/simplehttps://pypi.douban.io.com/simple pip install python-qt ...
- Go 语言循环语句
在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句. 以下为大多编程语言循环程序的流程图: Go 语言提供了以下几种类型循环处理语句: 循环类型 描述 for 循环 重复执 ...
- PHP XML 函数
PHP XML Parser 简介 XML 函数允许您解析 XML 文档,但无法对其进行验证. XML 是一种用于标准结构化文档交换的数据格式.您可以在我们的 XML 教程 中找到更多有关 XML 的 ...
- Bootstrap3 表格-条纹状表格
通过 .table-striped 类可以给 之内的每一行增加斑马条纹样式. 跨浏览器兼容性 条纹状表格是依赖 :nth-child CSS 选择器实现的,而这一功能不被 Internet Explo ...
- 异步请求引发的Chrome死锁
浏览器支持的并发异步请求数目是有限的,当需要的资源过多时候(远远大于并发数目),就需要自己管理XHR请求. 在实现自己的XHR的Manger时候,当请求数目达到2000多的时候,经常会遇到chrome ...
- 计算机网络之动态主机配置协议DHCP
为了将软件协议做成通用的和便于移植,协议软件的编写者不会把所有细节都固定在源代码中,而是把协议软件参数化,这就使得在很多台计算机上使用同一个经过编译的二进制代码成为可能. 一台计算机和另一台计算机的区 ...
- linux网络编程之一-----多播(组播)编程
什么是多播 组播(Multicast)是网络一种点对多(one to many)的通信方式,通过报文复制完成网络中一台server对应多台接收者的高效数据传 送.对其形象的比喻就是类似于广播电台和电视 ...