Android studio 打jar包带资源ID名称,可作为SDK用途

以前没给别人提供过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),谢谢支持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值