概要
本快速入门包含了使用Samll开发的基础步骤,并通过启动插件显示一条简单的文本:
开始创建工程!
Step 1: 创建与配置工程
在本步骤你将:
- 创建工程
- 集成small
- 配置宿主
创建工程
打开Android Studio,点选 Start a new Android Studio project
创建一个Android工程。Application Name
本示例设置为MySmall
(您可以填写为自己的项目名称)。
设置最小支持 SDK (Small允许支持到 API 9):
添加一个 Empty Activity
,这个Activity将作为启动画面。
集成Small
在IDE左侧面板双击工程 build.gradle (Project,项目文件的build.gradle,不是APP文件下的build.gradle):
在 buildscript > dependencies
下添加Small编译插件 gradle-small:
classpath 'net.wequick.tools.build:gradle-small:1.1.0-alpha2'
在文件末尾引用 gradle-small 插件:
apply plugin: 'net.wequick.small'
紧随其后,设置Small运行库版本:
small {
aarVersion = '1.2.0-alpha6'
strictSplitResources = false//允许出现重复的包引用,不严格规定,如果不设置为false可能会出现包重复错误
}
由于我们更改了脚本,需要同步下工程:点击 Android Studio 顶部菜单栏的同步按钮 ,系统将开始下载上述插件库。
再在底部面板 Terminal 中输入以下命令来验证Small环境:
./gradlew small
Windows用户为
gradlew small
,Linux用户为gradle small
如果首次运行,这个过程可能伴随一些(墙外)编译环境的下载,请耐心等待
如果一切正常,将成功输出:
### Compile-time
```
gradle-small plugin : 1.1.0-beta4 (maven)
small aar : 1.1.0-alpha1 (maven)
gradle core : 2.14.1
android plugin : 2.2.3
OS : Mac OS X 10.12.1 (x86_64)
```
### Bundles
| type | name | PP | sdk | aapt | support | file | size |
|------|------|----|-----|--------|---------|------|------|
| host | app | | 25 | 25.0.2 | 25.1.0 | | |
不同版本的输出内容可能会有细微差异
配置宿主
由于加载插件需要对Application注入一些方法,我们对包名目录 app > java > com.example.mysmall
右键 New > Java Class
来新建一个Application,如SmallApp
:
添加构造方法来初始化Small:
public class SmallApp extends Application {
public SmallApp() {
Small.preSetUp(this);
}
}
由于ContentProvider在onCreate之前被调用,为支持在插件中使用该组件,我们需要提前到构造方法来对之进行懒加载。 如果不需要支持该组件,你也可以放到 onCreate 方法中。 这个方法在应用正常启动时只做一些简单的hook,不会影响性能;但在应用异常启动(后台被杀)时会同步加载插件以保证程序正常运行。
再在 AndroidManifest.xml
中指定这个 Application。
<application
android:name=".SmallApp"
...>
</application>
Step 2: 创建插件模块
右键 app
模块 > New > Module:
创建一个应用模块 Phone & Tablet Module
,设置 Application/Library name
为 App.main
,此时 Module name
自动为 app.main
,Package name
自动为com.example.appmain
:
Module name
以app.*
命名的模块将被 Small 在 编译时 识别为应用插件模块。Package name
以app*
结尾的插件将被 Small 在 运行时 识别为应用插件
为了确认我们确实启动了插件,我们修改插件的布局文件 app.main > res > layout > activity_main.xml
,将 TextView 的内容改为 Hello Small!
:
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
android:text="Hello Small!" />
Step 3: 编译插件
在 Terminal 面板,先编译公共库:
./gradlew buildLib -q
window系统命令:gradlew buildLib -q
宿主是最基础的一个公共库
再编译 app.main 插件:
./gradlew buildBundle -q -Dbundle.arch=x86
window系统命令:
gradlew buildBundle -q -Dbundle.arch=x86
如果不是允许在模拟器上的:
gradlew buildBundle -q
为了方便模拟器运行,本示例指定生成插件到 x86 架构下
查看编译情况:
./gradlew small
window命令:
gradlew small
应看到生成的 appmain.so
插件:
type | name | PP | sdk | aapt | support | file(x86) | size |
---|---|---|---|---|---|---|---|
host | app | 25 | 25.0.2 | 25.1.0 | |||
app | app.main | 0x77 | 25 | 25.0.2 | 25.1.0 | *_appmain.so | 5.3 KB |
Step 4: 启动插件
现在我们已经生成了插件并内置到宿主包中,要启动插件,我们需要配置一个路由来指向它。
右键 app 模块,New > Folder > Assets Folder
新建assets 目录:
再右键生成的 assets 目录,New > File
新建路由配置文件bundle.json
:
修改 bundle.json
添加路由:
{
"version": "1.0.0",
"bundles": [
{
"uri": "main",
"pkg": "com.example.appmain"
}
]
}
这里的:
- version,是
bundle.json
文件格式版本,目前始终为1.0.0
- bundles,插件数组
- uri,插件唯一ID
- pkg,插件包名
回到宿主的 app > java > com.example.mysmall > MainActivity,在 onStart 方法中我们通过上述配置的uri 来启动app.main 插件:
@Override
protected void onStart() {
super.onStart();
Small.setUp(this, new Small.OnCompleteListener() {
@Override
public void onComplete() {
Small.openUri("main", MainActivity.this);
}
});
}
Step 5: 运行宿主
在顶部菜单栏,我们先选择宿主模块 app
,再点击旁边的运行按钮:
成功运行后,将启动插件模块:
总结与下一步
完整的 build.gradle 为:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
classpath 'net.wequick.tools.build:gradle-small:1.2.0-alpha6'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
apply plugin: 'net.wequick.small'
small {
aarVersion = '1.2.0-alpha6'
strictSplitResources = false
}
通过本节我们掌握了使用Small开发的基础:
- 通过 build.gradle 集成 Small
- 通过 自定义Application 初始化 Small
- 通过 buildLib,buildBundle 编译 Small 插件
- 通过 bundle.json 配置插件路由
- 通过 Small.openUri 启动插件