• Introducing XDA Computing: Discussion zones for Hardware, Software, and more!    Check it out!

Getting the Thermal Camera Working on the Blackview BV9800 Pro under a Custom ROM

Search This thread

Fluora

New member
Mar 25, 2021
1
2
The Blackview BV9800 Pro is a relatively rare device, and has no support from LineageOS or any other popular ROM project I can find. This is kind of a shame, because it's a pretty cool device - in particular, it has an integrated thermal camera, and is also just a nice ruggedized phone at a surprisingly low price. The bootloader is unlockable out of the box without any need for an unlock code or other nonsense from the vendor, which is also a big bonus.

Being a Project Treble-compatible device, it's possible to run unofficial GSI builds of LineageOS on it, such as these, which are replacement images to flash over /system. These work well with the majority of the BV9800 Pro's functions (wireless, visible-light cameras, sensors, etc.), but getting the thermal camera to work requires a little bit more work. I have done this successfully, so I wanted to share what I did in case anyone else finds themselves in the same situation.

I have only tested these procedures on a BV9800 Pro (EEA version), running LineageOS 16 (Android 9) from the link above. Other versions of Android may work, but I do not know whether they do or not, and decided to stay with Android 9, since this is what the vendor ships on the device. Your results may vary if you decide to try a newer version.

The factory MyFLIR app for the device can be found at this location in the stock ROM:
Code:
/system/app/myflir-bv2.3.6-release-signed/myflir-bv2.3.6-release-signed.apk
However, if you try to just install it like a normal app package under LineageOS, it crashes on startup without providing any useful information. The system logs reveal that it crashes because it's trying to communicate with a system service that manages the thermal camera, but this service isn't installed. Fortunately, you can install it by just copying a few files from the factory ROM over to the LineageOS system. The files in question are located at these paths in the factory ROM:
Code:
/system/bin/leptonServer
/system/etc/init/LeptonCameraServer.rc
/system/lib64/libleptoncamera.so
If you copy these files to the same paths in the LineageOS /system tree, then the Lepton camera server backend, which is required for the MyFLIR app to function, will be installed and configured to start at boot.

SELinux seems to prevent the app from connecting to the Lepton server on my device, so I had to disable it by running
Code:
setenforce 0
in a root shell on the device. I didn't install it as a system app, though, which could be part of the problem. I don't know much about how SELinux actually works, but I feel comfortable enough disabling it. If you don't want to disable it, you can probably find information about how to make it allow the FLIR app to work, but I'm afraid I can't be of much help there.

You can find a copy of the stock BV9800 Pro ROM here on the Blackview forum.
If you want to root the stock ROM to allow you to inspect /system, this thread explains how. If you prefer, you can instead extract the ROM zip archive on a computer, decompress the included system.img with simg2img, and mount it to inspect the contents directly, which is what I did. Modifying /system on a running device can be difficult these days, so it will probably work best to mount up the GSI image the same way and copy the files into it, rather than try to edit it in-place on a running device.

I hope this information helps. The thermal camera is one of the most important (and expensive) features of the BV9800 Pro, and getting it working was pretty much the deciding factor for me as to whether I would keep the (kind of bad) factory ROM, or get to enjoy all the perks of LineageOS. I'm not really knowledgeable enough to write a complete and trustworthy guide to installing LineageOS, though, so if you're just getting started, you'll want to find a more detailed tutorial about how installing custom ROMs (especially GSI/Treble builds) works.
 

blackhawk

Senior Member
Jun 23, 2020
7,196
2,722
That's a cool rugged phone. Stock it's running on Pie... personally I leave it be and optimize it as best I could to get maximum battery life.
I was looking at these... FLIR, hell yes.
 
Apr 16, 2021
1
0
I was following your guide, I'm using my Blackview 9800pro without GApps (but with MicroG 0.2.18.204714) on LineageOS 17.1-20210321. When opening the MyFlir camera or gallery app, it asks me for all the relevant permissions on the first start and then promptly crashes every time I open it. I tried both as a system and a regular app, with and without selinux. In the error below, it complains about not finding the right function in libvndksupport.so. This library is much smaller in LineageOS than it is shipped in the Stock ROM from Blackview. Replacing the LineageOS shared object file with the one from Blackview causes my phone not to boot. Is there something I am missing that causes my instance of the app (I tried both 2.3.6 and 2.3.8) to crash?

