【Android系统开发】把Pytorch集成到android系统当中

需求

最近都在搞论文,需要在android系统上跑模型,所以需要把pytorch集成到android系统当中。简单记录下

方案

我找了很多方案,官网说可以自己编译pytorch,但是环境配置很复杂【https://zhuanlan.zhihu.com/p/650169531】,发现其实可以直接下载aar文件
https://repo1.maven.org/maven2/org/pytorch/pytorch_android/1.10.0/pytorch_android-1.10.0.aar

刚开始尝试从aar文件当中提取so文件以及头文件,集成进Adnroid里面
参考了这些博客:https://blog.csdn.net/zuguorui/article/details/96464821 发现也是不行,具体原因忘记了

接下来直接从官网下载的pytorchaar文件,分析下来这个方案可行的原因主要是我是在framwork层,本身是可以集成java环境的,直接在java层调用pytorch的api

步骤

参考了这篇博客,基本步骤是一样的:https://blog.csdn.net/DKBDKBDKB/article/details/104153094,但这个博客里面缺了点东西

  1. 在framworks/base下新建一个目录,例如:pytorch,将aar文件放在这个目录下,并新建一个文件 Adnroid.bp 修改其中内容如下
    1
    2
    3
    4
    5
    android_library_import {
    name: "services.pytorch",
    aars: ["pytorch_android-1.10.0.aar"],
    sdk_version: "current",
    }
  2. 之后在base目录下的Android.bp文件里的java_library当中的static_libs添加一行"services.pytorch",,这样就完成一大半了

之后我编译却发现不行。。。 尝试了很多次

奥对了 我还在代码当中引用了pytorch

之后使用在编译系统时使用make clean
报错不被允许,参考下面的内容修改 build/soong/scripts/check_boot_jars/package_allowed_list.txt
https://stackoverflow.com/questions/77813438/add-an-external-aar-library-to-aosp-for-internal-use-from-java-in-frameworks-bas

添加:

1
2
org\.torch
org\.torch\..*

解决报错

使用pytorch

我写了代码使用了上面的pytorch 代码首先我在应用层app里面运行了没有问题才用的
到系统里封装了类 又出现了报错 这次是直接进入循环开机 能够开开说明内核什么的没问题
就是我在framwork加的代码出问题了

刚开始发现adb并不能用,但是我尝试了adb devices
可以识别到手机 但是未授权 找了下资料 可以在系统中设置自动开启adb调试
https://bbs.kanxue.com/thread-281293.htm
解决问题,观察到如下报错,果然是代码问题,太不熟悉了,重构下代码编译运行下

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
26
Exception dispatching input event.
2024-12-17 17:37:22.776 7496-7496 Zygote system_process E System zygote died with fatal exception
java.lang.NullPointerException: Attempt to invoke virtual method 'float[][] android.hardware.SystemSensorManager$TensorProcessingTool.processSensorData(float[][])' on a null object reference
at android.hardware.SystemSensorManager$SensorEventQueue.dispatchSensorEvent(SystemSensorManager.java:1104)
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:335)
at android.os.Looper.loopOnce(Looper.java:161)
at android.os.Looper.loop(Looper.java:288)
at com.android.server.SystemServer.run(SystemServer.java:903)
at com.android.server.SystemServer.main(SystemServer.java:610)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:981)
2024-12-17 17:37:22.776 7496-7496 AndroidRuntime system_process D Shutting down VM
2024-12-17 17:37:22.776 7496-7496 AndroidRuntime system_process E *** FATAL EXCEPTION IN SYSTEM PROCESS: main
java.lang.NullPointerException: Attempt to invoke virtual method 'float[][] android.hardware.SystemSensorManager$TensorProcessingTool.processSensorData(float[][])' on a null object reference
at android.hardware.SystemSensorManager$SensorEventQueue.dispatchSensorEvent(SystemSensorManager.java:1104)
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:335)
at android.os.Looper.loopOnce(Looper.java:161)
at android.os.Looper.loop(Looper.java:288)
at com.android.server.SystemServer.run(SystemServer.java:903)
at com.android.server.SystemServer.main(SystemServer.java:610)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:981)

正解来了!

我尝试了好久都没有成功,发现aar如果带有so的话应该是不能正常加载,所以我就尝试了把aar文件里面的java代码和so分别进行编译
主要步骤可以总结为下面的

  1. 对应jar转源码,移除不必要依赖。
  2. 文件夹复制路径 frameworks/base/core/java
  3. 修改Android framework 编译权限文件 旧版本更新update.api,build/soong/scripts/check_boot_jars/package_allowed_list.txt 这部分其实第一次就遇到过
  4. 编译源码 添加so ,pt模型文件的编译。在项目device.mk 文件中添加编译命令即可。 但这时候会遇到一个问题,在网上搜索就好 好像是因为android版本比较高所以添加了限制 不让编译so 修改一个配置就好了

编译添加内容如下:

1
2
3
4
PRODUCT_COPY_FILES += \   
$(LOCAL_PATH)/pytorch/lib/libc++_shared.so:$(TARGET_COPY_OUT_SYSTEM)/lib/libc++_shared.so \ $(LOCAL_PATH)/pytorch/lib64/libc++_shared.so:$(TARGET_COPY_OUT_SYSTEM)/lib64/libc++_shared.so \
$(LOCAL_PATH)/pytorch/lib/libfbjni.so:$(TARGET_COPY_OUT_SYSTEM)/lib/libfbjni.so \ $(LOCAL_PATH)/pytorch/lib/libpytorch_jni_lite.so:$(TARGET_COPY_OUT_SYSTEM)/lib/libpytorch_jni_lite.so \
$(LOCAL_PATH)/pytorch/lib64/libfbjni.so:$(TARGET_COPY_OUT_SYSTEM)/lib64/libfbjni.so \ $(LOCAL_PATH)/pytorch/lib64/libpytorch_jni_lite.so:$(TARGET_COPY_OUT_SYSTEM)/lib64/libpytorch_jni_lite.so \ $(LOCAL_PATH)/pytorch/cvae1_mobile.pt:$(TARGET_COPY_OUT_SYSTEM)/etc/cvae1_mobile.pt \ $(LOCAL_PATH)/pytorch/DenoiseNet_mobile.pt:$(TARGET_COPY_OUT_SYSTEM)/etc/DenoiseNet_mobile.pt

https://blog.csdn.net/xjh24778451/article/details/127556958