2017-11-19 23 views
1

Ich bin ein neuer Android-Entwickler. Ich benutze python3.6 und kivy library, um mein Programm zu entwickeln. Ich benutze Crystax NDK und alles war nett, außer einer Sache, die Apps sind zu groß (800 MB).800mb apk-Datei mit buildozer kivy

Wie kann ich sie kleiner machen?

Python-Code

from kivy.app import App 
    from kivy.uix.widget import Widget 
    from kivy.properties import NumericProperty,ObjectProperty,ReferenceListProperty,StringProperty 
    from kivy.vector import Vector 
    from kivy.clock import Clock 
    from kivy.uix.button import Button 
    from random import randint,choice 


    class RetryButton(Button): 
     pass 

    class PongBall(Widget): 
     velocity_y = NumericProperty(0) 
     velocity_x = NumericProperty(0) 

     velocity = ReferenceListProperty(velocity_x,velocity_y) 
     def move(self): 
      self.pos = Vector(*self.velocity)+self.pos 

    class PongPaddle(Widget): 
     score = NumericProperty(0) 



     def bounce_ball(self,ball): 
      if self.collide_widget(ball): 
       vx,vy = ball.velocity 
       offset = (ball.center_y - self.center_y)/(self.height /10.0) 
       bounced = Vector(-1 * vx, vy) 
       vel = bounced * 1.1 
       ball.velocity = vel.x, vel.y + offset 

    class PongGame(Widget): 
     ball = ObjectProperty(None) 
     player1 = ObjectProperty(None) 
     player2 = ObjectProperty(None) 
     win = NumericProperty(0) 
     middle_rectangle_opacity = NumericProperty(1) 
     winner = StringProperty('') 
     def __init__(self,**q): 
      super(PongGame,self).__init__(**q) 
      self.btn = RetryButton(width = self.width) 
      self.btn.count = 0 
      self.max_score = 10 




     def serve_ball(self,vel = (10,0)): 
      self.ball.center = self.center 
      self.ball.velocity = Vector(*vel).rotate(choice([randint(0,30),randint(330,360)])) 

     def update(self,dt): 
      if self.win == 0: 
       self.ball.move() 
       self.player1.bounce_ball(self.ball) 
       self.player2.bounce_ball(self.ball) 
       if self.player1.score >= self.max_score or self.player2.score 
>=self.max_score: 
        if self.player1.score >= self.max_score: 
         self.winner = '1' 
        else: 
         self.winner = '2' 
        self.win = 1 
        self.middle_rectangle_opacity = 0 



       if (self.ball.y < self.y) or (self.ball.top > self.height): 
        self.ball.velocity_y *= -1 

       if self.ball.x<self.x: 
        self.player2.score += 1 
        self.serve_ball((10,0)) 
       if self.ball.x > self.width - self.ball.width: 
        self.player1.score += 1 
        self.serve_ball((-10,0)) 
      else: 
       if self.btn.count == 0: 
        self.btn.bind(on_press=self.retry) 
        self.add_widget(self.btn) 
        self.btn.count += 1 





     def on_touch_move(self, touch): 
      if touch.x < self.width/3: 
       self.player1.center_y = touch.y 
      if touch.x > self.width - self.width/3: 
       self.player2.center_y = touch.y 

     def retry(self,*q): 

      self.player1.score = 0 
      self.player2.score = 0 
      self.win = 0 
      self.middle_rectangle_opacity = 1 
      self.serve_ball() 
      self.remove_widget(self.btn) 
      self.btn.count = 0 





    class PongApp(App): 
     def build(self): 
      game = PongGame() 
      game.serve_ball() 
      Clock.schedule_interval(game.update, 1/60) 
      return game 

    if __name__ == '__main__': 
     PongApp().run() 

pong.kv Datei

#:kivy 1.0.9 
<[email protected]>: 
    text: 'Retry' 
    font_size: 17 
    size: self.width, '100dp' 
<PongBall>: 
    size: '50sp','50sp' 
    canvas.before: 
     Ellipse: 
      pos: self.pos 
      size: self.size 

<PongPaddle>: 
    canvas: 
     Rectangle: 
      pos:self.pos 
      size: self.size 


<PongGame>: 
    ball: pong_ball 
    player1: player_left 
    player2: player_right 
    canvas: 
     Color: 
      rgba: 1,1,1,root.middle_rectangle_opacity 
     Rectangle: 
      pos:self.center_x - 5,0 
      size: 10, self.height 
    Label: 
     font_size:35 
     center_x: root.center_x 
     center_y: root.height/4*3 
     text: "Player {} wins!!".format(root.winner) 
     color: 1,1,1,root.win 
    Label: 
     font_size: 70 
     center_x: root.width/4 
     top: root.top - 50 
     text: str(root.player1.score) 
    Label: 
     font_size: 70 
     center_x: root.width/4*3 
     top: root.top - 50 
     text: str(root.player2.score) 
    PongBall: 
     id: pong_ball 
     center: self.parent.center 
    PongPaddle: 
     size: root.width/30,root.height/3 
     id: player_left 
     x: root.x 
     center_y: root.center_y 
    PongPaddle: 
     size: root.width/30,root.height/3 
     id: player_right 
     x: root.width - self.width 
     center_y: root.center_y 

buildozer.spec

title = RetroPong 
package.name = retropong 
package.domain = www.thelatish.lv 
source.dir = . 
source.include_exts = py,kv 
version = 0.2 
requirements =python3crystax,kivy 
orientation = landscape 
osx.python_version = 3 
osx.kivy_version = 1.9.1 
fullscreen = 1 
android.ndk = 10.3.2 
android.ndk_path = opt/crystax-ndk-10.3.2 
android.arch =armeabi-v7a 
log_level = 2 
warn_on_root = 1 

Und ich denke, dass meine Dateien Baum helfen könnte, dieses Problem zu lösen.

computer/home/ubuntu/qwerty: 
    bin: 
    buildozer: 
    opt: 
    crystax-ndk-10.3.2 
    buildozer.spec 
    main.py 
    pong.kv 

Antwort

1

Dies ergibt sich normalerweise aus dem versehentlichen Hinzufügen zusätzlicher Dateien in der APK. Wenn du nicht herausfinden kannst, was sie sein könnten, entpacke die APK, finde die assets/private.mp3 Datei darin und entpacke sie (es ist wirklich ein tar-Archiv). Die Inhalte, die du findest, sollten alles sein, was du in die APK aufgenommen hast. Du kannst also überprüfen, ob sie mit dem übereinstimmen, was du erwartet hast.

+0

In private.mp3 gibt es 2 GB/opt-Ordner. Was soll ich tun, um diesen Fehler zu beheben? – user8046323

+0

Vermutlich ist dies der opt-Ordner aus Ihrem Build-Verzeichnis. Von Ihrer buildozer.spec bin ich nicht sicher, warum dies enthalten ist, aber Sie können es explizit in buildozer.spec (das 'source.exclude_dirs'-Token) ausschließen, oder Sie können es einfach woanders verschieben. – inclement

0

Nur weil ich paranoid bin, würde ich ersetzen "." in der Zeile für source_dir in der Spezifikationsdatei mit einem vollständigen Pfad. Sie können auch eine Liste von auszuschließenden Verzeichnissen hinzufügen wie:

Verwandte Themen