使用python中kivy库天生安卓APP

打印 上一主题 下一主题

主题 921|帖子 921|积分 2763

kivy的安装

官方保举的方式是使用假造情况来进行安装和部署,关于假造情况的相关操作,在前面写过的一篇博客中有轻微详细一点的先容,这里我们先给出操作步骤。假定我们已经在情况中用pip安装了virtualenv,那么我们先构建一个kivy的假造情况:
  1. [dechin@dechin-manjaro kivy]$ virtualenv kivy_venv
  2. created virtual environment CPython3.8.5.final.0-64 in 123ms
  3.   creator CPython3Posix(dest=/home/dechin/projects/2021-python/kivy/kivy_venv, clear=False, no_vcs_ignore=False, global=False)
  4.   seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/dechin/.local/share/virtualenv)
  5.     added seed packages: pip==21.0.1, setuptools==54.1.2, wheel==0.36.2
  6.   activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator
复制代码
构建完成后会在当前目录下天生一个文件夹:
  1. [dechin@dechin-manjaro kivy]$ ll
  2. 总用量 4
  3. drwxr-xr-x 4 dechin dechin 4096  4月  3 22:00 kivy_venv
复制代码
我们可以用source ./kivy_env/bin/activate的方式对假造情况进行激活,激活后每次实行系统操作指令,会在指令的最前端显示一个假造情况的标识,比如这里我们在假造情况中用pip来安装kivy:
  1. (kivy_venv)[dechin@dechin-manjaro kivy]$ python3 -m pip install kivy -i https://mirrors.cloud.tencent.com/pypi/simple
  2. Looking in indexes: https://mirrors.cloud.tencent.com/pypi/simple
  3. Collecting kivy
  4.   Downloading https://mirrors.cloud.tencent.com/pypi/packages/fd/4c/eb36890982bb11daaea68df62486ce36bde26cc9bec6a57e02c0e2aa8982/Kivy-2.0.0-cp38-cp38-manylinux2010_x86_64.whl (22.2 MB)
  5.      |████████████████████████████████| 22.2 MB 7.7 MB/s
  6. Collecting pygments
  7.   Downloading https://mirrors.cloud.tencent.com/pypi/packages/3a/80/a52c0a7c5939737c6dca75a831e89658ecb6f590fb7752ac777d221937b9/Pygments-2.8.1-py3-none-any.whl (983 kB)
  8.      |████████████████████████████████| 983 kB 688 kB/s
  9. Collecting Kivy-Garden>=0.1.4
  10.   Downloading https://mirrors.cloud.tencent.com/pypi/packages/7d/68/decaee596ff8168a39432eb3949fc7c0be952ebb9467806823bffc165d48/kivy-garden-0.1.4.tar.gz (6.8 kB)
  11. Collecting docutils
  12.   Downloading https://mirrors.cloud.tencent.com/pypi/packages/9a/65/76aea825b59727b556cca74e28d68e4d73244d2e1e8a8945c29d6d3d5e11/docutils-0.17-py2.py3-none-any.whl (575 kB)
  13.      |████████████████████████████████| 575 kB 912 kB/s
  14. Collecting requests
  15.   Downloading https://mirrors.cloud.tencent.com/pypi/packages/29/c1/24814557f1d22c56d50280771a17307e6bf87b70727d975fd6b2ce6b014a/requests-2.25.1-py2.py3-none-any.whl (61 kB)
  16.      |████████████████████████████████| 61 kB 1.0 MB/s
  17. Collecting certifi>=2017.4.17
  18.   Downloading https://mirrors.cloud.tencent.com/pypi/packages/5e/a0/5f06e1e1d463903cf0c0eebeb751791119ed7a4b3737fdc9a77f1cdfb51f/certifi-2020.12.5-py2.py3-none-any.whl (147 kB)
  19.      |████████████████████████████████| 147 kB 726 kB/s
  20. Collecting idna<3,>=2.5
  21.   Downloading https://mirrors.cloud.tencent.com/pypi/packages/a2/38/928ddce2273eaa564f6f50de919327bf3a00f091b5baba8dfa9460f3a8a8/idna-2.10-py2.py3-none-any.whl (58 kB)
  22.      |████████████████████████████████| 58 kB 644 kB/s
  23. Collecting urllib3<1.27,>=1.21.1
  24.   Downloading https://mirrors.cloud.tencent.com/pypi/packages/09/c6/d3e3abe5b4f4f16cf0dfc9240ab7ce10c2baa0e268989a4e3ec19e90c84e/urllib3-1.26.4-py2.py3-none-any.whl (153 kB)
  25.      |████████████████████████████████| 153 kB 564 kB/s
  26. Collecting chardet<5,>=3.0.2
  27.   Downloading https://mirrors.cloud.tencent.com/pypi/packages/19/c7/fa589626997dd07bd87d9269342ccb74b1720384a4d739a1872bd84fbe68/chardet-4.0.0-py2.py3-none-any.whl (178 kB)
  28.      |████████████████████████████████| 178 kB 827 kB/s
  29. Building wheels for collected packages: Kivy-Garden
  30.   Building wheel for Kivy-Garden (setup.py) ... done
  31.   Created wheel for Kivy-Garden: filename=Kivy_Garden-0.1.4-py3-none-any.whl size=4532 sha256=70dd6bf0a005868e9aca0710f7b717432bda7925c0fac236b99d2527ec112b78
  32.   Stored in directory: /home/dechin/.cache/pip/wheels/c9/d0/d4/2cb72931b74be8ce5fbee5ed87d66366f356a3161ea772d015
  33. Successfully built Kivy-Garden
  34. Installing collected packages: urllib3, idna, chardet, certifi, requests, pygments, Kivy-Garden, docutils, kivy
  35. Successfully installed Kivy-Garden-0.1.4 certifi-2020.12.5 chardet-4.0.0 docutils-0.17 idna-2.10 kivy-2.0.0 pygments-2.8.1 requests-2.25.1 urllib3-1.26.4
复制代码
为了加速安装,我们使用了腾讯的pip源。安装完成后,可以在已安装列表中看到刚才安装的kivy及其依赖组件:
  1. (kivy_venv)[dechin@dechin-manjaro kivy]$ python3 -m pip list
  2. Package     Version
  3. ----------- ---------
  4. certifi     2020.12.5
  5. chardet     4.0.0
  6. docutils    0.17
  7. idna        2.10
  8. Kivy        2.0.0
  9. Kivy-Garden 0.1.4
  10. pip         21.0.1
  11. Pygments    2.8.1
  12. requests    2.25.1
  13. setuptools  54.1.2
  14. urllib3     1.26.4
  15. wheel       0.36.2
复制代码
kivy的hello world

设置好kivy的情况后,我们可以直接在电脑端测试python所编写的app实例,比如kivy的hello world:
  1. # kivy_hello_world.py
  2. import kivy
  3. kivy.require('2.0.0') # 注意匹配版本号
  4. from kivy.app import App
  5. from kivy.uix.label import Label
  6. class MyApp(App):
  7.     def build(self):
  8.         return Label(text='Hello world')
  9. if __name__ == '__main__':
  10.     MyApp().run()
复制代码
可以直接用python3 kivy_hello_world.py的指令来实行,实行效果如下图所示:

