「Android」カテゴリーアーカイブ

【UNITY】GOOGLE PLAYストア登録までの道(最終回)

最後のエラーはこれ。

この App Bundle にはネイティブ コードが含まれ、デバッグ シンボルがアップロードされていません。クラッシュや ANR を簡単に分析、デバッグできるよう、シンボル ファイルをアップロードすることをおすすめします。

これはででバッグ用のデータをアップロードしてください、ということなんですが、

そもそも、このデータを作成するには、

ビルド設定でsynbols.zipを作成にチェックを入れてビルドを行います。

これをネイティブデバッグシンボルにアップロードすればいいのですが。

300MBを越えるとファイルが大きすぎると怒られます。

この現象は、zipファイルを一度展開し、サイドzipファイルに固めるとファイルサイズが小さくなって、アップロード出来るようになります。

こちらの記事を参考にしました。

https://qiita.com/ShortArrow/items/854a9f7e855dd937fee2

これでエラーは全て解消されました。

長かった・・・

【UNITY】GOOGLE PLAYストア登録までの道(その6)

その5

次のエラーは、

この App Bundle に関連付けられている難読化解除ファイルはありません。難読化コード(R8 / ProGuard)を使用している場合、難読化解除ファイルをアップロードすると、クラッシュと ANR をより簡単に分析、デバッグできるようになります。R8 / ProGuard の使用は、アプリサイズの縮小につながります。

参考にしたサイトはこちら。

そもそもの話、ビルドの時にR8オプションをつけると、難読・圧縮化されて、ファイルサイズが小さくなるというメリットがあるのですが、

難読化しているので、デバッグ情報が出力されないという問題があり、それを解決するためにマッピングファイルをアップロードしておくと良いですよ、という話です。

Unityの設定は、プロジェクト設定で行います。

「R8を使用」という項目にチェックをつけます。

これでビルドするときに、マッピングファイルも出力されます。

アップロードするところはこちら。

ReTraceマッピングファイルの所に、aabファイルと一緒に出力されるマッピングファイルをアップロードします。

これで、このエラーは解消されました。

まだ続きます。

【Unity】GOOGLE PLAYストア登録までの道(その5)

その4

次のエラーは、

このリリースは Google Play の 64 ビット要件に準拠していません。
以下の APK または App Bundle は 64 ビットのデバイスで利用できますが、32 ビット向けネイティブ コードしか含まれていません([1])。
アプリには 64 ビットと 32 ビットのネイティブ コードを含めます。Android App Bundle 公開形式を使用して、各デバイスのアーキテクチャが自動的に必要なネイティブ コードだけを受け取るようにします。これにより、アプリ全体のサイズが増大することを回避できます。

これはこちらの記事を参考にしました。

https://qiita.com/nonkapibara/items/a708b856a496a96ccec5

プロジェクト設定のPlayer設定の中にスプリクティングバックエンドの項目があるので、これを「IL2CPP」に変更します。

そうすると、ターゲットアーキテクチャのARM64の設定が可能になるので、この項目をチェックにします。

この状態でビルドしてアップロードすると、エラーは解消されます。

まだ続きます。

【Unity】GOOGLE PLAYストア登録までの道(その4)

その3

次のエラーは、

このアプリが COVID-19(新型コロナウイルス感染症)の接触確認アプリまたは感染状況やワクチン接種状況を確認するアプリであるかどうかを申告してください。

まぁ、これは簡単で、

ダッシュボードにCOVID-19に関する設定項目があるので、ここで設定を行えば解消されます。

まだ続きます。

【UNITY】GOOGLE PLAYストア登録までの道(その2)

その1

次に出てきたエラーは、

現在、お客様のアプリは API レベル 29 を対象にしています。セキュリティとパフォーマンスが最適化された最新の API を利用するには、API レベル 30 以上を対象にする必要があります。アプリの対象 API レベルを 30 以上に変更してください。

