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

Android Studio 使用 Gradle 打包 Jar

2015-12-18 11:31 661 查看
Android Studio 打 Jar 包一直是一个麻烦的事,按照网上现有的教程,打包一个混淆的 jar 需要完成下列步骤:

1.如果不使用assets文件夹打到jar中可使用一下方法:

与eclipse不同,android studio 1.0 没提供导出jar包的图形界面。需要结合gradle来生成jar包。

首先 需要设置module应用的gradle插件为 library 代码长这样:

apply plugin: 'com.android.library'
[/code]

这样,build的时候,android studio 1.0会在 module目录的build/intermediates/bundles/release/ 子目录(这个目录以后版本可能会变)里生成一个名为classes的jar包。
如果你的项目没用到assets等资源文件,那你直接拷贝出去就可以用了。

2.以下是Gradle 打 Jar 包

代码

废话不多说,先上代码(:只在 Gradle Android Plugin 1.2.3 测试过)

build.gradle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94

import com.android.build.gradle.AppPlugin
import com.android.build.gradle.LibraryPlugin
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/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')
//manifest 注册的组件对应的 proguard 文件
configuration project.buildDir.absolutePath + "/intermediates/proguard-rules/release/aapt_rules.txt"
configuration 'proguard-rules.pro'

String inJar = buildJar.archivePath.getAbsolutePath()
//输入 jar
injars inJar
//输出 jar
outjars inJar.substring(0, inJar.lastIndexOf('/')) + "/proguard-${buildJar.archiveName}"

//设置不删除未引用的资源(类,方法等)
dontshrink

Plugin plugin = getPlugins().hasPlugin(AppPlugin) ?
getPlugins().findPlugin(AppPlugin) :
getPlugins().findPlugin(LibraryPlugin)
if (plugin != null) {
List<String> runtimeJarList
if (plugin.getMetaClass().getMetaMethod("getRuntimeJarList")) {
runtimeJarList = plugin.getRuntimeJarList()
} else if (android.getMetaClass().getMetaMethod("getBootClasspath")) {
runtimeJarList = android.getBootClasspath()
} else {
runtimeJarList = plugin.getBootClasspath()
}

for (String runtimeJar : runtimeJarList) {
//给 proguard 添加 runtime
libraryjars(runtimeJar)
}
}
}

使用方法

不需要混淆则运行命令

gradle buildJar
或
./gradlew buildjar

需要混淆则运行

gradle proguardJar
或
./gradlew proguardJar

最后

buildJar 这部分相对比较简单,很多内容网上都有教程。关键在于混淆,由于团队每个人都有自己的安装习惯,JDK、Android SDK 路径不一定一致,并不能直接写死 runtime 的路径,最后直接看 Android Plugin 源码才写出了 proguardJartask。

至于想更多个性化的朋友,建议从源码入手。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: