ずっとLinuxMint18.2(Ubuntu16.04LTS派生)を使っていてWebViewアプリの作成には失敗していたのですが、LinuxMint19.3(Ubuntu18.04LTS派生)に上げた途端に成功したのでメモ。過去記事と手順は似ているので差分のみを書いていきます。
openjdkの混在を避ける
私がOSをclean installではなくupgradeしたせいなのかopenjdkは複数のversionが混在してしまいました。
# 現在入っているopenjdkを調べる
dpkg -l | grep openjdk
ii openjdk-11-jre:amd64 11.0.6+10-1ubuntu1~18.04.1 amd64 OpenJDK Java runtime, using Hotspot JIT
ii openjdk-11-jre-headless:amd64 11.0.6+10-1ubuntu1~18.04.1 amd64 OpenJDK Java runtime, using Hotspot JIT (headless)
ii openjdk-8-jdk:amd64 8u242-b08-0ubuntu3~18.04 amd64 OpenJDK Development Kit (JDK)
ii openjdk-8-jdk-headless:amd64 8u242-b08-0ubuntu3~18.04 amd64 OpenJDK Development Kit (JDK) (headless)
ii openjdk-8-jre:amd64 8u242-b08-0ubuntu3~18.04 amd64 OpenJDK Java runtime, using Hotspot JIT
ii openjdk-8-jre-headless:amd64 8u242-b08-0ubuntu3~18.04 amd64 OpenJDK Java runtime, using Hotspot JIT (headless)
これまでの経験でそういった状態だとapkの作成が上手く行かない事は分かっていたので一つのversionだけを残しました。
sudo apt remove openjdk-11-jre openjdk-11-jre-headless
apkをbuildする時に入れろと言われているopenjdk-8
を残しましたが、openjdk-11
はOSに元から入っている事もあって削除すると後々問題が起こりそうで怖い所です。もし誰かopenjdk-11
だけを入れた状態でapkの作成に上手くいった人が居たら教えてくれると助かります。
test用のcode
今回はweb frameworkにRemiを選びました。これはFlaskやBottleとは違ってHTMLの知識が無くて済む物で私にとってうってつけだったからです。codeはexamplesのhello worldを書き写しました。
import remi.gui as gui
from remi import start, App
class MyApp(App):
def __init__(self, *args):
super(MyApp, self).__init__(*args)
def main(self):
wid = gui.VBox(width=300, height=200)
self.lbl = gui.Label('Hello\n test', width='80%', height='50%', style={"white-space":"pre"})
bt = gui.Button('Press me!', width=200, height=30)
bt.onclick.do(self.on_button_pressed)
wid.append(self.lbl)
wid.append(bt)
return wid
def on_button_pressed(self, emitter):
self.lbl.set_text('Hello World!')
if __name__ == "__main__":
start(MyApp, debug=True, address='0.0.0.0', port=12343, start_browser=True)
重要なのは最後のport=12343
で、これでserver側(remi側)がport番号12343で待ち受ける事になります。なのでこの値をbuildozer.spec
に指定するclient側(webview側)の接続先port番号と合わせておく必要があります。
buildozer.spec
kivyアプリを作る時との違いはこれだけでした。
requirements = python3,remi
p4a.bootstrap = webview
p4a.port = 12343
実機上での様子
最後に
python for androidはkivyに限らず色んなpythonアプリをapk化してくれます。実際私はpygame2を使ったアプリでも成功しました。自分で試してはいませんが
も使えると思います。