实行期间我们可以在屏幕上看到一系列的日记输出,在有报错问题的时间,查询实行日记是必须使用的定位手段:
  1. [INFO   ] [Logger      ] Record log in /home/dechin/.kivy/logs/kivy_21-04-03_1.txt
  2. [INFO   ] [Kivy        ] v2.0.0
  3. [INFO   ] [Kivy        ] Installed at "/home/dechin/projects/2021-python/kivy/kivy_venv/lib/python3.8/site-packages/kivy/__init__.py"
  4. [INFO   ] [Python      ] v3.8.5 (default, Sep  4 2020, 07:30:14)
  5. [GCC 7.3.0]
  6. [INFO   ] [Python      ] Interpreter at "/home/dechin/projects/2021-python/kivy/kivy_venv/bin/python3"
  7. [INFO   ] [Factory     ] 186 symbols loaded
  8. [INFO   ] [Image       ] Providers: img_tex, img_dds, img_sdl2 (img_pil, img_ffpyplayer ignored)
  9. [INFO   ] [Text        ] Provider: sdl2
  10. [INFO   ] [Window      ] Provider: sdl2
  11. [INFO   ] [GL          ] Using the "OpenGL" graphics system
  12. [INFO   ] [GL          ] Backend used <sdl2>
  13. [INFO   ] [GL          ] OpenGL version <b'4.6 (Compatibility Profile) Mesa 20.3.1'>
  14. [INFO   ] [GL          ] OpenGL vendor <b'Intel'>
  15. [INFO   ] [GL          ] OpenGL renderer <b'Mesa Intel(R) UHD Graphics 620 (WHL GT2)'>
  16. [INFO   ] [GL          ] OpenGL parsed version: 4, 6
  17. [INFO   ] [GL          ] Shading version <b'4.60'>
  18. [INFO   ] [GL          ] Texture max size <16384>
  19. [INFO   ] [GL          ] Texture max units <32>
  20. [INFO   ] [Window      ] auto add sdl2 input provider
  21. [INFO   ] [Window      ] virtual keyboard not allowed, single mode, not docked
  22. [INFO   ] [ProbeSysfs  ] device match: /dev/input/event16
  23. [INFO   ] [MTD         ] Read event from </dev/input/event16>
  24. [INFO   ] [Base        ] Start application main loop
  25. [INFO   ] [GL          ] NPOT texture support is available
  26. [WARNING] [MTD         ] Unable to open device "/dev/input/event16". Please ensure you have the appropriate permissions.
  27. [INFO   ] [Base        ] Leaving application in progress...
复制代码
到这里,我们的第一步工作就基本完成了,但是需要注意的是,这里我们的程序还是运行在电脑端的,我们需要将其打包成apk文件之后,才能在手机端运行。
选择使用假造情况的原因

这里我们单独一个小章节,说明一下为什么官方保举的使用方法很多都是使用假造情况,这个其实跟反面要先容的apk打包有较大关系。我们在打包apk的过程中,如果有相关的python依赖包,都需要在设置文件中提前标识。这一点非常紧张,最好是能够指定详细的版本号进行安装,否则会出现打包失败的问题,如果到了打包的阶段再去定位和办理此类问题,会非常的麻烦。
apk构建情况设置

我们在本地采用了buildozer的方案来进行apk的构建,如果在本地其他情况依赖如jdk等都已经部署完毕,在假造情况里面直接安装buildozer是没有问题的。但是由于本地情况中依赖都比较缺乏,因此为了避免情况切换混乱,这里我们使用假造情况来展示安装和使用的基本方法,但是实际应用场景下,我们还是直接使用了本地的python3情况,而不是假造情况。
安装buildozer

