转载请标明出处:http://blog.csdn.net/xx326664162/article/details/49445843 文章出自:薛瑄的博客
你也可以查看我的其他同类文章,也会让你有一定的收货!
在android studio中有两种方法可以打包出jar包,下面分别介绍这两种方法:
注意:不能直接将.so文件直接添加到Android的JAR包了,详情
方法一:
1、在module的gradle里添加下面代码(有指定 applicationId 情况下还需要注释对应代码),运行命令 gradle bundleRelease,等待完成
apply plugin: 'com.andriod.library'
2、build的时候,android studio 2.2.3会在 module目录的build/outputs/aar/ 子目录(这个目录以后版本可能会变)里生成一个和module同名的aar包。也可以使用 aar 等工具剔除多余的 class
方法二:使用gradle生成jar包。
需要写gradle脚本,但gradle脚本的入门成本还是比较高,网上也有打包jar的脚本参考,但大多是通过生成classes.jar重命名来生成(这篇博客就是这种方式),这样生成的jar是包含工程里所有类的,有时我们需要指定一些包和类来生成jar。
在将要生成jar包的module里的build.gradle配置文件中添加如下代码,打包jar包,可以选择混淆和不混淆,下面分别提供这两种代码:
不混淆打包Jar
//建立一个task,名称为clearJar
task clearJar(type: Delete) {
delete 'libs/sdk.jar'
}
task makeJar(type:org.gradle.api.tasks.bundling.Jar) {
//指定生成的jar名
baseName = "androidJar"
appendix = "demo"
version = "1.0.0"
classifier = "release"
//后缀名
extension = "jar"
//最终的 Jar 包名,如果没设置archiveName,默认为 [baseName]-[appendix]-[version]-[classifier].[extension]
archiveName = "AndroidJarDemo.jar"
//从哪里打包class文件
from('build/intermediates/bundles/debug/')
//打包到jar后的目录结构
into('libs/')
//去掉不需要打包的目录和文件
exclude('test/', 'BuildConfig.class', 'R.class')
//去掉R$开头的文件
exclude{ it.name.startsWith('R$');}
}
//依赖build(build是一个自带的task)
makeJar.dependsOn(clearJar, build)
在build.gradle文件中写入上面代码后,只要在命令行执行gradle makeJar
(第一次执行会从https://jcenter.bintray.com/下载很多文件 )就可以在build/libs目录下找到这个jar
上面是个简单的例子,只能打包某个包下面的所有文件,如果要实现只打某个包下面的某些子包或者文件可参考如下示例:
task makeSdkJar(type:org.gradle.api.tasks.bundling.Jar) {
baseName 'pluginsdk'
//只打包org.cmdmac下的org.cmdmac.pluginsdk.impl和org.cmdmac.gamecenter,其他子包不会被打包进去
from('build/intermediates/bundles/debug/') {
include 'pluginsdk/impl'
include 'gamecenter'
}
into('libs/')
// exclude('R.class')
// exclude{ it.name.startsWith('R$');}
}
混淆打包Jar
task makeJar(type: proguard.gradle.ProGuardTask, dependsOn: "build") {
// 未混淆的jar路径
injars 'build/intermediates/bundles/release/classes.jar'
// 混淆后的jar输出路径
outjars 'build/outputs/cocolove2-banner-1.1.0.jar'
// 混淆协议
configuration 'proguard-rules.pro'
}
配置混淆协议
1.我们先把AS自带的协议配置进来
# This is a configuration file for ProGuard.
# http://proguard.sourceforge.net/index.html#manual/usage.html
#
# Starting with version 2.2 of the Android plugin for Gradle, these files are no longer used. Newer
# versions are distributed with the plugin and unpacked at build time. Files in this directory are
# no longer maintained.
#表示混淆时不使用大小写混合类名
-dontusemixedcaseclassnames
#表示不跳过library中的非public的类
-dontskipnonpubliclibraryclasses
#打印混淆的详细信息
-verbose
# Optimization is turned off by default. Dex does not like code run
# through the ProGuard optimize and preverify steps (and performs some
# of these optimizations on its own).
-dontoptimize
##表示不进行校验,这个校验作用 在java平台上的
-dontpreverify
# Note that if you want to enable optimization, you cannot just
# include optimization flags in your own project configuration file;
# instead you will need to point to the
# "proguard-android-optimize.txt" file instead of this one from your
# project.properties file.
-keepattributes *Annotation*
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
-keepclasseswithmembernames class * {
native <methods>;
}
# keep setters in Views so that animations can still work.
# see http://proguard.sourceforge.net/manual/examples.html#beans
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}
# We want to keep methods in Activity that could be used in the XML attribute onClick
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keepclassmembers class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator CREATOR;
}
-keepclassmembers class **.R$* {
public static <fields>;
}
# The support library contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version. We know about them, and they are safe.
-dontwarn android.support.**
# Understand the @Keep support annotation.
-keep class android.support.annotation.Keep
-keep @android.support.annotation.Keep class * {*;}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <methods>;
}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <fields>;
}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <init>(...);
}
2.AS自带的配置文档还是不够的,我们还需要加入如下配置
这里只展示基本操作,在实际开发中可能需要更多依赖,要根据具体情况引入自己需要的依赖包
#下面代码中的xx是指我个人的配置路径,涉及个人信息,这里以xx代替
#引入依赖包rt.jar(jdk路径)
-libraryjars /xxx/xx/xx/jdk1.8.0_77.jdk/Contents/Home/jre/lib/rt.jar
#引入依赖包android.jar(android SDK路径)
-libraryjars /xx/xx/xx/Android/sdk/platforms/android-24/android.jar
#如果用到Appcompat包,需要引入
-libraryjars /xxx/xxx/xx/xxx/MyApplication/library-banner/build/intermediates/exploded-aar/com.android.support/appcompat-v7/24.1.1/jars/classes.jar
-libraryjars /xx/xx/xx/xx/MyApplication/library-banner/build/intermediates/exploded-aar/com.android.support/support-v4/24.1.1/jars/classes.jar
#忽略警告
-ignorewarnings
#保证是独立的jar,没有任何项目引用,如果不写就会认为我们所有的代码是无用的,从而把所有的代码压缩掉,导出一个空的jar
-dontshrink
#保护泛型
-keepattributes Signature
在命令行执行命令混淆Jar,提示BUILD SUCCESFUL表示成功!
//mac
./gradlew makeJar
//windows
gradlew makeJar
不知道在哪里运行上面这两条命令?
1.你可以点底部任务栏的Terminal,输入gradle buildJar(图片来自其他博客,命令自行改正)
如果在Android studio中输入命令无效,但是已经安装了gradle,可能是未配置环境变量,见下面。
2.安装Gradle,Gradle的安装非常方便,下载ZIP包,解压到本地目录,设置 GRADLE_HOME 环境变量并将 GRADLE_HOME/bin 加到 PATH 环境变量中,安装就完成了。为什么、如何设置环境变量?
cmd下,切换到你的工程目录下,F:\StudioProjects\youApplication\,执行gradle buildJar命令
最后生成的jar在\StudioProjects\youApplication\app\libs文件夹下
第一次执行会从https://jcenter.bintray.com/下载很多文件
如果选择的是本地的gradle(use local gradle distribution),当你执行./gradlew makeJar时,系统会先下载gradle,会从https://jcenter.bintray.com/(项目中设置的远程库)下载很多文件 。
拓展:
Android Studio 使用 Gradle 打包 Jar
buildJar— 通用的Android studio打包jar Gradle插件
参考:
使用gradle打包指定包名和类的jar
AndroidStudio导出jar包
android studio 使用gradle 导出jar包,并打包assets目录
灵活强大的构建系统Gradle
gradle入门
这篇文章Android tips(八)–>Android Studio打包apk,aar,jar包,只是将自动生成的jar包重命名,
关注我的公众号,轻松了解和学习更多技术