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。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-25 23:43:12

Android Studio 使用 Gradle 打包 Jar的相关文章

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

最近项目在做一个sdk,供别的开发者使用,所以要求导出jar包. 与eclipse不同,android studio 1.0 没提供导出jar包的图形界面.需要结合gradle来生成jar包. 首先 需要设置module应用的gradle插件为 library 代码长这样: ? 1 <code class="hljs">apply plugin: 'com.android.library'</code> 这样,build的时候,android studio 1.

在Android studio中用gradle打 jar 包(Mac下)

这两天公司要重构项目,以前的项目在eclipse上,准备迁移到Android studio上,需要对项目打包,于是我学习了Android studio中gradle打包的内容.我在公司用的Mac,在家用的Windows,两种平台下,打包基本一样的,这里主要说下在Mac系统下的过程. 在Andorid studio中的Terminal用的是Mac的终端,所以要使用Terminal的gradle命令打包,先要配置下mac中的gradle环境,打开mac上的终端: (1) 输入命令:open .bas

Android 项目利用 Android Studio 和 Gradle 打包多版本APK

在项目开发过程中,经常会有需要打包不同版本的 APK 的需求. 比如 debug版,release版,dev版等等. 有时候不同的版本中使用到的不同的服务端api域名也不相同. 比如 debug_api.com,release_api.com,dev_api.com等等. 不同的版本对应了不同的 api 域名,还可能对应不同的 icon 等. 如果每次都在打包前修改我们都手动来修改,这样实在是不够方便. 但如果我们使用了 Android Studio 和 Gradle,这个麻烦就可以轻松省去.

Android Studio 使用 Gradle 打包 Jar-IT蓝豹

Android Studio 打 Jar 包一直是一个麻烦的事,按照网上现有的教程,打包一个混淆的 jar 需要完成下列步骤: 将 plugin 修改为library后 build 出 aar,再提取 aar 里面的 classes.jar 使用 jarjar 等工具剔除多余的 class 对第二步得到的 jar 进行混淆 无论哪一步,所做的工作量都不少.于我个人而言,相当麻烦,于是花了些时间研究了下 Gradle 打 Jar 包. 代码 废话不多说,先上代码( 注 :只在 Gradle And

Android Studio之Gradle多渠道打包

Android Studio之Gradle多渠道打包 由于国内Android市场众多渠道,为了统计每个渠道的下载及其它数据统计,就需要我们针对每个渠道单独打包,如果让你打几十个市场的包岂不烦死了,不过有了Gradle,这事就简单了. 友盟多渠道打包 废话不多说,以友盟统计为例,在AndroidManifest.xml里面会有这么一段: <meta-data android:name="UMENG_CHANNEL" android:value="Channel_ID&qu

Android studio下gradle Robolectric单元测试配置

android studio下gradle Robolectric单元测试配置 1.Robolectric Robolectric是一个基于junit之上的单元测试框架.它并不依赖于Android提供的测试功能,它使用了shadow objects并且运行测试于普通的工作站/服务器JVM,不像模拟器或设备需要dexing(Android dex编译器将类文件编译成Android设备上的Dalvik VM使用的格式),打包,部署和运行的过程,大大减少了测试执行的时间. 参考:安卓单元测试相关概述h

android studio 怎样正确导入jar

近期又開始做android,使用android studio中遇到导入jar没有反应的问题,查了下资料实践攻克了,现特地写一下博客.希望对刚刚的使用的android studio的朋友有帮助. 1.先将你的jar包导入到libs下(直接直接复制过来). 2.在build.gradle中 dependencies{}里面 写上 compile files('libs/XX你的jar包.jar'),写好像这样. dependencies { compile files('libs/qqbrowser

Android Studio之Gradle

自从13年Google I/O大会上推出了Android Studio,我就逐步将开发工作从Eclipse转向了Android Studio,也越来越嫌弃老态龙钟的Eclipse.相比较而言,Android Studio无论从运行速度上还是对于Android开发的支撑上都完爆Eclipse:前者极具科技感的UI更是牢牢抓住了我的心!:) 话不多说,先上张碉堡了的截图: Android Studio默认采用Gradle编译项目:Gradle基于Groovy语言,Groovy是一种运行于JVM的动态

【Android Studio】Gradle DSL method not found:&#39;android()&#39;

如图所示: 参考:http://www.jianshu.com/p/d370d41fb7da 又遇到了这个问题: 参考:http://stackoverflow.com/questions/24204436/error1-0-plugin-with-id-android-not-found 然后是这个问题: 我也是醉了…… [Android Studio]Gradle DSL method not found:'android()'