跟其他python库一样的,我们可以通过pip来对buildozer进行安装和管理:
  1. (kivy_venv)[dechin@dechin-manjaro kivy]$ python3 -m pip install buildozer -i https://mirrors.cloud.tencent.com/pypi/simple
  2. Looking in indexes: https://mirrors.cloud.tencent.com/pypi/simple
  3. Collecting buildozer
  4.   Downloading https://mirrors.cloud.tencent.com/pypi/packages/ac/62/a53738c604ebc86d3b62f654c3169e8c0b4178a066d7398cf53377a5cb3b/buildozer-1.2.0-py3-none-any.whl (77 kB)
  5.      |████████████████████████████████| 77 kB 783 kB/s
  6. Collecting sh
  7.   Downloading https://mirrors.cloud.tencent.com/pypi/packages/50/38/f7dcc62943d0870f02df9e2fa527b7f0cd86b233a80d6e503a08f3ef5ddc/sh-1.14.1-py2.py3-none-any.whl (40 kB)
  8.      |████████████████████████████████| 40 kB 1.7 MB/s
  9. Collecting pexpect
  10.   Downloading https://mirrors.cloud.tencent.com/pypi/packages/39/7b/88dbb785881c28a102619d46423cb853b46dbccc70d3ac362d99773a78ce/pexpect-4.8.0-py2.py3-none-any.whl (59 kB)
  11.      |████████████████████████████████| 59 kB 1.0 MB/s
  12. Collecting virtualenv
  13.   Downloading https://mirrors.cloud.tencent.com/pypi/packages/91/fb/ca6c071f4231e06a9f0c3bd81c15c233bbacd4a7d9dbb7438d95fece8a1e/virtualenv-20.4.3-py2.py3-none-any.whl (7.2 MB)
  14.      |████████████████████████████████| 7.2 MB 2.2 MB/s
  15. Collecting ptyprocess>=0.5
  16.   Downloading https://mirrors.cloud.tencent.com/pypi/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl (13 kB)
  17. Collecting distlib<1,>=0.3.1
  18.   Downloading https://mirrors.cloud.tencent.com/pypi/packages/f5/0a/490fa011d699bb5a5f3a0cf57de82237f52a6db9d40f33c53b2736c9a1f9/distlib-0.3.1-py2.py3-none-any.whl (335 kB)
  19.      |████████████████████████████████| 335 kB 721 kB/s
  20. Collecting six<2,>=1.9.0
  21.   Downloading https://mirrors.cloud.tencent.com/pypi/packages/ee/ff/48bde5c0f013094d729fe4b0316ba2a24774b3ff1c52d924a8a4cb04078a/six-1.15.0-py2.py3-none-any.whl (10 kB)
  22. Collecting appdirs<2,>=1.4.3
  23.   Downloading https://mirrors.cloud.tencent.com/pypi/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl (9.6 kB)
  24. Collecting filelock<4,>=3.0.0
  25.   Downloading https://mirrors.cloud.tencent.com/pypi/packages/93/83/71a2ee6158bb9f39a90c0dea1637f81d5eef866e188e1971a1b1ab01a35a/filelock-3.0.12-py3-none-any.whl (7.6 kB)
  26. Installing collected packages: six, ptyprocess, filelock, distlib, appdirs, virtualenv, sh, pexpect, buildozer
  27. Successfully installed appdirs-1.4.4 buildozer-1.2.0 distlib-0.3.1 filelock-3.0.12 pexpect-4.8.0 ptyprocess-0.7.0 sh-1.14.1 six-1.15.0 virtualenv-20.4.3
复制代码
安装完成后,应该要在本地可以看到buildozer的安装位置:
  1. (kivy_venv)[dechin@dechin-manjaro kivy]$ which buildozer
  2. /home/dechin/projects/2021-python/kivy/kivy_venv/bin/buildozer
复制代码
buildozer的基本使用

从框架上来说,buildozer的使用方法其实只有两个步骤:先用init天生设置文件,然后使用buildozer debug就可以构造一个apk文件了,如果顺遂的话
  1. (kivy_venv) [dechin@dechin-manjaro kivy]$ buildozer init
  2. File buildozer.spec created, ready to customize!
复制代码
按照流程第一步初始化完成后,当前的目录下会天生一个buildozer.spec的设置文件,与其他软件所不一样的是,这个设置文件又臭又长,修改起来非常的不便,对新手极其不友好。但是,运气好的情况下也不需要去修改这个设置文件就可以成功构建apk。
  1. (kivy_venv) [dechin@dechin-manjaro kivy]$ ll
  2. 总用量 24
  3. -rw-r--r-- 1 dechin dechin 10489  4月  3 22:17 buildozer.spec
  4. -rw-r--r-- 1 dechin dechin   243  4月  3 22:06 kivy_hello_world.py
  5. drwxr-xr-x 4 dechin dechin  4096  4月  3 22:00 kivy_venv
复制代码
当你实行下面的指令,正常情况下麻烦才刚刚开始:
  1. (kivy_venv) [dechin@dechin-manjaro kivy]$ buildozer android debug deploy run
  2. # Check configuration tokens
  3. # Ensure build layout
  4. # Create directory /home/dechin/.buildozer
  5. # Create directory /home/dechin/.buildozer/cache
  6. # Create directory /home/dechin/projects/2021-python/kivy/.buildozer
  7. # Create directory /home/dechin/projects/2021-python/kivy/bin
  8. # Create directory /home/dechin/projects/2021-python/kivy/.buildozer/applibs
  9. # Create directory /home/dechin/.buildozer/android/platform/android/platform
  10. # Create directory /home/dechin/projects/2021-python/kivy/.buildozer/android/platform
  11. # Create directory /home/dechin/projects/2021-python/kivy/.buildozer/android/app
  12. # Check configuration tokens
  13. # Read available permissions from api-versions.xml
  14. # Preparing build
  15. # Check requirements for android
  16. # Run 'dpkg --version'
  17. # Cwd None
  18. /bin/sh:行1: dpkg:未找到命令
  19. # Search for Git (git)
  20. #  -> found at /usr/bin/git
  21. # Search for Cython (cython)
  22. #  -> found at /home/dechin/anaconda3/bin/cython
  23. # Search for Java compiler (javac)
  24. # Java compiler (javac) not found, please install it.