これは、Android SDKのAPIレベルが低いだけなので、Unityのプロジェクト設定のターゲットAPIレベルをAPIレベル30以上のものを選択すれば良い。

しかし、Unityからダウンロードすると、なぜか失敗するので、

Android StudioのSDKマネージャーでダウンロードして、UnityのデフォルトのSDKパスの下のplatformsのフォルダにコピーすれば良い。

こちらを参考にしました。

http://blog.lab7.biz/archives/26146976.html

このエラーは解決しましたが、まだエラーが残っています・・・。

先は長い。

【UNITY】Google Playストア登録までの道(その1)

ある程度までゲームが完成したので、

早速ストアに登録だ!

アップロードできませんでした
アップロードされた APK または Android App Bundle がデバッグモードで署名されています。APK または Android App Bundle はリリースモードで署名する必要があります。詳しくは、署名についての説明をご覧ください。

アップロード失敗。

原因はこちらに書いてありました。(Qiitaの記事)

https://qiita.com/VeyronSakai/items/5946ee50e22f68a8ea5a

プロジェクト設定から公開設定の項目で、keystoreファイルを作成する必要があります。

こんなん分かるか!💢

これは初見殺しだわ。

そして、公開はまだ遠い・・・

【ANDROID】【実質北海道一周】残りの表示部分を実装する。【完成】

前回までの状況はこちら。

最新ソースはこちら

https://github.com/takishita2nd/AroundHokkaido

残りの、数字を表示する部分を作成していきます。

完成までもう少しです。

必要なデータは、

全体の距離(km)と現在位置(km)

区間の距離(km)と現在位置(km)

パーセンテージは上の数字があれば計算で出せます。

全体の距離はjsonを読み込んだときに計算して保持っておくのが良いでしょう。

全体の距離はすでに覚醒済み。

区間のデータはgetPosition()で取得させるのが良いでしょう。

class StartEndPosition(startCity: String, endCity: String, position: Double, segment: Double) {
val startCityName : String = startCity
val endCityName : String = endCity
val positionDistance: Double = position
val segmentDistance: Double = segment
}
    fun getPosition() : StartEndPosition {
var tempDistance = 0.0
var start : String = ""
var end : String = ""
var loop : Boolean = false
var segment: Double = 0.0
var aaa: Double = 0.0
run {
citylist.cityList.forEach{
if(loop){
end = it.city
return@run
}else{
tempDistance += it.distance
if(resultDistance < tempDistance){
start = it.city
aaa = resultDistance - (tempDistance - it.distance)
segment = it.distance
loop = true
}
}
}
}
return StartEndPosition(start, end, aaa, segment)
}
}
distanceFromStart.text = distancefromSapporoFormat.format(aroundHokkaido.getResultDistance(),
aroundHokkaido.getResultDistance() / aroundHokkaido.getTotalDistance() * 100)
distanceSection.text = distanceFormat.format(startEnd.positionDistance,
startEnd.positionDistance / startEnd.segmentDistance * 100)

とりあえず完成だけど、ぶっちゃけこのアプリ自体、そんなに面白くないなぁ。

まぁ、一通りどんな感じでコーディングするのか、それを経験するのには良かったのではないでしょうか。

これとは違うけど、別アプリも考えてみようと思います。

【ANDROID】【実質北海道一周】移動距離に応じて表示を変える

前回までの状況はこちら。

簡単ですが、UIは作ったので、実際に移動距離から都市名を表示させる処理を作っていきます。

class StartEnd(startCity: String, endCity: String) {
    val startCityName : String = startCity
    val endCityName : String = endCity
}
class AroundHokkaido {

