以前没给别人提供过SDK,也就没想过这方面的事情,都是使用其他公司的SDK,比如QQ 微信分享,用起来是很爽,但是在目前这个阶段提供一个给其他小伙伴用就悲剧了
接到这个任务,总不能任性的说不搞,除非不想干了,然后俺就没管那么多,开始撸,没想到一路下来到处都是坑啊!有些公司用eclipse,有些intellij idea,有些android stuido,要是大家都统一用AS就简单了,直接导出一个aar包给其他小伙伴用就行,aar里面包含了.class文件、资源文件,可以说是相当的方便啊,不过呢不管谷歌官方多么积极的提倡用AS,但是来到天朝就不一样了,还是有些小伙伴在用用了几万年又不好用的eclipse,我也没法啊,不会打aar的小伙伴请找谷哥或者度娘。
经过九九八十一难,终于搞定了,内心无比的喜悦,那些不变的风霜早就无所谓,累也不说累……
不扯远了,fight begin,说下我的开发环境,win8.1、 AS1.5、eclipse、intellij idea、java1.8
首先,把主工程的build.gradle文件修改下,修改为依赖项目,applicationId 注释掉,如图:
接着,rebuild project项目就会在各个module 的build\intermediates\classes\debug下面生成代码的.class文件,
注意事项:千万不要点那个gradle 按钮去重新gradle一下,因为此时项目由于改了配置会报错的,我们只需要代码的.class文件,不需要gradle后出现的APK来运行
如图:
此时各个module 的build\intermediates\classes\debug下已经面生成代码的.class文件,如图:
然后继续配置主工程的build.gradle文件,先导入必须的工具,就下面这3行,如图:
接着添加打包jar的task和混淆jar的task,如图:
最后,打开AS底部的终端运行定义好的task,指令:gradlew proguardJar
等待运行完毕,成功后如图:
然后去主工程的build\libs下可以找到未混淆过的jar和混淆后的jar,大小不一样,混淆过后的小一点,如图:
上面只说了步骤,下面俺把主工程的build.gradle文件贴下
import com.android.build.gradle.AppPlugin
import com.android.build.gradle.LibraryPlugin
import proguard.gradle.ProGuardTask
apply plugin: 'com.android.library'
android {
compileSdkVersion 21
buildToolsVersion "23.0.1"
defaultConfig {
// applicationId "com.test.android"
minSdkVersion 9
targetSdkVersion 19
sourceSets.main {
jni.srcDirs = [] // This prevents the auto generation of Android.mk
}
}
sourceSets {
main {
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
manifest.srcFile 'AndroidManifest.xml'
assets.srcDirs = ['assets']
}
}
// buildTypes {
// release {
// minifyEnabled true
// proguardFiles 'proguard.cfg'
// }
// }
//
}
dependencies {
compile project(':thirdPart')
compile project(':player')
}
task buildJar(type: Jar) {
appendix = "demo"
baseName = "androidJar"
version = "1.0.0"
classifier = "release"
//后缀名
extension = "jar"
//最终的 Jar 包名,如果没设置,默认为 [baseName]-[appendix]-[version]-[classifier].[extension]
archiveName = "test.jar"
//需打包的资源所在的路径集
// /* windows 绝对路径*/
def srcClassDir = "D:\\test\\test\\build\\intermediates\\classes\\debug";
// 初始化资源路径集
from srcClassDir
def srcClassDir1 = "D:\\test\\player\\build\\intermediates\\classes\\debug";
// 初始化资源路径集
from srcClassDir1
def srcClassDir2 = "D:\\test\\thirdPart\\build\\intermediates\\classes\\debug";
// 初始化资源路径集
from srcClassDir2
/* windows 绝对路径*/
// /* windows 相对对路径*/
// 注意,相对路径只是相对于主工程的,所以其他依赖工程目录下的.class文件是找不到的,所以只能用于主工程src下有代码
// def srcClassDir = "/build/intermediates/classes/debug";
// 初始化资源路径集
// from srcClassDir
// /* windows 相对路径*/
//去除路径集下部分的资源,必须除去,不然运行项目时会报文件重复
exclude "**/BuildConfig.class"
exclude "**/BuildConfig\$*.class"
exclude "**/R.class"
exclude "**/R\$*.class"
exclude "**/Manifest.class"
exclude "**/Manifest\$*.class"
//只导入资源路径集下的部分资源
// include "com.test.android/**/*.class"
//注: exclude include 支持可变长参数
}
// 下面2种写法都可以,第一种是基于第一个先把.class文件打包成jar后进行混淆,
// 第二种是指定好jar包路径,直接混淆
task proguardJar(dependsOn: ['buildJar'], type: ProGuardTask) {
//task proguardJar(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.cfg'
// 未混淆的jar路径
// String inJar = buildJar.archivePath.getAbsolutePath() 这句话始终有错,请高手指教
String inJar = "build/libs/test.jar";
// 输入 jar
injars inJar
// 输出 jar 混淆后的
outjars inJar.substring(0, inJar.lastIndexOf('/')) + "/proguard-${buildJar.archiveName}"
// 这个是绝对路径的写法
// outjars "H:\\test.jar"
// 设置不删除未引用的资源(类,方法等),这里删除,可以缩小jar的大小
// 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)
}
}
}
注意:前面的步骤中rebuild project时先把下面的定义的task注释下,不然会执行的,执行就会报错
OK,到现在,就大功告成了,是不是很eazy啊,哈哈,妈妈再也不用担心打包混淆了,还没完呢,接下来我简单说下eclipse和intellij idea导出带资源jar的方法
先来老不死的eclipse:
首先主工程设置为依赖工程,如图:
然后,clean项目,如图:
注意:这2步是关键也是必须的,不然.class文件凡是资源id部分都是常量比如:tv.setText(34234324235),这一串数字给别人用时是根本找不到对应资源文件的,只有做了这2步才能生成这样的.class,如图:tv.setText(R.string.appname)
接着开始导出jar包 ,如图:
然后next,如图:
直勾选我圈出的,其他的不要勾,有几个依赖项目的,也都一样的只勾选src代码部分,
然后下一步下一步,直到点击finish,就开始打包了,如图:
看下intellij idea的打jar包,其实也很简单
先把所有的项目都设置为依赖项目,如图:
然后配置好需要打成jar的.class路径,如图:
然后,运行刚才的打包配置,如图:
接着就在配置的路径生成了jar
不管是什么工具打出的jar,只要未混淆还想要混淆都可以通过android SDK 的proguardgui.bat工具来混淆,不懂的小伙伴请移步:
http://blog.csdn.net/msn465780/article/details/49511019
好了,撸了这么多,也不知道各位听客也木有看懂,如果木有懂,请留言,或者加小的QQ(465780384)细聊
转载请注明本文出自Alex老夫子的博客(http://blog.csdn.net/msn465780),谢谢支持!