AS编写sdk并打成jar包供其它APP调用

如果sdk中涉及res下面的资源注意package路径。

1. 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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

然后在终端执行 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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

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

===============几个错误============



这个是因为依赖包重复了 (像v4和nineoldandroids),如图。app中实现了对easeUI的依赖,但是app和easeUI都添加了对这个包的依赖。所以就报这个错误,修改之后再报,就clean,rebuild一下



Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'F:\Program Files (x86)\Java\jdk1.8.0_31\bin\java.exe'' finished withnon-zero exit value 2


这个错误在app的build.gradle里面添加下面这句就好了。

 
   
android {
   
    defaultConfig {
        ...
        multiDexEnabled true
    }

}


Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'F:\Program Files (x86)\Java\jdk1.8.0_31\bin\java.exe'' finished withnon-zero exit value 3


这个错误就在app.bulid里面加上这句,再rebuild ,之后再运行就行了。4g可以看电脑配置修改(2g,3g,6g,8g)。

dexOptions {
    javaMaxHeapSize "4g"
}
如图:

http://blog.csdn.net/edisonchang/article/details/51296265

http://blog.csdn.net/qq_26296197/article/details/52157272

你可能感兴趣的:(Android学习&开发)