mobile_readme.md 4.0 KB
Newer Older
1

2
# Paddle-lite-mobile开发指南
3

4
## 交叉编译
5

6
Paddle-lite-mobile 推荐在我们的Docker环境下交叉编译,减少环境配置上的不必要问题。
7 8 9 10

### 1. 拉取代码创建容器

```shell
11
$ git clone https://github.com/PaddlePaddle/Paddle.git
12 13 14
$ git checkout incubate/lite
```

15 16
编译docker环境:
`docker build --file paddle/fluid/lite/tools/Dockerfile.mobile --tag paddle-lite-mobile:latest . `
17

18 19 20 21
### 主要cmake选项
                
- `ARM_TARGET_OS` 代表目标操作系统, 目前支持 "android" "armlinux", 模型是Android
- `ARM_TARGET_ARCH_ABI` 代表ARCH, 目前支持 "arm64-v8a" "armeabi-v7a"。 模型是arm64-v8a
22

23
### 编译
24

25
基于`paddle-lite-mobile`镜像创建容器,并在容器内外建立目录映射关系:
26 27

```shell
28
$ docker run -it --name <yourname> --net=host --privileged -v <your-directory-path>:<your-directory-path> paddle-lite-mobile bash
29 30
```

31
参考build.sh下的 cmake arm编译需要的平台。
32

33
参考示例:
34 35

```shell
36
#!/bin/bash
37
cmake .. \
38 39 40 41 42 43 44 45 46
    -DWITH_GPU=OFF \
    -DWITH_LITE=ON \
    -DLITE_WITH_CUDA=OFF \
    -DLITE_WITH_X86=OFF \
    -DLITE_WITH_ARM=ON \
    -DLITE_WITH_LIGHT_WEIGHT_FRAMEWORK=ON \
    -DWITH_TESTING=ON \
    -DWITH_MKL=OFF \
    -DARM_TARGET_OS="android" -DARM_TARGET_ARCH_ABI="arm64-v8a"
47 48 49 50 51

# fc层单测
make test_fc_compute_arm -j

```
52
### 在Android上执行
53

54 55 56 57
#### 1. 创建模拟器(如果使用真机则跳过此步骤)

```shell
# 创建Android avd (armv8)
T
tensor-tang 已提交
58
$ echo n | avdmanager create avd -f -n paddle-armv8 -k "system-images;android-24;google_apis;arm64-v8a"
59
# 启动Android armv8 emulator
T
tensor-tang 已提交
60
$ ${ANDROID_HOME}/emulator/emulator -avd paddle-armv8 -noaudio -no-window -gpu off -verbose &
61

T
tensor-tang 已提交
62 63 64 65 66 67
# 如果需要执行armv7版本,如下:
# $ echo n | avdmanager create avd -f -n paddle-armv7 -k "system-images;android-24;google_apis;armeabi-v7a"
# $ ${ANDROID_HOME}/emulator/emulator -avd paddle-armv7 -noaudio -no-window -gpu off -verbose &

# 退出所有模拟器
adb devices | grep emulator | cut -f1 | while read line; do adb -s $line emu kill; done
68
```
T
tensor-tang 已提交
69

70
#### 2. 上传编译文件到手机上
71 72 73 74

键盘上`crtl+q+p`同时摁下,切换到容器外(容器还在后台运行),将刚刚编译出的程序`adb push`到手机上。USB线连接手机,确保`adb devices`可以找到手机设备。
```shell
$ cd <paddle-repo>
75
$ adb push ./build/paddle/fluid/lite/kernels/arm/test_fc_compute_arm /data/local/tmp/
76 77 78 79 80 81

# 进入手机
$ adb shell # 若多台手机设备先用命令adb devices查看目标手机的序列码
$ cd /data/local/tmp

# 执行编译的程序
82
$ ./test_fc_compute_arm
83 84
```

85
### 在ARM LINUX下执行
86

87 88 89 90 91 92 93 94 95 96 97 98 99
拉取Linux arm64镜像
```shell
$ docker pull multiarch/ubuntu-core:arm64-bionic
```
运行容器并在内外建立目录映射关系
```shell
$ docker run -it --name <yourname> -v <your-directory-path>:<your-directory-path> multiarch/ubuntu-core:arm64-bionic
```
进入bin目录,并运行并文件
```shell
$ cd <bin-dir>
$ ./test_fc_compute_arm
```
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126

# Q&A

#### 1. adb命令找不到:adb: command not found  
解决:`sudo apt install -y adb`   

#### 2. 明明手机USB连接电脑却显示找不到设备:`error: device not found`  
解决:
第一步`lsusb`命令查看插上拔下手机前后usb设备的变化情况,确定手机设备的ID。  假设`lsusb`命令执行显示`Bus 003 Device 011: ID 2717:9039  `,则ID是`0x2717`
第二步:创建`adb_usb.ini`文件并追加写入ID:`echo 0x2717 >> ~/.android/adb_usb.ini`
第三步:给手机添加权限`sudo vim /etc/udev/rules.d/70-android.rules`,根据第一步骤取得的`ATTRS{idVendor}``ATTRS{idProduct}`这两个属性值,在该文件加入该设备信息:
 `SUBSYSTEM=="usb", ATTRS{idVendor}=="2717", ATTRS{idProduct}=="9039",MODE="0666"`
第四步:重启USB服务:
```shell
$ sudo chmod a+rx /etc/udev/rules.d/70-android.rules
$ sudo service udev restart
```
第五步:重启adb服务,adb devices有设备说明adb安装成功。  
```shell
$ adb kill-server
$ sudo adb start-server
$ adb devices

# 若显示连接的手机设备,则表示成功
List of devices attached
5cb00b6 device
```