2014年5月18日日曜日

Nexus7の製造名を知る方法

Nexus7の製造名を知る方法

Factory Images for Nexus Devicesでは、Nexus7の機種毎に、使用するファイルが異なっている。

Codenames, Tags, and Build Numbersを見ると、Nexus7には、flo、deb、grouper及びtilapiaといった、複数の種類のdevicesが存在するようである。
他方で、Factory Images for Nexus Devicesでは、"nakasi"や"razor"といった分類方法もある。複数の分類方法を設けることに何の意味があるのだろうか、と疑問を持つのは果たして私だけだろうか?
(ツッコミ)そんな疑問を持つのはアンタだけや。

fastboot modeで確認する方法
Nexus7の電源を切り、Volume Downボタンを押しながらPowerボタンを押し下げて、Nexus7を起動する。すると、ドロイド君が横になっている画面が表示される。その画面の左下に小さい字でPRODUCT NAMEが表示されている。小さすぎて、読まれへんど!
虫眼鏡を使って読んで見ると、次のように書いてある。
PRODUCT NAME - grouper

Javaでコーディングする方法
次のとおりJavaでコーディングしてアプリを実行させる。
Log.d(TAG, "Build.DEVICE==" + Build.DEVICE);
Log.d(TAG, "Build.PRODUCT==" + Build.PRODUCT);
LogCatへの出力結果は次の通りである。
Build.DEVICE==grouper
Build.PRODUCT==nakasi

「PRODUCT」で出力される文字列が、出力する方法によって異なっている。むむむ!。
(ツッコミ)こういう用語に、製造事業者としての統一性を要求するのは難しいのだろうか。

(ボケた回答)
  1. もう、作ってもて、出荷してもたから、無理や!
  2. どうでも良いことだ。意味内容が理解できるので、問題にはならない。
  3. ハードウェアから見た名前と、ソフトウェアからみた名前であるので、違っていても問題にはならない。
  4. Buildクラスによる表示が正しい。このため、fastboot modeによる表示は、見られると恥ずかしいため、小さな文字にしました。
  5. 悔しかったら、自分で「PRODUCT」名を勝手に創作してみてください。
  6. Androidって、そんなもんです。受け入れてください。

2014年5月11日日曜日

Nexus7のAndroid versionを古いものに戻す

Nexus7のAndroid versionを古いものに戻す

開発環境: Windows 8 & Eclipse

実機のAndroidのversionを古いものに戻すことができれば、その古いversionでアプリの動作検証をすることができます。そういう意味で、実機を複数所持する必要が無くなります。Nexus7が開発者用端末であると呼ばれる由縁です。

Nexus 端末を出荷時の設定にリセットするに載っている手順は、利用者による設定やインストールしたアプリをリセットする手順であって、AndroidのversionをNexus7の新規購入時点のものに戻す手順ではなく、Androidのversionは変化しません。Nexus 7を他人に譲渡する時に実行する手順なのです。

下記に示す操作は、Windowsパソコンに例えると、Windowsパソコン購入時に添付されたリカバリ用のDVDを使って、Windowsパソコンを出荷時の設定にすることに似ています。なので、Nexus7のデータが全部消えてしまいますので、注意しましょう。

この操作にはAndroid SDKが必要であることを考えると、この操作はAndroid開発者が行うものであって、一般利用者が行うものでは無いと思われます。

古いバージョンに戻すとは言っても、Nexus7の新規購入時点のバージョンは機種依存しているため、そこに戻すことはできません。具体的にどのバージョンに戻せるのかはFactory Images for Nexus Devicesを参照してください。

手順
開発機とNexus7とをUSBコードでつなぐ等を行い、Android SDKのプログラムが動作する環境を整えておく。具体的には、例えば、EclipseのLogCatでNexus7の動作のログが表示できるようにしておく。環境を整えておくという意味なので、実際にEclipseを起動させておく必要は無い。

Factory Images for Nexus Devicesから、Factory Images "nakasi" for Nexus 7 (Wi-Fi) > 4.1.2 (JZO54K)を任意のフォルダーにdownloadする。
(参考)Nexus7の製造名を知る方法

解凍にはLhaca124を使えば良いでしょう、
ここではC:\nakasi-jzo54k\に解凍したものとします。

Windows8の場合、「Windowsシステムツール」の「コマンドプロンプト」をクリックして、「コマンドプロンプト」(黒い画面)を表示させる。
エクスプローラーでfastboot.exeファイルを1回クリックして、「パスのコピー」を実行します。fastboot.exeファイルはAndroid SDKフォルダーの下の\platform-tools\に有ります。
コピーした文字列を、Windowsの「メモ帳」に貼り付けて、(fastboot.exeの部分を除いた)パスの部分だけを「コピー」します。
「コマンドプロンプト」で次のとおり入力します。cdの次は半角スペースを入力します。cdはchange directoryという意味です。
cd 
「コマンドプロンプト」の左上端のアイコンをクリック > 編集 > 貼り付けによって、"cd "の後に、パスの文字列を貼り付けます。
そしてEnterキーを押します。
すると、プロンプトが、fastboot.exeファイルの存在するフォルダーに移動します。
念の為、この画面で、"fastboot"と入力&Enterして、fastbootが動くか確認します。

C:\nakasi-jzo54kフルダー内にimage-nakasi-jzo54k.zipファイルがありますが、このファイルは解凍しなくても良いです。下記のバッチファイルを見て分かるように、zipファイルを直接操作します。

バッチファイルの編集
"C:\nakasi-jzo54k\flash-all.bat"ファイルがありますので、そのファイルを「メモ帳」で開いて内容を編集します。「メモ帳」では改行がありませんが、HTML文書に貼り付けて見ると改行があるのがわかります。
下記の赤色で記した部分を書き込み、上書きします。

@ECHO OFF
:: Copyright 2012 The Android Open Source Project
::
:: Licensed under the Apache License, Version 2.0 (the "License");
:: you may not use this file except in compliance with the License.
:: You may obtain a copy of the License at
::
::      http://www.apache.org/licenses/LICENSE-2.0
::
:: Unless required by applicable law or agreed to in writing, software
:: distributed under the License is distributed on an "AS IS" BASIS,
:: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
:: See the License for the specific language governing permissions and
:: limitations under the License.

PATH=%PATH%;"%SYSTEMROOT%\System32"
fastboot erase boot
fastboot erase cache
fastboot erase recovery
fastboot erase system
fastboot erase userdata
fastboot flash bootloader C:\nakasi-jzo54k\bootloader-grouper-3.41.img
fastboot reboot-bootloader
ping -n 10 127.0.0.1 >nul
fastboot -w update C:\nakasi-jzo54k\image-nakasi-jzo54k.zip

echo Press any key to exit...
pause >nul
exit

次の手順でNexus7内のデータが全部消えるため注意しましょう。

Building for devicesを読んだところ、次のように書いてあります。
fastboot modeによる起動
まず、Nexus7の電源を切ります。
そして、Nexus7がfastboot modeを使えるようにするため、Nexus7のVolume Downボタンを押しながらPowerボタンを押し、Nexus7を起動します。fastboot modeにすると、端末をflashさせるbootloaderを使うことができるのです(意味不明)。

bootloaderのロック解除
デフォルトではbootloaderはロックされています。
Nexus7の端末がfastboot modeになっているのを確認したら、開発端末(Windowsパソコン)の「コマンドプロンプト」から次のとおり入力し、bootloaderのロックの解除をしてください。
fastboot oem unlock[Enter]

Unlock bootloader
Nexus7に「Unlock bootloader?」という画面が表示されます。Volume Upボタン又はVolume Downボタンを押し下げて、「Yes」の項目を選択し、Powerボタンを押します。
これによる「コマンドプロンプト」のログは次のとおりです。

C:\*\sdk\platform-tools>fastboot oem unlock[Enter]
...
(bootloader) erasing userdata...
(bootloader) erasing userdata done
(bootloader) erasing cache...
(bootloader) erasing cache done
(bootloader) unlocking...
(bootloader) Bootloader is unlocked now.
OKAY [349.022s]
finished. total time: 349.023s

