sdk

SDK 对外打包

暴露接口,隐藏细节

Posted by hurshi on 2020.02.27

暴露 API 工程

  • 单独抽取一个 api 模块,用来放给用户使用的接口文件,以及数据 Bean。

  • 保留方法参数命名,方便使用者查看(要不然使用者在调用接口的时候,看到的参数都是 var1,var2 这样不可读的)。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    
    android {
        buildTypes {
            release {
                minifyEnabled false
                zipAlignEnabled false
            }
        }
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }
    }
      
    // java
    tasks.withType(JavaCompile) {
        configure(options) {
            options.compilerArgs << '-parameters'
        }
    }
    // kotlin
    tasks.withType(KotlinCompile).configureEach {
        kotlinOptions {
            javaParameters = true
        }
    }
    

隐藏实现工程

为隐藏细节,实现工程理应全部混淆。

若直接混淆成 a.a.a.a.class,如果这时再来一个模块,也混淆成了 a.a.a.a.class,如果用户同时使用这2个模块,就会出现类文件冲突。解决:

1
-repackageclasses com.github.hurshi.command

添加如上代码到 proguard-rules.pro中,它会把所有的混淆文件推平放到 com.github.hurshi.command目录下,对开发无感,对使用者也无感。

简化发布工程

开发一个SDK,可能会添加多个 module,也可能会添加多个依赖。如何给用户 一行代码就搞定 的畅快感呢

使用 pom 合并多个模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<project
    xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.github.hurshi</groupId>
    <artifactId>sdk</artifactId>
    <version>1.0.0</version>
    <packaging>aar</packaging>
    <dependencies>
        <dependency>
            <groupId>com.github.hurshi</groupId>
            <artifactId>sdk-api</artifactId>
            <version>1.0.0</version>
        </dependency>
    </dependencies>
</project>
  1. 如上面例子所示,把“模块 sdk-api”添加到”模块sdk”的 maven pom 文件中。

  2. 在用户 implementation com.github.hurshi:sdk:1.0.0的时候,gradle 会在后台自动下载并依赖 sdk-api仓库,实现sdk-api对用户无感。