Code:
04-28 00:27:34.047  1383  5788 I ActivityTaskManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.flir.tiger/com.flir.monarch.ui.MainActivity bnds=[27,996][232,1321]} from uid 10121
04-28 00:27:34.057   783   804 I [email protected]: powerHintAsync hint:8, data:1
04-28 00:27:34.061   783   803 I libPowerHal: 8: legacy set freq: 1989000 -1 2106000 -1
04-28 00:27:34.076  1383  1420 E system_server: Invalid ID 0x00000000.
04-28 00:27:34.077  1383  1419 W ActivityManager: Stopping service due to app idle: u0a216 -10s135ms com.flir.tiger/com.flir.monarch.media.MediaScanner
04-28 00:27:34.084  1008  1008 D Zygote  : Forked child process 7648
04-28 00:27:34.087  1383  1426 I ActivityManager: Start proc 7648:com.flir.tiger/u0a216 for pre-top-activity {com.flir.tiger/com.flir.monarch.ui.MainActivity}
04-28 00:27:34.147  1579  1579 D ImageWallpaper: wallpaper visibility changes to: false
04-28 00:27:34.161   762   864 I hwcomposer: [DEV] 1024    0    0    0
04-28 00:27:34.162   762   864 I hwcomposer: [DEV]    0  741    0    0
04-28 00:27:34.162   762   864 I hwcomposer: [DEV]    0    0  470    0
04-28 00:27:34.162   762   864 I hwcomposer: [DEV]    0    0    0 1024
04-28 00:27:34.173  7648  7648 D FirebaseApp: com.google.firebase.auth.FirebaseAuth is not linked. Skipping initialization.
04-28 00:27:34.174  7648  7648 D FirebaseApp: com.google.firebase.crash.FirebaseCrash is not linked. Skipping initialization.
04-28 00:27:34.174  7648  7648 I FirebaseInitProvider: FirebaseApp initialization successful
04-28 00:27:34.177   762   864 I hwcomposer: [DEV] [DEV] (Send identity matrix)
04-28 00:27:34.187  7648  7673 I FA      : App measurement is starting up, version: 15300
04-28 00:27:34.187  7648  7673 I FA      : To enable debug logging run: adb shell setprop log.tag.FA VERBOSE
04-28 00:27:34.187  7648  7673 I FA      : To enable faster debug mode event logging run:
04-28 00:27:34.187  7648  7673 I FA      :   adb shell setprop debug.firebase.analytics.app com.flir.tiger
04-28 00:27:34.196   762   864 I hwcomposer: [DEV] 1024    0    0    0
04-28 00:27:34.196   762   864 I hwcomposer: [DEV]    0  741    0    0
04-28 00:27:34.196   762   864 I hwcomposer: [DEV]    0    0  470    0
04-28 00:27:34.196   762   864 I hwcomposer: [DEV]    0    0    0 1024
04-28 00:27:34.200  7648  7648 I CrashlyticsCore: Initializing Crashlytics 2.6.8.32
04-28 00:27:34.207  7648  7686 W ContextImpl: Failed to ensure /data/user/0/com.google.android.gms/shared_prefs: mkdir failed: EACCES (Permission denied)
04-28 00:27:34.208  7648  7648 I CrashlyticsInitProvider: CrashlyticsInitProvider initialization successful
04-28 00:27:34.212   762   864 I hwcomposer: [DEV] [DEV] (Send identity matrix)
04-28 00:27:34.220  2428  2428 D GmsMeasureBrokerSvc: onBind: Intent { act=com.google.android.gms.measurement.START pkg=com.google.android.gms }
04-28 00:27:34.222  3179  3179 D GmsGcmRegister: onBind: Intent { act=com.google.android.c2dm.intent.REGISTER pkg=com.google.android.gms }
04-28 00:27:34.223  1024  1024 I netd    : firewallSetUidRule(2, 10161, 1) <2.63ms>
04-28 00:27:34.227  1024  1024 I netd    : firewallSetUidRule(2, 10160, 1) <1.74ms>
04-28 00:27:34.230  1024  1024 I netd    : firewallSetUidRule(2, 10157, 1) <2.14ms>
04-28 00:27:34.233  1024  1024 I netd    : firewallSetUidRule(2, 10151, 1) <1.85ms>
04-28 00:27:34.236  7648  7648 I ashmem  : memfd: device VNDK version (28) is < Q so using ashmem.
04-28 00:27:34.277  7648  7648 D AndroidRuntime: Shutting down VM
04-28 00:27:34.277  7648  7648 E AndroidRuntime: FATAL EXCEPTION: main
04-28 00:27:34.277  7648  7648 E AndroidRuntime: Process: com.flir.tiger, PID: 7648
04-28 00:27:34.277  7648  7648 E AndroidRuntime: java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "android_get_exported_namespace" referenced by "/data/app/com.flir.tiger-EcVVz9vk2XWvVymOtKJxOQ==/lib/arm64/libvndksupport.so"...
04-28 00:27:34.277  7648  7648 E AndroidRuntime:        at java.lang.Runtime.loadLibrary0(Runtime.java:1071)
04-28 00:27:34.277  7648  7648 E AndroidRuntime:        at java.lang.Runtime.loadLibrary0(Runtime.java:1007)
04-28 00:27:34.277  7648  7648 E AndroidRuntime:        at java.lang.System.loadLibrary(System.java:1667)
04-28 00:27:34.277  7648  7648 E AndroidRuntime:        at com.flir.flirone.sdk.FlirOne.<clinit>(FlirOne.java:59)
04-28 00:27:34.277  7648  7648 E AndroidRuntime:        at com.flir.flirone.sdk.FlirOne.registerDeviceCallback(FlirOne.java:341)
04-28 00:27:34.277  7648  7648 E AndroidRuntime:        at com.flir.monarch.app.ForegroundApplication.onActivityStarted(ForegroundApplication.java:88)
04-28 00:27:34.277  7648  7648 E AndroidRuntime:        at android.app.Application.dispatchActivityStarted(Application.java:406)
04-28 00:27:34.277  7648  7648 E AndroidRuntime:        at android.app.Activity.dispatchActivityStarted(Activity.java:1238)
04-28 00:27:34.277  7648  7648 E AndroidRuntime:        at android.app.Activity.onStart(Activity.java:1723)
04-28 00:27:34.277  7648  7648 E AndroidRuntime:        at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:614)
04-28 00:27:34.277  7648  7648 E AndroidRuntime:        at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:178)
04-28 00:27:34.277  7648  7648 E AndroidRuntime:        at com.flir.monarch.ui.MainActivity.onStart(MainActivity.java:79)
04-28 00:27:34.277  7648  7648 E AndroidRuntime:        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1432)
04-28 00:27:34.277  7648  7648 E AndroidRuntime:        at android.app.Activity.performStart(Activity.java:7847)
04-28 00:27:34.277  7648  7648 E AndroidRuntime:        at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3294)
04-28 00:27:34.277  7648  7648 E AndroidRuntime:        at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
04-28 00:27:34.277  7648  7648 E AndroidRuntime:        at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
04-28 00:27:34.277  7648  7648 E AndroidRuntime:        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
04-28 00:27:34.277  7648  7648 E AndroidRuntime:        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
04-28 00:27:34.277  7648  7648 E AndroidRuntime:        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
04-28 00:27:34.277  7648  7648 E AndroidRuntime:        at android.os.Handler.dispatchMessage(Handler.java:107)
04-28 00:27:34.277  7648  7648 E AndroidRuntime:        at android.os.Looper.loop(Looper.java:214)
04-28 00:27:34.277  7648  7648 E AndroidRuntime:        at android.app.ActivityThread.main(ActivityThread.java:7356)
04-28 00:27:34.277  7648  7648 E AndroidRuntime:        at java.lang.reflect.Method.invoke(Native Method)
04-28 00:27:34.277  7648  7648 E AndroidRuntime:        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:491)
04-28 00:27:34.277  7648  7648 E AndroidRuntime:        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:940)
04-28 00:27:35.334  1383  5501 D AlarmManagerService: Kernel timezone updated to -120 minutes west of GMT
04-28 00:27:35.348  1383  6143 D AlarmManagerService: Kernel timezone updated to -120 minutes west of GMT
04-28 00:27:35.709  1090  1371 I  1090  1371 [sunwave-hal] : (711) 'healthMonitoringThread' enter.
04-28 00:27:35.710  1090  1371 I  1090  1371 [sunwave-client] : (90) ---8<---- TA LOG BEGINS ---------
04-28 00:27:35.710  1090  1371 I  1090  1371 [sunwave-ta-core] : (2869) 'sf_get_device_state' state:0008
04-28 00:27:35.710  1090  1371 I  1090  1371 [sunwave-client] : (107) --------- TA LOG FINISH ---->8---
 

