美文网首页
Unity安卓项目jar包的处理

Unity安卓项目jar包的处理

作者: 三十五岁是码农 | 来源:发表于2019-10-17 15:32 被阅读0次

    一.把多个class(.java文件)打成一个jar供项目使用

    在classes目录下面新建文件MANIFEST.MF,内容为:

    Manifest-Version: 1.0
    Created-By: 1.7.0_67 (Sun Microsystems Inc.)
    Main-Class: com.mqtt.AlibabaMQTT
    

    Manifest-Version 可以直接写1.0 ,Created-By写jdk版本即可,Main-Class 指定一个类,MANIFEST.MF里面有4行,最后一行为空行
    使用dos cd 进入classes目录
    执行:jar -cfm yhbc-alibbmqtt.jar MANIFEST.MF ./yhbc/aliyun/lmq/.class ./yhbc/aliyun/lmq/util/.class

    解释:yhbc-alibbmqtt.jar为最后打成的jar名称
    MANIFEST.MF为新建的文件
    ./yhbc/aliyun/lmq/.class ./yhbc/aliyun/lmq/util/.class 为打包的class文件列表 ,空格隔开

    有过和第三方开发者或者其他部门合作的经历,提供一个jar包sdk是一件很平常的事。Eclipse 有图形界面和向导供开发者将一个项目导出为jar包,相对来讲是比较简单的,切换到Android Studio后,则需要结合gradle来配置生成jar 包。
    gradle在构建的时候,会对各个module的class文件打包成classes.jar,并存放在build/bundles/release(或者debug) 目录下,所以其实我们可以直接将classes.jar拷贝出来,并重命名。这算是取巧,也是最便捷的方式,当然这类方法也可以用gradle 脚本来实现,

    task makeJar(type: Copy) {
        from('build/intermediates/bundles/release/')
        into('build/libs/')
        include('classes.jar')
        rename ('classes.jar', 'sdk.jar')
    }
    

    makeJar.dependsOn(build)
    然后在终端执行 gradlew makeJar 命令,就可以在bulid/libs 目录下生成对应的jar包。但这种打包方式经常会把一些冗余的文件一块打进jar ,不仅影响jar包的体积,还会经常导致com.android.dex.DexException: Multiple dex files define 此类的错误 。
    这类的问题,我们在用到第三方提供的sdk 时,也会经常碰到,比如集成微博sdk时的这类 weibo sdk Multiple dex files define Lcom/sina/weibo/sdk/BuildConfig 问题
    原因是sdk 的jar包中打入了BuildConfig.class,解决方法很简单:解包,删除里面的 BuildConfig.class,然后重新打包 jar。

    具体如下:

    1. 解压jar包:
      jar xf xxx.jar
    2. 删除解压后目录里面的//BuildConfig.class
    3. 重新打包:
      jar cvf xxx.jar *

    当然我们不希望自己提供的jar 也给其他开发者带来同样的困扰,所以我们期待可以有选择性的选择需要打包的class,排除不需要的class ,如BuildConfig.class、R.class 等

    task makeJar(type: Jar) {
        from file('build/intermediates/classes/release')
        archiveName = 'sdk.jar'
        destinationDir = file('build/libs')
        //过滤不需要的class
        exclude "**/**/BuildConfig.class"
        exclude "**/**/BuildConfig\$*.class"
        exclude "**/R.class"
        exclude "**/R\$*.class"
        //指定打包的class
        include "com/test/**/*.class"
    }
    makeJar.dependsOn(build)
    

    通过上述脚本就可以实现选择性的打包,关于打包时的混淆配置等,感兴趣的朋友可以参考:
    http://my.oschina.net/u/2531612/blog/591366?fromerr=Xd1Kd7dY

    到这里就介绍完了,欢迎大家指正。
    ————————————————
    版权声明:本文为CSDN博主「EdisonChang」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/EdisonChang/article/details/51296265

    相关文章

      网友评论

          本文标题:Unity安卓项目jar包的处理

          本文链接:https://www.haomeiwen.com/subject/twsmmctx.html