一、提供SDK
SDK需要提供给游戏方进行接入,提供的方式可以有 jar包、aar、maven等几种方式。这里我是采用了jar包的形式提供SDK。但Android Studio 并不会自动生成 jar包,所以需要再编写一个gradle自动脚本生成 对应的jar包和资源。
1、生成SDK的 jar包
示例代码:
def buildJar() {
FileFilter fileFilter = new FileFilter() { //过滤器,把文件夹中的R文件剔除
@Override
boolean accept(File file) {
if('R.class'.equals(file.name) || file.name.startsWith('R$')) {
return false
} else {
return true
}
}
}
def classesDir = buildDir.absolutePath + File.separator + 'intermediates' + File.separator + 'classes' + File.separator + 'release' //sdk build生成的文件
def newClassesDir = project.ext.releaseDir + File.separator + 'classes' //临时文件夹
FileUtils.copyDirectory(new File(classesDir), new File(newClassesDir), fileFilter) //把sdk build下的classes复制到临时文件夹
def rawJar = project.ext.rawJar //设置jar的输出地址
ant {
jar(baseDir: newClassesDir, destFile: rawJar) //把文件夹压缩成jar
}
project.delete(newClassesDir) //把临时文件夹清除了
}
2、混淆 jar包
参考 手游SDK-混淆 中的 def proguard() 方法。
3、拷贝资源,生成SDK压缩包
示例代码:
def taskCopyToRelease = task('copyToRelease'){
doLast {
delete("build/outputs/aar/sdk-release-temp") //先清除上次构建遗留的temp
ant.unzip(src:"build/outputs/aar/sdk-release.aar",dest:"build/outputs/aar/sdk-release-temp") //解压aar文件
def mainSource = project.projectDir.absolutePath + File.separator +
'build' + File.separator + 'outputs' + File.separator + 'aar'+File.separator + 'sdk-release-temp' //设定复制主路径
//复制相应的资源
def manifest = mainSource + File.separator + 'AndroidManifest.xml'
def resDir = mainSource + File.separator + File.separator + 'res'
def assetsDir = mainSource + File.separator + File.separator + 'assets'
def libsDir = mainSource + File.separator + 'libs'
def output = project.ext.outputDir //输出路径
//把资源整理到临时文件夹
def srcDocName = "SDK客户端接入文档-Android.docx";
def srcDocPath = project.projectDir.absolutePath + File.separator + ".." + File.separator + srcDocName;
def dstDocPath = project.ext.releaseFinalSDKDir + File.separator + ".." + File.separator;
FileUtils.copyFileToDirectory(new File(manifest), new File(output))
FileUtils.copyFileToDirectory(new File(project.ext.proguardJar), new File(output + File.separator + 'libs'))
FileUtils.copyDirectory(new File(resDir), new File(output + File.separator + 'res'))
FileUtils.copyDirectory(new File(assetsDir), new File(output + File.separator + 'assets'))
FileUtils.copyDirectory(new File(libsDir), new File(output + File.separator + 'libs'))
//把资源拷贝到release
delete(project.ext.releaseFinalSDKDir)
delete(project.ext.releaseFinalDemoDir)
delete(dstDocPath)
FileUtils.copyDirectory(new File(output), new File(project.ext.releaseFinalSDKDir)) //拷贝资源到sdk资源文件夹
//生成Demo工程
FileUtils.copyDirectory(new File(project.ext.demoSrcDir), new File(project.ext.releaseFinalDemoDir))
delete(project.ext.releaseFinalDemoDir + File.separator + 'build')
FileUtils.copyDirectory(new File(output + File.separator + 'res'),
new File(project.ext.releaseFinalDemoDir + File.separator + 'src' + File.separator + 'main' + File.separator + 'res'))
FileUtils.copyDirectory(new File(output + File.separator + 'assets'),
new File(project.ext.releaseFinalDemoDir + File.separator + 'src' + File.separator + 'main' + File.separator + 'assets'))
FileUtils.copyDirectory(new File(output + File.separator + 'libs'),
new File(project.ext.releaseFinalDemoDir + File.separator + 'libs'))
// 拷贝接入文档
FileUtils.copyFileToDirectory(new File(srcDocPath), new File(dstDocPath))
// 处理release demo的build.gradle(因为工程Demo中没有buildscript)
def list = []
list.add('''
buildscript {
repositories {
maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
jcenter()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3\'
}
}
''')
def dst = project.ext.releaseFinalDemoDir + File.separator + 'build.gradle'
new File(dst).withReader('UTF-8') { reader ->
reader.eachLine {
if (!it.contains("compile project(':sdk')")) {
list.add(it + "\n")
}
}
}
new File(dst).withWriter('UTF-8') { writer ->
list.each {
writer.write(it)
}
}
}
}
确认X_SDK无bug之后,就可以调用gradle脚本生成压缩包了,gradle脚本可以直接在AS的Terminal标签中使用“gradlew 任务名”执行。最后把生成的压缩包提供给CP方接入即可。
上一篇: 手游SDK-混淆
下一篇:手游SDK-Maven私有仓库的搭建