tylab

New member
May 11, 2021
1
0
Thanks for the info for the flir Camera,
It works fine with lineage OS 16 !
I want to add the info I got while doing it:
  1. It does not work with all version of Andy Custom Lineage OS: I could not make it works with this one: lineage-16.0-20191017-UNOFFICIAL-treble_arm64_bvN.img.xz the lepton server had a seg fault.
  2. I try with a lineage OS 18 , the lepton server worked but the application failed, I will look into it one day... maybe
  3. I root my phone with magisk
  4. I used a script to bypass SElinux and start the server when i want ( because i don't know if it wise to always have SElinux in permissive mode)
 

leviathan9595

New member
May 12, 2021
1
0
Thanks for the info for the flir Camera,
It works fine with lineage OS 16 !
I want to add the info I got while doing it:
  1. It does not work with all version of Andy Custom Lineage OS: I could not make it works with this one: lineage-16.0-20191017-UNOFFICIAL-treble_arm64_bvN.img.xz the lepton server had a seg fault.
  2. I try with a lineage OS 18 , the lepton server worked but the application failed, I will look into it one day... maybe
  3. I root my phone with magisk
  4. I used a script to bypass SElinux and start the server when i want ( because i don't know if it wise to always have SElinux in permissive mode)
thank u for the additional info!,so which version of lineage os 16 worked for u? iam on lineage-16.0-20191017-UNOFFICIAL-treble_arm64_bvN.img.xz and tried the author's steps but didn't work for me, also it'd be nice if u share with us the script u use to bybass selinux,thanks.
 

QuentinX5

Senior Member
I want to report back some of my own success in regards to this thread. I have the camera working, but it's not a perfect solution and was wondering if you guys could assist me in checking what I could have possibly missed. I'm running it on the most current Lineage OS 18.1; I've compiled a version using the Treble ROM lineage-18.1-20210512-UNOFFICIAL-treble_arm64_bvS with Magisk as root (I also added MindTheGapps into it after some workarounds with the mounts, and had to register my device as an "unsupported device").

I followed the OP's guide to the T, and still couldn't get the app to even open. The logs revealed it was trying to call leptonServer, nulling out after five tries, and then crashing. Narrowed this down to being an issue with the /bin/leptonServer file itself being set as -rwx-r--r--, and changing it to -rwxr-x-r-x got the app to boot up. The only problem is, for the camera to actually start, I have to open a terminal session and start leptonServer from there, and I assume this has something to do with the SELinux policies in place. I've fought half the battle and got a version of sepolicy-inject set up to run (using the following policy: allow untrusted_app_27 default_android_service:service_manager { find }; (sepolicy-inject -s untrusted_app_27 -t default_android_service -c service_manager -p find (if this doesn't work for you, try doing logcat ServiceManager:V SELinux:V *:S to find the relevant SELinux policies that you need to apply, and follow the formulas))), but I figure this is still erroring out somewhere, since, after a restart, the only way I can get it working again is to go and disable SELinux using setenforce to 0 and then starting the server again using some sort of terminal. I also installed the MyFlir app as a system app.

