development_android.md 5.6 KB
Newer Older
R
Ruilong Liu 已提交
1
# Android开发文档
2

L
liuruilong 已提交
3
用户可通过如下两种方式进行编译:
W
wangliu 已提交
4

R
Ray Liu 已提交
5
- 基于macOS 、Linux交叉编译
W
wangliu 已提交
6 7
- 基于Docker容器编译

R
Ray Liu 已提交
8
## 基于macOS 、Linux交叉编译
L
liuruilong 已提交
9 10 11 12

需要: NDK17及以上、cmake 3.0及以上

### 执行编译
13

L
liuruilong 已提交
14 15
在paddle-mobile根目录中,执行以下命令:

16
```shell
L
liuruilong 已提交
17 18 19 20

cd tools
sh build.sh android

R
Ray Liu 已提交
21
# 如果想编译只支持某些特定网络的库 (可以控制包体积, 编译出来的库就只包含了支持这些特定模型的算子), 可以使用
L
liuruilong 已提交
22 23 24

sh build.sh android  mobilenet googlenet

L
liuruilong 已提交
25
# 当然这些网络是需要在 cmakelist  中配置的(https://github.com/PaddlePaddle/paddle-mobile/blob/73769e7d05ef4820a115ad3fb9b1ca3f55179d03/CMakeLists.txt#L216), 目前配置了几个常见模型
L
liuruilong 已提交
26 27 28

```

29
执行完毕后,生成的`so`位于`build/release/`目录中:  
L
liuruilong 已提交
30