    fun getCity() : StartEnd {
        var tempDistance = 0.0
        var start : String = ""
        var end : String = ""
        var loop : Boolean = false
        run {
            citylist.cityList.forEach{
                if(loop){
                    end = it.city
                    return@run
                }else{
                    tempDistance += it.distance
                    if(totalDistance < tempDistance){
                        start = it.city
                        loop = true
                    }
                }
            }
        }
        return StartEnd(start, end)
    }

Jsonで作成した都市と距離のデータから、移動距離と都市間距離を比較しながら加算していき、都市間距離合計が移動距離を超えたときにそのときの都市を返します。

forEach()を使っているのですが、forEachは処理じゃなくて関数なので、途中で処理を抜けるには、breakではなくreturnになります。

それをrunというラベルを指定してreturnすることで、run{}を抜けるところまでジャンプできます。

ややこしい。

でも大分Kotlinにも慣れてきた気がする。

class MainActivity : AppCompatActivity() {

    private fun updateCitydistance(startEnd : StartEnd){
        startCity.text = startEnd.startCityName
        endCity.text = startEnd.endCityName
    }

kotlinはUIにアクセスするの楽だからいいね。

GPSって、思った以上にいい加減、というか、誤差が大きくて、動かしていなくても、1mぐらい移動したものと見なされるみたいです。

後々対処しないとだけど、今は、移動するのがめんどくさいので、このままにしておきます。

確認用に、Jsonを修正。

うん、きちんと変わりましたね。

修正しなきゃいけないところはあるけど、とりあえずはこれでいいか。

Cocos2d-xの開発環境を作成してAndroidで動かすまでの話

一応、プロジェクトを作成して、Hello Worldが出るまでやりました。

手順などは、Qiitaにまとめましたが、

https://qiita.com/takishita2nd/items/0b54af9860f54c65fd24

実際はもっと手こずったので、いろいろと愚痴を書きたい。

まず、Python2.7で無ければセットアップからプロジェクト作成まで動かないのだが、

Python3が動いているのは分かっているのにPython3の本体がどこにあるか分からない、という自体に。

そもそもWindowsにインストールした覚えがない。

ググってプログラムの本体を調べるコマンドを探しまして、

where python

って打てば良いんですけど、

これコマンドプロンプロのコマンドね。

最近はPowerShellをよく使うから。

C:\Users\[ユーザー名]\AppData\Local\Microsoft\WindowsApps\python.exe

にありました。

分かるか。

展開したPython2.7を展開し、環境変数のPATHの設定で、上のフォルダの記載がある場所の上にPython2.7のPATHを書かなければならない。

PATHの検索順をPython2.7→Python3に変えるんですね。

めんどくせぇ。

今時Python2.xなんて使うやついないよ。(たぶん)

もう設定元に戻したわ。

プロジェクト作るときだけ変えれば良い。

そして、もう一つ、Cocoa2d-xってWindowsでも動かすことができるんですが、

いわゆるマルチプラットフォームになっていて、C++の共通コードだけ記述すれば、他のOSでも動かすことができる。

しかし、Windowsで動かす場合は

Visual Studio 2017が必要。

2019ではダメらしい。

めんどくさい。

(一応動かしたけど、後でまとめるわ)

でも、動いたので、あとはガリガリC++のコードを書いていけば。

IDE何使えば良いんだ?

【ANDROID】【実質北海道一周】UIの実装

さて、

このUIを作成していきます。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/startCity"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="36sp"
        app:layout_constraintBottom_toTopOf="@+id/endCity"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.425"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.528" />

    <TextView
        android:id="@+id/endCity"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="36sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.425"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.591" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="↓"
        android:textSize="36sp"
        app:layout_constraintBottom_toTopOf="@+id/endCity"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.402"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/startCity"
        app:layout_constraintVertical_bias="0.525" />

    <TextView
        android:id="@+id/distanceSection"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="280dp"
        android:textAlignment="center"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toEndOf="@+id/textView3"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/distanceFromStart"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginBottom="364dp"
        android:textAlignment="center"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toEndOf="@+id/textView3" />
</androidx.constraintlayout.widget.ConstraintLayout>

レイアウトとか、細かいところよくわかっていないので、適当です。

もしかしたら、機種によってレイアウトが崩れるとかもあるかも。

次回は実際に表示する処理を作成していきます。