I believe that part of the issue might be that I haven't properly added the SELinux policy, but I'm not entirely positive how I would go about testing this (I've more or less just gotten into the ROM building scene last week, but feel I have somewhat of an edge being a software developer for a living). I think if I boot into recovery I can grab the sepolicy file, but I'm not sure what else to do with it at this point.

The error I get when it's not running, aside from the PID is pretty consistent too:

05-31 19:19:06.814 372 372 E SELinux : avc: denied { find } for pid=20308 uid=10195 name=LeptonCameraService scontext=u:r:untrusted_app_27:s0:c195,c256,c512,c768 tcontext=u:eek:bject_r:default_android_service:s0 tclass=service_manager permissive=0


Hopefully, this helps someone to find the right answers before I can; I know I'll keep tinkering with it until I find the solution (I'm also attempting to overcome the CTSProfile/Basic failure in Magisk, which I plan to make a guide if I can find an answer).
 

Flir

New member
Jun 26, 2021
1
0
I get the same error as @&00&V5yt$r2$E!n1IDUiJ9bF on Lineage18.1 - treble_arm64_bvS-userdebug

04-28 00:27:34.277 7648 7648 E AndroidRuntime: java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "android_get_exported_namespace" referenced by "/data/app/com.flir.tiger-EcVVz9vk2XWvVymOtKJxOQ==/lib/arm64/libvndksupport.so"...

My leptonServer is working correctly and service runs from the start so it I feel this is related to the /system/app/myflir-bv2.3.6-release-signed.
Are you guys using a different version of the app?
 

QuentinX5

Senior Member
I get the same error as @&00&V5yt$r2$E!n1IDUiJ9bF on Lineage18.1 - treble_arm64_bvS-userdebug

04-28 00:27:34.277 7648 7648 E AndroidRuntime: java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "android_get_exported_namespace" referenced by "/data/app/com.flir.tiger-EcVVz9vk2XWvVymOtKJxOQ==/lib/arm64/libvndksupport.so"...

My leptonServer is working correctly and service runs from the start so it I feel this is related to the /system/app/myflir-bv2.3.6-release-signed.
Are you guys using a different version of the app?

