Skip to content

Commit 9326af1

Browse files
committed
compile and test for android ndk
1 parent 132e8b2 commit 9326af1

File tree

6 files changed

+497
-0
lines changed

6 files changed

+497
-0
lines changed
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
name: Publish android images
2+
on:
3+
workflow_dispatch:
4+
inputs:
5+
build_image:
6+
description: 'select to build image'
7+
required: true
8+
type: boolean
9+
10+
jobs:
11+
build_android_develop_image:
12+
runs-on: ubuntu-22.04
13+
if: ${{ inputs.build_image }}
14+
steps:
15+
- name: Checkout
16+
uses: actions/checkout@main
17+
- name: Login to DockerHub
18+
uses: docker/login-action@master
19+
with:
20+
username: ${{ secrets.DOCKERHUB_USERNAME }}
21+
password: ${{ secrets.DOCKERHUB_TOKEN }}
22+
- name: Download for dev package
23+
run: |
24+
sed -i '3s/OS_NAME=.*/OS_NAME=android/' docker/prepare_for_dev.sh
25+
sed -i '/ls -lh release/d' docker/prepare_for_dev.sh
26+
./docker/prepare_for_dev.sh
27+
shell: bash
28+
- name: Build and Push
29+
uses: docker/build-push-action@master
30+
with:
31+
push: true
32+
context: .
33+
file: docker/Dockerfile.android.develop.ubuntu
34+
tags: |
35+
modelbox/modelbox-develop-android-ubuntu:latest
36+
37+
build_android_unittest:
38+
runs-on: ubuntu-22.04
39+
if: ${{ always() }}
40+
needs: build_android_develop_image
41+
steps:
42+
- name: Checkout
43+
uses: actions/checkout@main
44+
- name: Compile
45+
run: |
46+
containerid=$(docker run -dit --rm --privileged \
47+
-v $(pwd):/data/devel/modelbox \
48+
modelbox/modelbox-develop-android-ubuntu:latest /bin/bash | cut -c1-5)
49+
docker exec ${containerid} /bin/bash -c 'bash -x /data/devel/modelbox/build_for_android.sh x64'
50+
shell: bash
51+
- name: BuildUnit
52+
run: |
53+
containerid=$(docker run -dit --rm --privileged \
54+
-v $(pwd):/data/devel/modelbox \
55+
modelbox/modelbox-develop-android-ubuntu:latest /bin/bash | cut -c1-5)
56+
docker exec ${containerid} /bin/bash -c 'bash -x /data/devel/modelbox/build_for_android.sh buildtest'
57+
shell: bash
58+
- name: UnitTest
59+
run: |
60+
containerid=$(docker run -dit --rm --privileged \
61+
-v $(pwd):/data/devel/modelbox \
62+
modelbox/modelbox-develop-android-ubuntu:latest /bin/bash | cut -c1-5)
63+
docker exec ${containerid} /bin/bash -c 'bash -x /data/devel/modelbox/build_for_android.sh unittest'
64+
shell: bash
65+
- name: Upload Artifact
66+
uses: actions/upload-artifact@main
67+
with:
68+
name: modelbox_android_unittest
69+
path: unittest.tar.gz
70+
71+
package_android_ubuntu:
72+
runs-on: ubuntu-22.04
73+
if: ${{ always() }}
74+
needs: build_android_develop_image
75+
steps:
76+
- name: Checkout
77+
uses: actions/checkout@main
78+
- name: Package
79+
run: |
80+
containerid=$(docker run -dit --rm --privileged \
81+
-v $(pwd):/data/devel/modelbox \
82+
modelbox/modelbox-develop-android-ubuntu:latest /bin/bash|cut -c1-5)
83+
docker exec ${containerid} /bin/bash -c 'bash -x /data/devel/modelbox/build_for_android.sh'
84+
shell: bash
85+
- name: Upload Artifact
86+
uses: actions/upload-artifact@main
87+
with:
88+
name: modelbox_aar
89+
path: aar_pkg/modelbox.aar

build_for_android.sh