复制代码
没有dpkg,没有jdk,在参考链接5里面还有人专门整理了各种可能猜到的坑,对这些情况有依赖,为何不能在文档中提前说明呢?这里还有一点需要注意的是,虽然buildozer官方提供了docker的办理方案,但是我们极其不保举使用官方提供的docker办理方案,由于官方的docker方案只办理buildozer的问题,不办理其他的情况依赖问题。
构建问题处理

以下整理了一些在使用过程中所碰到的问题,正是为了办理这些问题,所以我们后来放弃了在假造情况中继续测试的方法,改用本地情况直接来运行。这里有个区别需要注意,buildozer每次初始化会在特定帐号和情况的目录下产生一个.buildozer的目录,而普通帐号和root帐号的~/目录是不一样的,这点首先要明确。而如果使用假造情况,在假造情况下也可以产生一个独立的.buildozer目录。
dpkg的依赖安装

我们使用了基于Arch的Manjaro Linux系统,大部分的软件通过pacman、yay和yaourt都是可以直接下载到的,固然,最好是设置好AUR的源,这里dpkg我们直接使用pacman来安装:
  1. [dechin-root kivy]# pacman -S dpkg
  2. 正在解析依赖关系...
  3. 正在查找软件包冲突...
  4. 软件包 (1) dpkg-1.20.5-2
  5. 下载大小:  1.75 MiB
  6. 全部安装大小:  8.26 MiB
  7. :: 进行安装吗? [Y/n] Y
  8. :: 正在获取软件包......
  9. dpkg-1.20.5-2-x86_64      1795.8 KiB   524 KiB/s 00:03 [#############################] 100%
  10. (1/1) 正在检查密钥环里的密钥                            [#############################] 100%
  11. (1/1) 正在检查软件包完整性                              [#############################] 100%
  12. (1/1) 正在加载软件包文件                                [#############################] 100%
  13. (1/1) 正在检查文件冲突                                  [#############################] 100%
  14. (1/1) 正在检查可用存储空间                              [#############################] 100%
  15. :: 正在处理软件包的变化...
  16. (1/1) 正在安装 dpkg                                     [#############################] 100%
  17.     dpkg installs Debian package manager.
  18.     This is useful for those who want to create/modify DEB files.
  19.     However, *do not* use dpkg to install Debian packages in your ArchLinux machine.
  20.     This will break your system!
  21.     You will need to go back to Arch wiki and read the installation guide again.
  22.     You've been warned!
  23. :: 正在运行事务后钩子函数...
  24. (1/1) Arming ConditionNeedsUpdate...
复制代码
中间如果没有报错即为安装成功。
基于docker的buildozer方案

虽然并不是很保举这个容器化方案,由于这个容器所能够办理的问题实在太少,但是这里我们还是展示一下buildozer官方容器的设置和使用方法。首先是下载官方镜像:
  1. [dechin-root kivy]# docker pull kivy/buildozer
  2. Using default tag: latest
  3. latest: Pulling from kivy/buildozer
  4. 5d3b2c2d21bb: Pull complete
  5. 3fc2062ea667: Pull complete
  6. 75adf526d75b: Pull complete
  7. 1e25f7347ef2: Pull complete
  8. 5f20dec9b37e: Pull complete
  9. 50f409884337: Pull complete
  10. eee420e57cec: Pull complete
  11. cf2da2cede0f: Pull complete
  12. 6581da051d43: Pull complete
  13. e9f936019286: Pull complete
  14. 517947681358: Pull complete
  15. Digest: sha256:b2923081b45829555cd27356fbc0ab364474c64d9879fa730eccd4ce63e22cc4
  16. Status: Downloaded newer image for kivy/buildozer:latest
  17. docker.io/kivy/buildozer:latest
复制代码
下载完成后,绑定当前目录运行容器镜像:
  1. [dechin-root first_app]# docker run --volume "$(pwd)":/home/user/hostcwd kivy/buildozer
  2. Buildozer 1.2.0.dev0
复制代码
可以直接查看帮助:
  1. [dechin-root first_app]# docker run -it --volume "$(pwd)":/home/user/hostcwd kivy/buildozer --help
  2. Usage:
  3.     buildozer [--profile <name>] [--verbose] [target] <command>...
  4.     buildozer --version
  5. Available targets:
  6.   ios                iOS target, based on kivy-ios project
  7.   android            Android target, based on python-for-android project
  8. Global commands (without target):
  9.   appclean           Clean the .buildozer folder in the app directory.
  10.   distclean          Clean the whole Buildozer environment.
  11.   help               Show the Buildozer help.
  12.   init               Create a initial buildozer.spec in the current directory
  13.   serve              Serve the bin directory via SimpleHTTPServer
  14.   setdefault         Set the default command to run when no arguments are given
  15.   version            Show the Buildozer version
  16. Target commands:
  17.   clean      Clean the target environment
  18.   update     Update the target dependencies
  19.   debug      Build the application in debug mode
  20.   release    Build the application in release mode
  21.   deploy     Deploy the application on the device
  22.   run        Run the application on the device
  23.   serve      Serve the bin directory via SimpleHTTPServer
  24. Target "ios" commands:
  25.   list_identities    List the available identities to use for signing.
  26.   xcode              Open the xcode project.
  27. Target "android" commands:
  28.   adb                Run adb from the Android SDK. Args must come after --, or
  29.                      use --alias to make an alias
  30.   clean              Clean the build and distribution
  31.   logcat             Show the log from the device
  32.   p4a                Run p4a commands. Args must come after --, or use --alias
  33.                      to make an alias
复制代码
第一次初始化,出现了权限不足的问题,一开始以为是容器内部读写权限设置的问题,因此这里先给容器加上了privileged权限,但是实行后发现这个问题依然存在:
  1. [dechin-root first_app]# docker run -it --volume "$(pwd)":/home/user/hostcwd --privileged=True kivy/buildozer init
  2. Traceback (most recent call last):
  3.   File "/home/user/.local/bin/buildozer", line 8, in <module>
  4.     sys.exit(main())
  5.   File "/home/user/.local/lib/python3.8/site-packages/buildozer/scripts/client.py", line 13, in main
  6.     Buildozer().run_command(sys.argv[1:])
  7.   File "/home/user/.local/lib/python3.8/site-packages/buildozer/__init__.py", line 1010, in run_command
  8.     getattr(self, cmd)(*args)
  9.   File "/home/user/.local/lib/python3.8/site-packages/buildozer/__init__.py", line 1049, in cmd_init
  10.     copyfile(join(dirname(__file__), 'default.spec'), 'buildozer.spec')
  11.   File "/usr/lib/python3.8/shutil.py", line 261, in copyfile
  12.     with open(src, 'rb') as fsrc, open(dst, 'wb') as fdst:
  13. PermissionError: [Errno 13] Permission denied: 'buildozer.spec'
复制代码
那就有可能是本地设置文件和目录权限的问题,由于目录是在普通帐号下产生的,一般是644的权限,那么就算是root权限的写入可能也会首先,干脆直接递归的改成777:
  1. [dechin-root kivy]# chmod -R 777 first_app/
复制代码
再次运行,发如今本地一样也可以天生设置文件:
  1. [dechin-root first_app]# docker run -it --volume "$(pwd)":/home/user/hostcwd --privileged=True kivy/buildozer init && ll
  2. File buildozer.spec created, ready to customize!
  3. 总用量 24
  4. -rw-r--r-- 1 dechin dechin 12305  4月  4 10:59 buildozer.spec
  5. -rwxrwxrwx 1 root   root     243  4月  4 10:42 main.py
  6. drwxrwxrwx 3 root   root    4096  4月  4 10:43 user
复制代码
但是这个容器镜像跟常规的有所不同,整个的容器镜像就只能实行buildozer的指令,这尤其对国内用户非常的不友好,由于我们缺乏的就是buildozer那一堆依赖情况,在国内网络上会受到一定的限制。比如我们下述展示的运行效果,就卡在这个地方好久:
  1. [dechin-root first_app]# docker run -it --volume "$(pwd)":/home/user/hostcwd --privileged=True kivy/buildozer android debug deploy run
  2. # Check configuration tokens
  3. # Ensure build layout
  4. # Create directory /home/user/.buildozer
  5. # Create directory /home/user/.buildozer/cache
  6. # Create directory /home/user/hostcwd/.buildozer
  7. # Create directory /home/user/hostcwd/bin
  8. # Create directory /home/user/hostcwd/.buildozer/applibs
  9. # Create directory /home/user/.buildozer/android/platform/android/platform
  10. # Create directory /home/user/hostcwd/.buildozer/android/platform
  11. # Create directory /home/user/hostcwd/.buildozer/android/app
  12. # Check configuration tokens
  13. # Read available permissions from api-versions.xml
  14. # Preparing build
  15. # Check requirements for android
  16. # Run 'dpkg --version'
  17. # Cwd None
  18. Debian 'dpkg' package management program version 1.19.7 (amd64).
  19. This is free software; see the GNU General Public License version 2 or
  20. later for copying conditions. There is NO warranty.
  21. # Search for Git (git)
  22. #  -> found at /usr/bin/git
  23. # Search for Cython (cython)
  24. #  -> found at /home/user/.local/bin/cython
  25. # Search for Java compiler (javac)
  26. #  -> found at /usr/lib/jvm/java-13-openjdk-amd64/bin/javac
  27. # Search for Java keytool (keytool)
  28. #  -> found at /usr/lib/jvm/java-13-openjdk-amd64/bin/keytool
  29. # Install platform
  30. # Run 'git clone -b master --single-branch https://github.com/kivy/python-for-android.git python-for-android'
  31. # Cwd /home/user/hostcwd/.buildozer/android/platform
  32. Cloning into 'python-for-android'...
复制代码
网络卡了很长一段时间后会弹出众多的报错:
  1. Cloning into 'python-for-android'...
  2. fatal: unable to access 'https://github.com/kivy/python-for-android.git/': GnuTLS recv error (-54): Error in the pull function.
  3. # Command failed: git clone -b master --single-branch https://github.com/kivy/python-for-android.git python-for-android
  4. # ENVIRONMENT:
  5. #     PATH = '/home/user/.buildozer/android/platform/apache-ant-1.9.4/bin:/home/user/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
  6. #     HOSTNAME = '69325b48f53a'
  7. #     TERM = 'xterm'
  8. #     USER = 'user'
  9. #     HOME_DIR = '/home/user'
  10. #     WORK_DIR = '/home/user/hostcwd'
  11. #     SRC_DIR = '/home/user/src'
  12. #     LANG = 'en_US.UTF-8'
  13. #     LANGUAGE = 'en_US.UTF-8'
  14. #     LC_ALL = 'en_US.UTF-8'
  15. #     HOME = '/home/user'
  16. #
  17. # Buildozer failed to execute the last command
  18. # The error might be hidden in the log above this error
  19. # Please read the full log, and search for it before
  20. # raising an issue with buildozer itself.
  21. # In case of a bug report, please add a full log with log_level = 2
复制代码
实际上这就是网络的问题,如果你能上谷歌,那么你就同时办理了这个问题。如果网络不可的话,即使在官方商店里面可以看到也是下载安装不了的:

adb日记定位apk问题

假定你已经办理了上述提到了访问谷歌网站的问题,那么情况依赖的问题基本上就已经办理了,只需要注意jdk跟gradle的版本配套关系即可,这里我们本地使用的是jdk-8,同样的也可以使用yaourt来进行安装。最后就还有可能出现,部署到安卓设备上面之后,app闪退的问题。首先我们如果实行buildozer androiid debug deploy run,而且同时保障安卓手机USB接入以及USB调试开关的打开,顺遂情况下会出现以下信息:
  1. List of devices attached
  2. xxx        device
  3. # Deploy on xxx
  4. # Run '/home/dechin/.buildozer/android/platform/android-sdk/platform-tools/adb install -r "/home/dechin/projects/2021-python/kivy/first_app/bin/myapp-0.1-armeabi-v7a-debug.apk"'
  5. # Cwd /home/dechin/.buildozer/android/platform
  6. Performing Streamed Install
  7. Success
  8. # Application pushed.
  9. # Run on xxx
  10. # Run '/home/dechin/.buildozer/android/platform/android-sdk/platform-tools/adb shell am start -n org.test.myapp/org.kivy.android.PythonActivity -a org.kivy.android.PythonActivity'
  11. # Cwd /home/dechin/.buildozer/android/platform
  12. Starting: Intent { act=org.kivy.android.PythonActivity cmp=org.test.myapp/org.kivy.android.PythonActivity }
  13. # Application started.
复制代码
但这并不是终点,我们发如今手机上用apk安装的app会出现闪退,这一般都是由于程序报错而导致的,我们可以在毗连USB调试的状态下,进入adb shell查看日记:
  1. [dechin@dechin-manjaro first_app]$ adb shell
  2. HWPCT:/ $ run-as org.test.myapp
  3. HWPCT:/data/data/org.test.myapp
  4. $ cd files/app/.kivy/logs/                                 
  5. HWPCT:/data/data/org.test.myapp/files/app/.kivy/logs
  6. $ ls
  7. kivy_21-04-06_0.txt
  8. $ cat kivy_21-04-06_0.txt                                                                     <
  9. [INFO   ] Logger: Record log in /data/user/0/org.test.myapp/files/app/.kivy/logs/kivy_21-04-06_0.txt
  10. [WARNING] [Config      ] Upgrading configuration in progress.
  11. [WARNING] [Config      ] Older configuration version detected (0 instead of 21)
  12. [INFO   ] Kivy: v1.11.1
  13. [INFO   ] Kivy: Installed at "/data/user/0/org.test.myapp/files/app/_python_bundle/site-packages/kivy/__init__.pyc"
  14. [INFO   ] Python: v3.8.1 (default, Apr  6 2021, 10:41:43)
  15. [Clang 8.0.2 (https://android.googlesource.com/toolchain/clang 40173bab62ec7462
  16. [INFO   ] Python: Interpreter at ""
  17. [WARNING] stderr: Traceback (most recent call last):
  18. [WARNING] stderr:   File "/home/dechin/projects/2021-python/kivy/first_app/.buildozer/android/app/main.py", line 4, in <module>
  19. [WARNING] stderr:   File "/home/dechin/projects/2021-python/kivy/first_app/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/myapp/kivy/__init__.py", line 138, in require
  20. [WARNING] stderr: Exception: The version of Kivy installed on this system is too old. (You have 1.11.1, but the application requires 2.0.0)
  21. HWPCT:/data/data/org.test.myapp/files/app/.kivy/log
复制代码
从日记中我们看到,这是由于对应的kivy程序版本过低导致的,这需要我们修改buildozer.spec设置文件。我们找到requirements这里,发现这里的两个仓库都没有指定版本号,这里我们采取的方案是加上版本号的要求,然后清除.buildozer目录,重新进行情况安装。
  1. requirements = python3,kivy
复制代码
修改后如下:
  1. requirements = python3,kivy==2.0.0
复制代码
然后在重新实行buildozer debug deploy run,得得手机界面上的效果如下(如果只运行debug大概release,那就不需要毗连手机USB调试,这里的操作相当于直接把apk传输得手机上进行安装和运行):

总结

基于python也可以开发安卓APP,这需要使用到kivy库来进行开发,再通过buildozer来编译构建。这两个库的安装和使用方式都相对比较简单,我们保举直接在本地的系统情况下直接部署使用,最大的困难其实在于部署的过程以及设置文件的修改,这也都是比较基础的操作了。最后我们演示了使用文本框和按钮事件,加上python的eval()函数和math数学仓库,实现了一个可以在移动端调用math库中的函数实行数学计算的简单APP,并提供了apk下载网盘地址。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

尚未崩坏

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表