バッチファイルの実行
Windowsパソコンの「コマンドプロンプト」から次のとおり入力してください。
C:\nakasi-jzo54k\flash-all.bat
これによる「コマンドプロンプト」のログは次のとおりです。

Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.
C:\*\sdk\platform-tools\
C:\*\sdk\platform-tools>C:\nakasi-jzo54k\flash-all.bat[Enter]
erasing 'boot'...
OKAY [  0.987s]
finished. total time: 0.987s
******** Did you mean to fastboot format this partition?
erasing 'cache'...
OKAY [  1.507s]
finished. total time: 1.508s
erasing 'recovery'...
OKAY [  0.934s]
finished. total time: 0.934s
******** Did you mean to fastboot format this partition?
erasing 'system'...
OKAY [  1.112s]
finished. total time: 1.113s
******** Did you mean to fastboot format this partition?
erasing 'userdata'...
OKAY [  7.059s]
finished. total time: 7.059s
sending 'bootloader' (2092 KB)...
OKAY [  0.289s]
writing 'bootloader'...
OKAY [ 10.257s]
finished. total time: 10.546s
rebooting into bootloader...
OKAY [  0.020s]
finished. total time: 0.021s
archive does not contain 'boot.sig'
archive does not contain 'recovery.sig'
archive does not contain 'system.sig'
--------------------------------------------
Bootloader Version...: 3.41
Baseband Version.....: N/A
Serial Number........: 015d25687c601206
--------------------------------------------
checking product...
OKAY [  0.040s]
checking version-bootloader...
OKAY [  0.024s]
sending 'boot' (4896 KB)...
OKAY [  0.651s]
writing 'boot'...
OKAY [  0.747s]
sending 'recovery' (5240 KB)...
OKAY [  0.701s]
writing 'recovery'...
OKAY [  0.678s]
erasing 'system'...
OKAY [  1.442s]
sending 'system' (446268 KB)...
OKAY [ 57.518s]
writing 'system'...
OKAY [ 33.915s]
erasing 'userdata'...
OKAY [  7.367s]
formatting 'userdata' partition...
Creating filesystem with parameters:
    Size: 6453985280
    Block size: 4096
    Blocks per group: 32768
    Inodes per group: 8048
    Inode size: 256
    Journal blocks: 24620
    Label:
    Blocks: 1575680
    Block groups: 49
    Reserved block group size: 391
Created filesystem with 11/394352 inodes and 52512/1575680 blocks
sending 'userdata' (102525 KB)...
writing 'userdata'...
OKAY [ 28.454s]
erasing 'cache'...
OKAY [  1.457s]
formatting 'cache' partition...
Creating filesystem with parameters:
    Size: 464519168
    Block size: 4096
    Blocks per group: 32768
    Inodes per group: 7088
    Inode size: 256
    Journal blocks: 1772
    Label:
    Blocks: 113408
    Block groups: 4
    Reserved block group size: 31
Created filesystem with 11/28352 inodes and 3654/113408 blocks
sending 'cache' (9052 KB)...
writing 'cache'...
OKAY [  3.828s]
rebooting...

finished. total time: 136.937s
Press any key to exit...

bootloaderのロック設定
Nexus7が起動し、画面には、Welcome画面が表示されますが、ロック設定を忘れてはいけないので、直ちに、電源を切ります。
そして、Nexus7のVolume Downボタンを押しながらPowerボタンを押し、Nexus7を起動します。ドロイド君が倒れている画面が表示されていることを確認します。
「コマンドプロンプト」から次のとおり入力し、bootloaderのロックをしてください。
fastboot oem lock[Enter]

これによる「コマンドプロンプト」のログは次のとおりです。
Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.
C:\*\sdk\platform-tools\
C:\*\sdk\platform-tools>fastboot oem lock[Enter]
...
(bootloader) Bootloader is locked now.
OKAY [ 10.495s]
finished. total time: 10.496s

Androidを起動する
ドロイド君が倒れている画面の右上にStartと表示されていることを確認して、Powerボタンを押します。
アカウント等の設定を済ませて、「設定」>「タブレット情報」>「Androidバージョン」を見ると「4.1.2」になっています。

2014年5月10日土曜日

♪programming 数え歌

♪programming 数え歌
ひとつ 人より バグがある
ふたつ 再び バグがある
みっつ 見つけた バグがある
よっつ よっぽど バグがある
いつつ いつもの バグがある
むっつ ムカツク バグがある
ななつ なつかしい バグがある
やっつ やっぱり バグがある
ここのつ ここにも バグがある
とうで とうとう 動かない
「とう」で、ようやく動かなくなるのであるから、堅牢で頑丈なのであろう。

2014年5月5日月曜日

Google Mobile Ads SDK

Google Mobile Ads SDK

開発環境:Eclipse

これまではAdMobについては、GoogleMobileAdsSdkAndroid.zip 6.4.1を使ってきましたが、もはや時代遅れとなってしまいました。Androidアプリは、August 1, 2014以降は、新規リリース版やアップデート版ではAdMob SDKを使えなくなってしまいます。

日本語による概要は次のとおり。
従来の「AdMob SDK」にいくつかの大幅な改良を加えた最新のバージョンを、「Google Mobile Ads SDK」と名称を変え、Google Play 開発者サービス 4.0 の一部としてご利用いただけます。
Google Mobile Ads SDK Downloadsの「Android (Google Play)」のタブを読みましょう。
すると、「Google Mobile Adsを読みなさい」とのことです。
これを読むと、「Set Up Google Play Services SDKを読め」と書いてあります。
すると、「Eclipseで、Window > Android SDK Managerをクリックして、Google Play servicesをインストールしなさい」と書いてあります。ので、そうしましょう。

