2017-11-19 27 views
1

저는 새로운 Android 개발자입니다. 내 프로그램을 개발하기 위해 python3.6 및 kivy 라이브러리를 사용하고 있습니다. 나는 Crystax NDK를 사용하고 있습니다. 한 가지를 제외하고는 모두 훌륭했습니다. 앱이 너무 컸습니다 (800MB).800mb apo 파일을 사용하여 buildozer kivy

어떻게하면 더 작게 만들 수 있습니까?

파이썬 코드

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 파일

#: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 

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 

그리고 내 파일 트리 당신은이 문제를 해결하는 데 도움 수 있다고 생각

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

답변

1

이는 대개 실수로 APK에 추가 파일을 포함시킨 결과 발생합니다. 그들이 할 수있는 것을 해결할 수 없다면 APK의 압축을 풀고 그 안에 assets/private.mp3 파일을 찾아서 압축을 푸십시오 (실제로는 tar 아카이브입니다). 검색 한 콘텐츠는 APK에 포함 된 모든 것이므로 예상 한 것과 일치하는지 확인할 수 있습니다.

+0

private.mp3에는 2GB/opt 폴더가 있습니다. 이 오류를 해결하려면 어떻게해야합니까? – user8046323

+0

아마도 이것은 빌드 디렉토리의 opt 폴더입니다. buildozer.spec에서 이것이 왜 포함되는지는 모르지만 buildozer.spec ('source.exclude_dirs' 토큰)에서이를 명시 적으로 제외하거나 다른 곳으로 옮길 수 있습니다. – inclement

0

내가 편집증 환자이기 때문에 나는 '.'을 대체 할 것입니다. 스펙 파일의 source_dir 행에 ​​전체 경로가 표시됩니다. 다음과 같이 제외 할 디렉토리 목록을 추가 할 수도 있습니다.

source.exclude_dirs: bin, buildozer, opt