I also used myflir-bv2.3.6-release-signed, pulled straight from the currently available 9.0 ROM.

For that specifically, if you are looking at the most recent ROM build available from Blackview, in the directory /system/system/app/myflir-bv2.3.6-release-signed, there is both the APK and a lib folder. I'd copy the lib folder over to your phone in that same directory; I think you're missing the dependencies from there.

If you already have those libaries in there, try the read/write settings on the folder too.
 
Last edited:

Aegis_Zerty

New member
Nov 26, 2021
1
0
Hi bv9800 pro customers! Anyone tryed the magisk module in the thread https://forum.xda-developers.com/t/blackview-bv9900pro-magisk-modules.4331187/
to get flir worked on linage?
Hi ilich79
I tryed the magisk module for BV9900pro.
I have installed it manualy to improve my understanding.
First, selinux block as always :

E/SELinux ( 338): avc: denied { find } for pid=18411 uid=10175 name=LeptonCameraService scontext=u:r:priv_app:s0:c512,c768 tcontext=u:object_r:default_android_service:s0 tclass=service_manager permissive=0

After enforce selinux and relanch the leptonServer.
Application launch completly but the camera send only the first image and block after that

So, i replace the leptonServer by the old one and retry.
Finally it works fully.

I someone know how to correctly set the selinux policy for this app ? I will be graceful
 

Top Liked Posts

  • There are no posts matching your filters.
  • 2
    The Blackview BV9800 Pro is a relatively rare device, and has no support from LineageOS or any other popular ROM project I can find. This is kind of a shame, because it's a pretty cool device - in particular, it has an integrated thermal camera, and is also just a nice ruggedized phone at a surprisingly low price. The bootloader is unlockable out of the box without any need for an unlock code or other nonsense from the vendor, which is also a big bonus.

    Being a Project Treble-compatible device, it's possible to run unofficial GSI builds of LineageOS on it, such as these, which are replacement images to flash over /system. These work well with the majority of the BV9800 Pro's functions (wireless, visible-light cameras, sensors, etc.), but getting the thermal camera to work requires a little bit more work. I have done this successfully, so I wanted to share what I did in case anyone else finds themselves in the same situation.

    I have only tested these procedures on a BV9800 Pro (EEA version), running LineageOS 16 (Android 9) from the link above. Other versions of Android may work, but I do not know whether they do or not, and decided to stay with Android 9, since this is what the vendor ships on the device. Your results may vary if you decide to try a newer version.

    The factory MyFLIR app for the device can be found at this location in the stock ROM:
    Code:
    /system/app/myflir-bv2.3.6-release-signed/myflir-bv2.3.6-release-signed.apk
    However, if you try to just install it like a normal app package under LineageOS, it crashes on startup without providing any useful information. The system logs reveal that it crashes because it's trying to communicate with a system service that manages the thermal camera, but this service isn't installed. Fortunately, you can install it by just copying a few files from the factory ROM over to the LineageOS system. The files in question are located at these paths in the factory ROM:
    Code:
    /system/bin/leptonServer
    /system/etc/init/LeptonCameraServer.rc
    /system/lib64/libleptoncamera.so
    If you copy these files to the same paths in the LineageOS /system tree, then the Lepton camera server backend, which is required for the MyFLIR app to function, will be installed and configured to start at boot.

    SELinux seems to prevent the app from connecting to the Lepton server on my device, so I had to disable it by running
    Code:
    setenforce 0
    in a root shell on the device. I didn't install it as a system app, though, which could be part of the problem. I don't know much about how SELinux actually works, but I feel comfortable enough disabling it. If you don't want to disable it, you can probably find information about how to make it allow the FLIR app to work, but I'm afraid I can't be of much help there.

    You can find a copy of the stock BV9800 Pro ROM here on the Blackview forum.
    If you want to root the stock ROM to allow you to inspect /system, this thread explains how. If you prefer, you can instead extract the ROM zip archive on a computer, decompress the included system.img with simg2img, and mount it to inspect the contents directly, which is what I did. Modifying /system on a running device can be difficult these days, so it will probably work best to mount up the GSI image the same way and copy the files into it, rather than try to edit it in-place on a running device.

    I hope this information helps. The thermal camera is one of the most important (and expensive) features of the BV9800 Pro, and getting it working was pretty much the deciding factor for me as to whether I would keep the (kind of bad) factory ROM, or get to enjoy all the perks of LineageOS. I'm not really knowledgeable enough to write a complete and trustworthy guide to installing LineageOS, though, so if you're just getting started, you'll want to find a more detailed tutorial about how installing custom ROMs (especially GSI/Treble builds) works.