また、Google Mobile Adsでは、「端末の次のフォルダーに、サンプルがあるので、使ってみなさい」とのことです。
<android-sdk>/extras/google-play-services/samples/ads
でも、実際に存在するのは、次の名前のフォルダーです。
\sdk\extras\google\google_play_services\samples\admob
むむむ!フォルダー名の付け方について、ドキュメントと実装とが異なりますが、正確性を要求するのは今は遠慮しておきましょう。
とにかく、このフォルダーをimportしましょう。とりあえず、この時点では、importするだけに留めておきます。そして、このimportしたサンプルを、この文書では「自分がこれから開発するアプリ」としておきます。

スタート ガイドを読みます。すると、「Set Up Google Play Services SDKを読め」と書いてあります。
そこには、次のように書いてあります。
If you are using Eclipse, import the library project into your workspace. Click File > Import, select Android > Existing Android Code into Workspace, and browse to the copy of the library project to import it.
この英語をメッチャ意訳すると、次のような感じです。
EclipseのPackage Explorerを使って、\sdk\extras\google\google_play_services\libproject\google-play-services_lib\フォルダーをimportしなさい。import先は、当然ながら、自分がこれから開発するアプリのプロジェクトが存在するworkspaceです。
そして、重要なのが、Package Explorerで、(このimportした)google-play-services_libプロジェクトを開いた状態にしておくということです。「Close Project」をしてはならないのです。物好きな人はClose Projectをしてみてください。そうすると、私が陥った罠に出会えます。
当然ながら、自分が開発するアプリのプロジェクトも開いた状態にしておきます。
(かつての)AdMob SDKであれば、自分のアプリのlibsフォルダーに.jarファイルをimportする方式だったのですが、Google Mobile Ads SDKの場合はlibsフォルダーを参照するのでは無く、google-play-services_libプロジェクトを参照する、という方式です。そういう意味で、libsフォルダーの中身は空っぽです。
なお、/libs/フォルダーにGoogleAdMobAdsSdk-6.4.1.jarファイルが存在する場合、それを削除してください。削除しない場合、エラーが発生します。
(このimportした)google-play-services_libプロジェクトを参照する手順は、スタート ガイドの「SDK の導入」の「1. Eclipse ワークスペースに Google Play 開発者サービス ライブラリ プロジェクトを追加、参照する」に書かれています。
これで、エラーを発生させることなくプロジェクトを再構築できるようになります。って、サンプルプロジェクトなので、当たり前じゃ!。
「当たり前じゃ!」と思うのは甘い。次のエラーが発生します。むむむ!
E/GooglePlayServicesUtil(11153): The Google Play services resources were not found. Check your project configuration to ensure that the resources are included.
「なんでや?サンプルやろが?」という疑問を持つのは、今は遠慮しておきましょう。
解決策はGoogle Mobile Ads SDK に関するよくある質問に書かれています。ただし、このページの最下端右端にある言語設定をEnglishに設定してください。日本語では解決策は書かれていません。むむむ!
解決策は次のとおりです。
I keep getting the error 'The Google Play services resources were not found. Check your project configuration to ensure that the resources are included.'
You can safely ignore this message. Your app will still fetch and serve banner ads.
とにかく、「無視すれば良い」ってことですね。って、「どこが解決策やねん」というツッコミを入れるのは、今は遠慮しておきましょう。
そして「なんで日本語版ではこの解決策は掲示されて無いねん」という疑問を持つのも、今は遠慮しておきましょう。


/GoogleAdsSampleActivity/res/values/strings.xml内に次の1行があります。
<string name="ad_unit_id">INSERT_YOUR_AD_UNIT_ID_HERE</string>
このINSERT_YOUR_AD_UNIT_ID_HEREの部分にユニット ID(AdMob パブリッシャー ID)を指定します。ユニット IDの形式は、ca-app-pub-XXXXXXXXXXXXXXXX/NNNNNNNNNN のような形式になります。


確認はしてませんが、google-play-services_libプロジェクトと、自分がこれから開発するアプリのプロジェクトにおけるandroid:minSdkVersionやandroid:targetSdkVersionは一致させておいた方が良いのかもしれません(知らんけど)。


提案的改良点
/GoogleAdsSampleActivity/res/layout/activity_banner_xml.xml内の
        ads:adSize="BANNER"を
        ads:adSize="SMART_BANNER"に変えた方が良いでしょう。


後は、サンプルプログラムを調べて、プログラムの仕方を学習していけばよろしゅうございます。


所感
Google Mobile Ads SDKの実装は、まるでパズルを解いているようだ。皆さん、楽しんでいますか?