31 32
- jni 头文件位于 [https://github.com/PaddlePaddle/paddle-mobile/tree/develop/src/io/jni](https://github.com/PaddlePaddle/paddle-mobile/tree/develop/src/io/jni)  
- c++ 头文件位于 [https://github.com/PaddlePaddle/paddle-mobile/blob/develop/src/io/paddle_inference_api.h](https://github.com/PaddlePaddle/paddle-mobile/blob/develop/src/io/paddle_inference_api.h)   
L
liuruilong 已提交
33

34
单测可执行文件位于`test/build`目录中。
L
liuruilong 已提交
35 36 37 38 39 40 41

如果有环境问题, 可以看接下来的环节

### 环境配置

##### 下载Android NDK

42
如果你的电脑安装了Android Studio, 可以在 Android Studio 中直接下载安装`NDK`或者可以在 [https://developer.android.com/ndk/](https://developer.android.com/ndk/) 这里自行下载,也可以通过以下命令获取:
L
liuruilong 已提交
43 44

- Mac平台
45 46

```shell
L
liuruilong 已提交
47 48 49
wget https://dl.google.com/android/repository/android-ndk-r17b-darwin-x86_64.zip
unzip android-ndk-r17b-darwin-x86_64.zip
```
50

L
liuruilong 已提交
51
- Linux平台
52 53

```shell
L
liuruilong 已提交
54 55 56 57 58
wget https://dl.google.com/android/repository/android-ndk-r17b-linux-x86_64.zip
unzip android-ndk-r17b-linux-x86_64.zip
```

##### 设置环境变量
59
工程中自带的独立工具链会根据环境变量`NDK_ROOT`查找NDK,因此需要配置环境变量:
L
liuruilong 已提交
60

61
```shell
L
liuruilong 已提交
62 63 64 65 66 67 68
export NDK_ROOT = "path to ndk"
```

##### 安装 CMake

- Mac平台

69
mac 平台下可以使用`homebrew`安装
L
liuruilong 已提交
70

71
```shell
L
liuruilong 已提交
72 73
brew install cmake
```
74

L
liuruilong 已提交
75 76
- Linux平台

77 78 79
linux 下可以使用`apt-get`进行安装

```shell
L
liuruilong 已提交
80 81 82 83 84 85 86 87
apt-get install cmake

```

##### Tips:
如果想要获得体积更小的库,可选择编译支持指定模型结构的库。
如执行如下命令:

88
```shell
L
liuruilong 已提交
89 90
sh build.sh android googlenet
```
91

L
liuruilong 已提交
92
会得到一个支持googlnet的体积更小的库。
W
wangliu 已提交
93 94

## 基于Docker容器编译
95

W
wangliu 已提交
96
### 1. 安装 docker
97

W
wangliu 已提交
98
安装 docker 的方式,参考官方文档 [https://docs.docker.com/install/](https://docs.docker.com/install/)
99

W
wangliu 已提交
100
### 2. 使用 docker 搭建构建环境
101

W
wangliu 已提交
102 103 104
首先进入 paddle-mobile 的目录下,执行 `docker build`
以 Linux/Mac 为例 (windows 建议在 'Docker Quickstart Terminal' 中执行)

105
```shell
W
wangliu 已提交
106 107 108 109
$ docker build -t paddle-mobile:dev - < Dockerfile
```
使用 `docker images` 可以看到我们新建的 image

110
```shell
W
wangliu 已提交
111 112 113 114 115 116 117
$ docker images
REPOSITORY      TAG     IMAGE ID       CREATED         SIZE
paddle-mobile   dev     33b146787711   45 hours ago    372MB
```
### 3. 使用 docker 构建
进入 paddle-mobile 目录,执行 docker run

118
```shell
W
wangliu 已提交
119 120 121 122 123 124 125 126 127 128
$ docker run -it --mount type=bind,source=$PWD,target=/paddle-mobile paddle-mobile:dev
root@5affd29d4fc5:/ # cd /paddle-mobile
# 生成构建 android 产出的 Makefile
root@5affd29d4fc5:/ # rm CMakeCache.txt
root@5affd29d4fc5:/ # cmake -DCMAKE_TOOLCHAIN_FILE=tools/toolchains/arm-android-neon.cmake
# 生成构建 linux 产出的 Makefile
root@5affd29d4fc5:/ # rm CMakeCache.txt
root@5affd29d4fc5:/ # cmake -DCMAKE_TOOLCHAIN_FILE=tools/toolchains/arm-linux-gnueabi.cmake
```
### 4. 设置编译选项
129

W
wangliu 已提交
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
可以通过 ccmake 设置编译选项

```
root@5affd29d4fc5:/ # ccmake .
                                                     Page 1 of 1
 CMAKE_ASM_FLAGS
 CMAKE_ASM_FLAGS_DEBUG
 CMAKE_ASM_FLAGS_RELEASE
 CMAKE_BUILD_TYPE
 CMAKE_INSTALL_PREFIX             /usr/local
 CMAKE_TOOLCHAIN_FILE             /paddle-mobile/tools/toolchains/arm-android-neon.cmake
 CPU                              ON
 DEBUGING                         ON
 FPGA                             OFF
 LOG_PROFILE                      ON
 MALI_GPU                         OFF
 NET                              googlenet
 USE_EXCEPTION                    ON
 USE_OPENMP                       OFF
```
修改选项后,按 `c`, `g` 更新 Makefile
### 5. 构建
使用 make 命令进行构建

```
root@5affd29d4fc5:/ # make
```
### 6. 查看构建产出
158 159

构架产出可以在 host 机器上查看,在 paddle-mobile 的目录下,build 以及`test/build`下,可以使用`adb`指令或`scp`传输到`device`上执行
W
wangliu 已提交
160

R
Ray Liu 已提交
161
## 测试
162

R
Ray Liu 已提交
163 164
在编译完成后,我们提供了自动化的测试脚本,帮助用户将运行单测文件所需要的模型及库文件push到Android设备

165
执行下面的脚本,该脚本会下载测试需要的 [mobilenet和test_image_1x3x224x224_float(预处理过的 NCHW 文件) 文件](http://mms-graph.bj.bcebos.com/paddle-mobile/opencl_test_src.zip),在项目下的`test`目录创建模型和图片文件夹,并将`mobilenet`复制到`paddle-mobile/test/models`目录下,将`test_image_1x3x224x224_float`复制到`paddle-mobile/test/images`目录下
R
Ray Liu 已提交
166 167


168 169 170
```shell
cd tools
sh ./prepare_images_and_models.sh
R
Ray Liu 已提交
171 172 173
```

* 执行下面命令将可执行文件和预测需要的文件部署到手机
174

175
```shell
W
wangliu 已提交
176
cd tools/android-debug-script
R
Ray Liu 已提交
177
sh push2android.sh
W
wangliu 已提交
178
```
R
Ray Liu 已提交
179 180

* mobilenet cpu模型预测结果
R
Ray Liu 已提交
181

182
假设mobilenet和`test_image_1x3x224x224_float`文件已经推送到手机上,执行下面命令进行mobilenet cpu的预测
183

184
```shell
R
Ray Liu 已提交
185 186 187 188
adb shell
cd /data/local/tmp/bin/
export LD_LIBRARY_PATH=.
./test-mobilenet
W
wangliu 已提交
189
```
R
Ray Liu 已提交
190