Lines changed: 221 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,221 @@
1+
#!/bin/bash
2+
CODE_DIR=$(cd $(dirname "${BASH_SOURCE[0]}");pwd)
3+
export NDK_ROOT=/data/ndk/android-ndk-r25b
4+
export USER_ROOT=/data/devel/thirdparty/deb
5+
export LIBRARY_RUNPATH=/data/user/0/com.mbox_ai/files/lib
6+
export MINDSPORE_LITE_PATH=/data/mindspore/mindspore-lite-1.9.0
7+
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
8+
export JRE_HOME=${JAVA_HOME}/jre
9+
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
10+
export PATH=${JAVA_HOME}/bin:$PATH
11+
12+
compile() {
13+
rm -f /data/data /data/mindspore/mindspore-lite-1.9.0
14+
if [ "$1" == "a64" ];then
15+
export BUILD_DIR=build_a64
16+
export ANDROID_ABI=arm64-v8a
17+
export ARCH=aarch64
18+
ln -s mindspore-lite-1.9.0-android-aarch64 /data/mindspore/mindspore-lite-1.9.0
19+
elif [ "$1" == "x64" ];then
20+
export BUILD_DIR=build_x64
21+
export ANDROID_ABI=x86_64
22+
export ARCH=x86_64
23+
ln -s mindspore-lite-1.9.0-linux-x64 /data/mindspore/mindspore-lite-1.9.0
24+
fi
25+
ln -s /data/devel/thirdparty/deb/${ANDROID_ABI}/data/data /data/data
26+
27+
ls -lh /data/data
28+
ls -lh /data/mindspore/mindspore-lite-1.9.0
29+
30+
if [ -d ${CODE_DIR}/${BUILD_DIR} ];then
31+
rm -rf ${CODE_DIR}/${BUILD_DIR}/*
32+
else
33+
mkdir -p ${CODE_DIR}/${BUILD_DIR}
34+
fi
35+
36+
cd ${CODE_DIR}/${BUILD_DIR}
37+
cmake .. \
38+
-DCMAKE_TOOLCHAIN_FILE=${NDK_ROOT}/build/cmake/android.toolchain.cmake \
39+
-DCMAKE_BUILD_TYPE=Release \
40+
-DCMAKE_ANDROID_API=28 \
41+
-DLOCAL_PACKAGE_PATH=/data/devel/thirdparty/src \
42+
-DCLANG_TIDY=OFF \
43+
-DCLANG_TIDY_AS_ERROR=OFF \
44+
-DWITH_MINDSPORE=on \
45+
-DWITH_JAVA=ON \
46+
-DTEST_WORKING_DIR=/data/user/test \
47+
-DPYTHON_VERSION_ANDROID=3.10 \
48+
-DANDROID_ABI=${ANDROID_ABI} \
49+
-DANDROID_PLATFORM=android-28 \
50+
-DANDROID_NDK=${NDK_ROOT} \
51+
-DANDROID_TOOLCHAIN=clang \
52+
-DANDROID_STL=c++_shared \
53+
-DANDROID_ALLOW_UNDEFINED_SYMBOLS=TRUE \
54+
-DBUILD_SHARED_LIBS=1 \
55+
-Wno-deprecated \
56+
-Wno-dev
57+
58+
if [ $? -ne 0 ];then
59+
echo "cmake failed"
60+
cat CMakeFiles/CMakeError.log
61+
exit 1
62+
fi
63+
64+
make package -j8
65+
}
66+
67+
prepare(){
68+
cd ${CODE_DIR}/${BUILD_DIR}
69+
mkdir -p ${ANDROID_ABI}/jni/${ANDROID_ABI}
70+
mkdir -p ${ANDROID_ABI}/{libmodelbox-kernel,libmodelbox-drivers,assets}
71+
72+
cp cpack/_CPack_Packages/Android/TGZ/modelbox-1.0.0-Android/usr/java/packages/lib/libmodelbox-jni.so ${ANDROID_ABI}/jni/${ANDROID_ABI}/
73+
74+
ls -lh cpack/_CPack_Packages/Android/TGZ/modelbox-1.0.0-Android/usr/local/lib/
75+
76+
cp /data/devel/thirdparty/deb/${ANDROID_ABI}/usr/lib/{libssl.so.1.1,libcrypto.so.1.1} ${ANDROID_ABI}/libmodelbox-kernel/
77+
cp cpack/_CPack_Packages/Android/TGZ/modelbox-1.0.0-Android/usr/local/lib/{libmodelbox.so,libsecurec.so} ${ANDROID_ABI}/libmodelbox-kernel/
78+
cp /data/ndk/android-ndk-r25b/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/${ARCH}-linux-android/libc++_shared.so ${ANDROID_ABI}/libmodelbox-kernel/
79+
80+
cp /data/mindspore/mindspore-lite-1.9.0/runtime/lib/libmindspore-lite.so ${ANDROID_ABI}/libmodelbox-drivers/
81+
cp /data/devel/thirdparty/deb/${ANDROID_ABI}/usr/lib/{libpython3.10.so.1.0,libcgraph.so,libcdt.so,libz.so} ${ANDROID_ABI}/libmodelbox-drivers/
82+
cp /data/devel/thirdparty/deb/${ANDROID_ABI}/usr/lib/{libandroid-support.so,libjpeg.so,liblzma.so,libopenblas.so,libopenjp2.so,libpng16.so,libprotobuf.so,libtiff.so,libwebp.so,libzstd.so,libopencv*.so} ${ANDROID_ABI}/libmodelbox-drivers/
83+
cp cpack/_CPack_Packages/Android/TGZ/modelbox-1.0.0-Android/usr/local/lib/{libmbox-engine-mindspore-lite.so,libmodelbox-device-cpu.so,libmodelbox-graphconf-graphviz.so,libmodelbox-unit-cpu-mindspore-lite-inference.so,libmodelbox-unit-cpu-python.so,libmodelbox-virtualdriver-inference.so,libmodelbox-virtualdriver-python.so} ${ANDROID_ABI}/libmodelbox-drivers/
84+
85+
cd ${ANDROID_ABI}/libmodelbox-drivers
86+
find . -name "lib*" | xargs patchelf --set-rpath /data/user/0/com.mbox_ai/files/lib
87+
zip -r ../assets/libmodelbox-drivers_${ANDROID_ABI}.zip ./
88+
md5sum ../assets/libmodelbox-drivers_${ANDROID_ABI}.zip > ../assets/libmodelbox-drivers_${ANDROID_ABI}.zip.md5
89+
90+
cd ../libmodelbox-kernel
91+
patchelf --set-rpath /data/user/0/com.mbox_ai/files/lib libssl.so.1.1
92+
zip -r ../assets/libmodelbox-kernel_${ANDROID_ABI}.zip ./
93+
md5sum ../assets/libmodelbox-kernel_${ANDROID_ABI}.zip > ../assets/libmodelbox-kernel_${ANDROID_ABI}.zip.md5
94+
95+
cd ..
96+
cp -r /data/devel/thirdparty/deb/${ANDROID_ABI}/usr/lib/python3.10 .
97+
cp -r python3.10/site-packages/numpy-1.23.3-py3.10-linux-${ARCH}.egg/numpy python3.10/site-packages/
98+
rm -rf python3.10/site-packages/numpy-1.23.3-py3.10-linux-${ARCH}.egg
99+
cp -r /data/devel/thirdparty/deb/${ANDROID_ABI}/data/data/com.termux/files/usr/lib/python3.10/site-packages/cv2 python3.10/site-packages/
100+
101+
cd python3.10
102+
find . -name "*.so" | xargs patchelf --set-rpath /data/user/0/com.mbox_ai/files/lib
103+
104+
cd ..
105+
zip -r assets/python3.10_${ANDROID_ABI}.zip python3.10
106+
md5sum assets/python3.10_${ANDROID_ABI}.zip > assets/python3.10_${ANDROID_ABI}.zip.md5
107+
108+
rm -rf libmodelbox-drivers libmodelbox-kernel python3.10
109+
110+
ls -lh ${CODE_DIR}/${BUILD_DIR}/${ANDROID_ABI}/*
111+
}
112+
113+
package(){
114+
mkdir ${CODE_DIR}/aar_pkg
115+
cat << 'EOF'>${CODE_DIR}/aar_pkg/AndroidManifest.xml
116+
<?xml version="1.0" encoding="utf-8"?>
117+
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
118+
package="com.modelbox"
119+
android:versionCode="1">
120+
121+
<uses-sdk
122+
android:minSdkVersion="28"
123+
android:targetSdkVersion="30"/>
124+
125+
</manifest>
126+
EOF
127+
128+
cp ${CODE_DIR}/build_a64/src/java/modelbox-1.0.0.jar ${CODE_DIR}/aar_pkg/classes.jar
129+
cp -af ${CODE_DIR}/build_x64/x86_64/* ${CODE_DIR}/aar_pkg/
130+
cp -af ${CODE_DIR}/build_a64/arm64-v8a/* ${CODE_DIR}/aar_pkg/
131+
chown -R root.root ${CODE_DIR}/aar_pkg
132+
find ${CODE_DIR}/aar_pkg -type d|xargs chmod -R 755
133+
find ${CODE_DIR}/aar_pkg -type f|xargs chmod -R 644
134+
cd ${CODE_DIR}/aar_pkg
135+
jar -cvf modelbox.aar -C ${CODE_DIR}/aar_pkg .
136+
}
137+
138+
buildtest(){
139+
cd ${CODE_DIR}/build_x64
140+
make unit -j8
141+
mkdir -p /data/user/test/{dep,drivers}
142+
cp lib/{libgmock.so,libgtest.so} /data/user/test/dep/
143+
cp cpack/_CPack_Packages/Android/TGZ/modelbox-1.0.0-Android/usr/local/lib/{libmodelbox.so,libsecurec.so,libmanager-client.so} /data/user/test/dep/
144+
cp cpack/_CPack_Packages/Android/TGZ/modelbox-1.0.0-Android/usr/local/lib/{libmodelbox-unit-cpu-python.so,libmodelbox-device-cpu.so,libmodelbox-virtualdriver-python.so,libmodelbox-virtualdriver-inference.so,libmodelbox-graphconf-graphviz.so} /data/user/test/drivers/
145+
cp test/mock/minimodelbox/libflowmock-lib.so /data/user/test/dep/
146+
cp test/mock/drivers/libmock-driver-ctrl-lib.so /data/user/test/dep/
147+
cp test/mock/drivers/device_mockdevice/libmodelbox-device-mockdevice.so /data/user/test/dep/
148+
cp test/mock/drivers/flowunit_mockflowunit/libmodelbox-unit-mockdevice-mockflowunit.so /data/user/test/dep/
149+
cp test/mock/drivers/graph_conf_mockgraphconf/libmodelbox-graphconf-mockgraphconf.so /data/user/test/dep/
150+
cp test/unit/unit /data/user/test/bin/
151+
cp /data/devel/thirdparty/deb/x86_64/usr/lib/{libssl.so.1.1,libcrypto.so.1.1,libcgraph.so,libcdt.so,libpython3.10.so.1.0} /data/user/test/dep/
152+
cp /data/ndk/android-ndk-r25b/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/libc++_shared.so /data/user/test/dep/
153+
cp -r ../test/assets /data/user/test/
154+
cp -r /data/devel/thirdparty/deb/x86_64/usr/lib/python3.10 /data/user/test/
155+
cp ../docker/unit.sh /data/user/test/bin/
156+
chmod +x /data/user/test/bin/*
157+
cd /data/user/
158+
tar zcf unittest.tar.gz test
159+
cp unittest.tar.gz /data/devel/modelbox
160+
}
161+
162+
unittest(){
163+
apt update
164+
apt install -y linux-modules-extra-$(uname -r) waydroid dbus dbus-x11 #weston
165+
166+
if [ $(ls /usr/share/waydroid-extra/images|grep img|wc -l) -eq 2 ];then
167+
waydroid init -f -i /usr/share/waydroid-extra/images
168+
else
169+
waydroid init
170+
fi
171+
172+
mkdir -p /tmp/runtime/wayland-0
173+
chmod 700 /tmp/runtime
174+
/etc/init.d/dbus start
175+
eval $(dbus-launch --sh-syntax)
176+
export $(dbus-launch)
177+
#/usr/lib/waydroid/data/scripts/waydroid-net.sh start
178+
waydroid container start &
179+
waydroid session start &
180+
181+
mkdir -p ~/.local/share/waydroid/data/user
182+
ls -lh /data/devel/modelbox/unittest.tar.gz
183+
tar zxf /data/devel/modelbox/unittest.tar.gz -C ~/.local/share/waydroid/data/user/
184+
ls -lh ~/.local/share/waydroid/data/user/test
185+
waydroid shell ./data/user/test/bin/unit.sh | tee unittest.log
186+
187+
times=0
188+
while [ $(cat unittest.log|grep -c AesEncryptPass) -lt 1 ];do
189+
cat /var/lib/waydroid/waydroid.log
190+
if [ $(cat /var/lib/waydroid/waydroid.log|grep -c "waiting for session to load") -lt 1 ];then
191+
waydroid session start &
192+
fi
193+
waydroid container restart &
194+
waydroid shell ./data/user/test/bin/unit.sh | tee unittest.log
195+
times=$[${times}+1]
196+
if [ ${times} -gt 3 ]; then
197+
echo "waydroid container start failed,pls check"
198+
exit 1
199+
fi
200+
done
201+
}
202+
203+
main(){
204+
if [ "$1" == "x64" ];then
205+
compile x64
206+
elif [ "$1" == "a64" ];then
207+
compile a64
208+
elif [ "$1" == "buildtest" ];then
209+
buildtest
210+
elif [ "$1" == "unittest" ];then
211+
unittest
212+
else
213+
for arch in x64 a64;do
214+
compile $arch
215+
prepare
216+
done
217+
package
218+
fi
219+
}
220+
221+
main $@

0 commit comments

Comments
 (0)