FreelyApps

個人によるアプリ開発の日記です。アプリの収入だけで生活できるようになるのが目標です。UnityでAndroid向けのゲームアプリを作成しています。


    アプリ『トランプ・ジン・ラミー』を公開しました。
    Android/iOS https://goo.gl/PYKFYG

    カテゴリ: Android

      このエントリーをはてなブックマークに追加 Clip to Evernote
    ネイティブ クラッシュ(/system/lib/libhoudini.so.4.0.5.44806)というクラッシュが報告されていました。これまでに4回発生していたようです。発生頻度は高くないようですが、特定の端末達(ASUS MeMO Pad)で発生していたので気になりました。
    の4種類で発生しました。いずれも/system/lib/libhoudini.soでクラッシュしていました。これだけ見てもよくわからないので、これらの端末の共通点がないかを調べてみました。 
    端末のホームページにあるスペックを見ると、CPUは次の通りでした。
    •  インテル® Atom™ Z3745 クアッドコア
    • Intel® Atom™ Z2520 Dual-Core, 1.2 GHz
    • インテル® Atom™ Z3580 クアッドコア, 2.3 GHz
    • インテル® Atom™ Z3745 クアッドコア
    インテルのAtomが並んでいます。アプリに「CPUの相性があるのかな?」と思いつつ、原因はこれ以外には思いつかないというものがありました。
    ずいぶん前に「Unityでビルドしたapkのサイズ」 という記事を書いたとき、アプリの容量がx86系端末のためのライブラリが含まれて大きくなるということを知りました。このx86系の端末とは、インテルのCPUを使ったAndroidのことです。x86用のライブラリを含むとアプリサイズが大きくなるので、これを除外することができます。
    予想ですがx86用のライブラリがないとクラッシュするx86系の端末があるのではないかと思います。

    Android4.0以上向けにAPKを出せば100MBのAPKでも良いので、次回からはDevice FilterをFATの設定で出してみようと思います。
    とりあえず現時点ではMemo Padをダウンロードの対象外とすることで対処しました。(どれがインテルのCPUを使っているか調べるのが面倒だったので、MeMO Padという名前のものをすべて選択しました。)
    memopad


    『トランプ・スピード』以外のアプリでは発生報告がありません。おそらくは5000以上DLされていて、クラッシュが発生する端末で遊んでいる人がいるということだと思います。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    Androidのアプリしか出していないので、そのランキングについてのみの話です。アプリのダウンロード数に最も影響があるのはランキングの順位であるということです。
    当たり前のことのように言われることなのですが、これが内容に関係しないのであまりよくない仕組みになっているのです。 質の良いアプリがダウンロードされているというのが理想的ですが、そうはなりません。そんなものを探す労力をかけるよりはとりあえずランキング上位のものを試してみる方が簡単だからです。多くダウンロードされているということはレビューもそれなりに増えます。そのためレビューがあまりに悪くないなら、ランキング上位のものを使ってみるのが無難です。

    2つのものを比べればどちらが良いかわかるでしょう。それならばより良いものが残っていくのだろうと一見思います。2つが比べられるというのはどちらの存在も知らなければなりません。アプリのランキングでは圧倒的に有名な少しのものが他のものの存在をかき消すようなものです。知名度に差がありすぎて比べられることがないのです。

    ダウンロードを増やすには宣伝をしてユーザーに知らせるということが必要です。しかし、これにはお金がかかり継続的に続けるというようなことは難しいことです。お金を持つ企業が大量の宣伝をして、ランキングの上位に来るというのは当たり前になっています。質の勝負ではなく、お金の勝負になっているのがよくわかるカテゴリがあります。カジュアルやRPGが特に酷いと思います。

    ランキングに入らなければ勝負にもならないというのが現在のAndroidアプリの状況ではないかと思います。新しく出したアプリは1カ月間だけ新着のリストに載ります。この間になんとか上位に来ることが重要です。 

    ランキングは毎日更新されているようで前日のダウンロード数が最も影響しているように思います。もちろん過去のダウンロード数や評価も関係しているみたいです。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    レビュー依頼をすることはGoogle Playで可能です。
    規約に違反するような可能性もあるので注意が必要なものではあります。公式の説明に違反の例があります。評価に対し報酬を与えるなどして、評価を操作することがいけないとあります。「★5の評価をしてくれたら、○○のアイテムをあげます!」とかは違反だということです。

    レビューについてやれることは、レビューのページ(アプリのあるページのこと)へのリンクをアプリ内に置くことだけです。ボタンを押したらレビューのページに飛ばすということが唯一許されています。以前は公式のページにもユーザーにレビューを求める例としてダイアログの画像があったのですが、今は消えています。したがって、将来的にはレビューをすることを頼むことも禁止されるかも知れません。

    良いレビューが増えるとランキングや新しくアプリをダウンロードしようという動機付けに一役買うでしょうから、アプリにレビューを依頼する処理を作ることは良いかもしれません。レビューしやすくなったために悪口ばかり増える可能性もあるので、単純にリンクを作るというのは駄目な気がしています。
    レビュー内容についての操作は違反なので、レビューの依頼で表示する文言は「レビューをお願いします。」というだけになります。下のような感じです。(レビュー依頼の実装は『トランプ・スピード』のものです。)
    request-review-dialog

    しかしながら開発者側に意味あるレビュー(アプリの内容に具体的に触れていて、使ったことのない人にもわかるようなもの。その上で……できれば好意的なもの。)が増えてほしいから、レビュー依頼を作るわけです。文言を変えずにそのようなことをするには、レビュー依頼のダイアログを表示するタイミングを設定するのが良いと思います。
    良いレビューをするには繰り返しアプリを遊んでもらう必要があると思います。そのため何回もリザルト画面に来ているなら、レビュー依頼をするというようにしてみました。「後で」以外のボタンを押した場合は、この後でダイアログを出すことはありません。そうすることで望んだ人以外はダイアログを何度も見ることにならずゲームの進行の邪魔をしないようにしています。

    レビューページへの遷移は、
    Google Play上のアプリのURLに飛ばすだけで可能です。レビュー依頼をするかというフラグとリザルトに何回来たかをセーブデータに持つことで何回も遊んだ人だけにダイアログを出すということが実現できます。やってみると意外と簡単な処理だと思います。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    Androidのアプリのアップデートについてですが、公開のタイミングを自由に選べるようになったようです。アプリの公開というところに詳細が載っています。

    アップデートをするときにDeveloper Consoleの「更新を送信」ボタンの上に標準公開(デフォルト)となっているところをクリックすれば、時限公開に切り替えることができます。
    このモードにした状態でAPKをアップロードするなりして、アップデートの準備をします。
    これで「更新を送信」すると、通常のように数時間(かかることも)の待ち時間を経て公開できる状態になります。通常では公開も自動で行われるわけですが、時限公開の場合は「公開」ボタンを押すと数分以内で公開されることになります。
    公開タイミングを自由に選べることでイベントとかやってるアプリは楽になるでしょうし、告知をしてすぐに公開できるというのも使いやすいかもしれません。

    次にアップデートする機会があれば、使ってみようと思います。 

      このエントリーをはてなブックマークに追加 Clip to Evernote
    a6-permission

    Android6.0ではパーミッションをユーザーが任意に変えられる仕組みが導入されました。アプリによっては動かなくなるような致命的な影響を与える変更なので、一度は公式のドキュメントを見た方が良いです。

    パーミッションには色々ありますが、一部のパーミッションは危険だという分類にされていて、そのパーミッションを使うにはユーザーが許可する必要があります。それも動的(アプリ実行時)に変わるので、パーミッションが必要な処理をするところではその都度許可されているか調べなくてはなりません。

    どのパーミッションが危険かはこの記事のNormal and Dangerous Permissionsを見てください。
    私はSNSで画像を添付するためのファイルの読み書き
    • android.permission.READ_EXTERNAL_STORAGE
    • android.permission.WRITE_EXTERNAL_STORAGE
    の許可が必要になりました。 (実はWRITEの方があれば良いんですが……)

    許可が与えられているかを調べるにはAndroidのContextCompat.checkSelfPermissionを使えば可能です。当然、この呼び出しはJavaになります。プラグインを作ることでも可能ですが、UnityにあるJavaクラスを呼び出すためのクラスAndroidJavaClassを使うとC#のコードだけで実装が可能です。以下にコードを置いておきます。


    Check("android.permission.WRITE_EXTERNAL_STORAGE")のようにするとパーミッションが許可されているか調べられます。

    このコードを利用しても次のエラーが出るでしょう。
    AndroidJavaException: java.lang.ClassNotFoundException: android.support.v4.content.ContextCompat
    これはライブラリがないため、クラスが見つからないということです。 Plugins/Androidフォルダを作り、そこにandroid-support-v4.jarを置いておけば解決できます。
    android-support-v4.jarはAndroid SDKをインストールしたフォルダにあるはずで、
    (AndroidのSDKフォルダ)\extras\android\support\v4にjarがあります。これをUnityのプロジェクトの適切な場所にコピーすれば良いです。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    AndroidではAPKファイルを渡せば、アプリを簡単に配布することができます。このあたりがiOSに比べて緩く自由だと言われていることの原因の一つでしょう。開発中は便利な機能であるので、知っておくと良いと思います。

    端末のどこか(Downloadフォルダに置くのがわかりやすくて良いです。)にAPKファイルをコピーして、ファイルマネージャーアプリでそのファイルを選べばインストールができるでしょう。
    以下では「ESファイルエクスプローラー」というファイルマネージャーを使ってインストールしています。このアプリだけがインストールに対応しているのではなく、いくつかのファイルマネージャーでインストールは可能です。

    端末のDownloadフォルダにAPKファイルをコピーしてファイルマネージャーを起動します。
    以下のようにファイルが表示されています。
    externalInstall1

    表示されているアイコンをタップすると、
    externalInstall2
    いくつかの操作が選べるウィンドウが現れました。右端のインストールを選ぶと次に進みます。パッケージ名が同じアプリがインストールされている場合は上書きされるので注意してください。
    端末の設定によっては、インストールを押した後で警告が出ると思います。その対処については後述します。設定が問題ない場合は権限確認画面になります。

    インストールを押したら次のような画面になります。
    危険な権限等があれば、ここに権限の一覧が出るはずです。今回は特にないので何も出ていません。右下のインストールを押してインストールを実行します。
    externalInstall3

    インストールの間はバーがアニメーションしている画面になります。このときにはアプリを終了せず待ちましょう。しばらくすると右のようにインストールが完了したと告知されます。インストールできたので、アプリの一覧に追加されていて実行ができます。
    externalInstall4 externalInstall5

    先ほどの手順で権限確認画面にいけず警告が出る場合の対処を書いておきます。
    以下のようなインストールができない警告が出ているのですが、これはセキュリティの許可がなされていないことによります。
    externalInstallErr1

    設定->セキュリティを選び、提供元不明のアプリという項目を確認します。おそらく以下の画像のようにチェックが入っていないと思われます。
    externalInstallErr2

    これを有効にすることでファイルマネージャーからインストールができるようになります。有効にするときに警告が表示されますが、OKを選びます。
    externalInstallErr3

    設定をしたら項目が有効にされている表示になったことを確認してください。
    externalInstallErr4

    このように有効化されたら、再度インストールの手順を行ってください。


    Unityではビルドの設定をBuild And Runにすれば、APKファイルを作るだけでなくUSBケーブルにつないだAndroid端末にインストールも自動で行います。このため1つの端末でテストするだけなら、インストール方法を知らなくても開発を進められます。
    この自動で行われるインストールは大変便利ですが、大勢の人に見てもらう時や複数人での開発のときにはファイルを用いたインストール方法で誰でもAPKからインストールできるというのは重要です。

    自分の開発しているアプリだけでなく、APKファイルが手に入ればどのようなものもインストールが可能です。出所が怪しいAPKファイルは危険なので、インストールしないようにしましょう。自己責任です。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    ゲームなどのアプリでは、SNS系のアプリ(Twitter、LINE、Facebookなど)に拡散できる仕組みを入れるのが常識になっています。文字だけの投稿もありますが、画像があった方が良いので最近は画像付きの投稿が行えるものも多くなっています。

    画像付きのツイートを送信するには当然画像がなければなりません。この画像はスクリーンショットを使うことがほとんどでしょう。画面を撮影した画像を特定のフォルダに保存して、その場所と文字列(アプリの紹介文だったり、ゲームの結果だったり)をTwitterアプリに渡すことで画像の付きのツイートができるわけです。
    画像を作ったり、Twitterアプリに適切なものを渡して連携するところもそれなりに難しいのですが、一度できてしまえばどんなアプリでも同じ仕組みで動きます。ちゃんと作るという条件付きですが、成功したら正しく動くのでわけのわからない問題は起きないでしょう。

    きちんと作って画像付きのツイートを送信することができたとしても、Android6.0では動かなくなることがあると判明しました。Android6.0に対応するように作っていないのだから、それはそうだという話ではありますが、Unityを使っているとAndroidを直接いじるのは面倒極まりないのです。なので対処法を見つけることにして、なんとかお茶を濁そうと考えています。

    原因はAndroid6.0以上のOSを使っている場合、権限の管理ができるようになったためでした。この権限のうちWRITE_EXTERNAL_STORAGEというファイルの保存に関わる許可を得られないと画像ファイルにアクセスできないため、画像付きのツイートができないのです。しかもTwitterが落ちることも結構あります。
    SS_TwitterAbort

    5.9以前ではアプリをインストールするときに必要な権限は全て許可するようになっていたので、開発者はAndroidManifestに必要なパーミッションを入れておけばそれで十分でした。
    しかしながら6.0ではユーザーが自由に権限をON/OFFできるようになってるため、それだと不十分なことがあります。「Android 6.0 以降のアプリの権限の管理」として公式ページで説明してあります。

    どのような操作をすると画像付きのツイートを送信できるようになるか
    をメモしておきます。Android6.0以前の端末ではきちんと動くのに6.0では動かないという場合、以下の対応で正常に動く可能性があります。(試した端末のAndroidバージョンは6.0.1でした。)
    まず画像付きのツイートをすると画像にアクセスできずにTwitterアプリが停止するといった症状が出る場合、設定->アプリを開き、Twitterにデータを渡している問題のアプリを開きます。アプリの情報が下のように表示されているはずです。
    許可というところをみると「権限が付与されていません」と出ています。この状態だと駄目なので、許可というところをタップして設定を変えます。許可をタップすると右のようにアプリの権限の一覧画面になります。ここではストレージという権限があり、それが無効になっているという状態です。
    SS_TN_PicTwi1 SS_TN_PicTwi2

    ストレージをタップして権限を有効化します。右の方にトグルが移動し、緑色になりました。これで権限がゆうこうになります。1つ前のアプリ情報の画面に戻ると、許可にストレージが現れています。
    SS_TN_PicTwi3 SS_TN_PicTwi4

    権限の有効・無効を設定した場合、一度アプリを終了させないと反映されないようです。意外と重要なことですが、忘れがちなことなので注意するべきです。


    Android6.0以降に対応したアプリでは権限の管理についても対応するというのが正しいあり方です。
    対応方法は開発者用の情報に載っています。当然AndroidのAPIを直接呼び出しています。
    権限があるか常にチェックするためのメソッドがあり、それにより権限が与えられているかを判定してプログラミングすれば良さそうです。また権限を要求するためのダイアログを出す機能も用意されていました。(Runtime Permissonとかで検索するとそれなりにヒットするので興味がある場合は調べてみるのもいいと思います。)

    端末ごとの対応はしたくないので、テキストだけのツイートにするかアプリの紹介ページに「Android6.0をお使いの方は~」 的な対処方法を書いておくのが現実的かなあというところです。
    アプリが落ちたりしないようなので、まあ妥協点です。 

      このエントリーをはてなブックマークに追加 Clip to Evernote
    知っている人も多いと思いますが、Android6.0でも隠しゲームがやはりありました。
    ゲームの内容がAndroid5.0と変わらなかったのは残念ですが、相変わらず難しいゲームです。

    遊び方は設定画面の一番下にある端末情報を開きます。
    m6settings

    次にAndroidバージョンと表示されている項目を連打します。それなりに早く連打しないと認識しないようにできています。裏技みたいなものなので、偶発的に起こる可能性を低くしているのでしょう。
    m6terminalinfo

    コマンドが認識されると以下のようにマシュマロっぽいドロイド君が現れます。
    m6fb

    このイラストをタップしたりタッチしたりすると反応します。これをいじるとゲームが始まるようになっています。何故こんな風になっているのかは遊び心の結果だと思います。

    ゲームを始めまでが非常に長いです。
    マシュマロをタップしたり、タッチし続けたりしていると突然ゲームが始まります。何を条件にスタートしているかわかりませんが、いじった回数とかもあるんじゃないかと感じます。 

    Android6.0でのゲーム画面は以下のようになります。マシュマロによってプレイヤーが止められます。
    タッチしている間ドロイド君が浮いていきます。障害物を潜り抜けられそうになるタイミングで放すことでゲームは続きます。何回通り抜けられたかを競うゲームです。
    m6fb3

    このゲームは「Flappy Bird」というゲームを元に作られているらしいです。難しくて本家の方も話題になったようです。
    超難しい設定になっているので10回くらいくぐれたらすごいと思います。

    ちなみにAndroid 4.4とかでも同じ手順で隠し機能があります。 いつからあるんでしょうか?

      このエントリーをはてなブックマークに追加 Clip to Evernote
    Google Play Developer ConsoleにはクラッシュとANRという項目があります。
    これはアプリのクラッシュ(強制終了)とANR(アプリが応答しなくなる) がどれくらい起こっているかのレポートを見るものです。

    少し前にこのようなレポートが上がっていました。
    タイトルにjava.lang.Error: FATAL EXCEPTION [main]と書かれていて、何が起こっているかわかりませんがまずそうな感じなのはわかりました。
    原因は、
    Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@2bbfaf22: Unmarshalling unknown type code 7274595 at offset 12だと書いてありました。ParcelでUnmarshalling unknown type codeが起こったということです。

    admob-interstitial-error
    Parcelクラスはデータを保存できるオブジェクトを作れるもののようです。オブジェクトも保持できるとのことなので、内部的にはバイト列をもつクラスなのでしょう。(C#でいうとシリアライズ、デシリアライズに対応するのだと思います。)
    このクラスのreadValueが失敗するわけですが、クラスの読み込みがうまくいっていないということです。そこまではわかったのですが、どんなオブジェクトが来ていて、どこで読み込みに失敗するかはまるでわかりません。下の方にある呼び出し元を見るとInterstitialというところから呼ばれているのがわかります。これはインタースティシャル広告の開始のことでコードはライブラリの中です。

    もはやコードを見ることはできないので、検索して調べることにしました。
    同じような問題に遭っている人がいるようでGoogleに質問していました。 議論を見てみると、最後にGoogleがバグを修正したとあります。
    UnityにAdMobで広告を出している場合、Unity向けのパッケージを更新すればいいのか、google_play_servicesライブラリを更新すればいいのか、はたまたどちらも更新が必要なのかはわかりませんでした。
     
    どうもすべての端末で起こるわけではないようでしかも11月頃から発生したことのようです。 それまで発生しなかったことを考えると広告配信のデータの形式が変わり、機種(Android version)によってはそれに対応していないということかもしれません。
    インタースティシャルを使わなければ起きないでしょうが、使えないのは困ります。

    google_play_servicesライブラリを更新するくらいしか手がなさそうです。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    Google Playの規約について以前記事を書きました。Androidアプリで見かける明らかな違反としてレビューについて説明します。(評価が★のことでレビューはコメントのことのようです。どちらも含めてレビューと呼ばれることが多い気がします。)
    企業のものでも見かけますし、意外と違反しているアプリは身近にあるように感じます。これらは当然通報(アプリの情報欄で不適切なアプリだとGoogleに報告することを指します。)することができますので、開発側としては大きなリスクを取ることになります。通報されて問題ないなら、なんでもありませんが違反ですのでGoogleとしても何かしらの対応をする可能性があります。基本的にはアプリの削除が行われるでしょう。

    評価やレビューを操作しようとしてはいけません。公式による説明はこちらです。
    星5をつけてくださいと書いたり、良い評価をしてくださいと言ったりすることは評価の操作にあたるので禁止されています。曖昧な表現だから許されるわけではありません――むしろ悪意が感じられるのではないでしょうか。
    書きたくなる気持ちはよくわかります。良い評価をされることでアプリをダウンロードする人を増やせるでしょうし、おそらくランキングにも良い影響があるのでしょう。しかしながら、これは評価を不当にゆがめることであり、結果ユーザーを騙すことになります。レビューが当てにならなくなると最終的にストア自体の価値も下がり、長期的には全ての開発者に不利益を与えることになるでしょう。
    違反する人がそんなことまで気を配るとは思えませんが、アプリが削除されるようなことになったら流石に気にするでしょうね。

    評価やレビューをしたら、何らかの報酬をあげることは禁止されています。公式による説明はこちらです。「ユーザーの評価の勧誘」という項目です。
    評価やレビューを求めるダイアログを出すこと自体は規約違反にはなりません。方法に限らず評価やレビューをすることに対して、何らかの報酬をあげてはいけないのです。
    報酬目的で行ったレビューに意味はありませんから、禁止されているのだと思います。

    この記事を読んで違反していることに気づいたらすぐに修正すべきでしょう。
    他にやっている人がいるから自分もやっても良いんだというような人は迷惑なだけです。小さな違反はいずれ大きな違反をもたらします。そして厳しいルールと監視の下で過ごしていくことになるのです。
    アプリの世界の自由さを自分勝手に振舞って良いと勘違いするようなことは、自身の品位を貶めるだけなのだと思います。

    このページのトップヘ