2015年1月30日金曜日

「パッケージファイルに正しく署名されていません」にハマった

署名したapkをPlayストアにアップしたら、一部の端末で
「パッケージファイルに正しく署名されていません」が表示され、インストール不可の状態になった。


開発環境

Android Studio : 1.0.1
Ubuntu : 14.04
Java : OpenJDK1.7.0_65

原因

jarsignerの署名方式のデフォルト値がJDK6までとJDK7以降で変更されているようです。
そのため、コマンド実行でJDK7を使用して署名を行ったため「パッケージファイルに正しく署名されていません」と表示される端末が発生しました。

参考:
JDK7でAndroidアプリをリリースビルドする方法
Androidアプリをリリースしたら「パッケージファイルに正しく署名されていません」と表示されて焦ったでござる

解決方法

build.gradleに署名用の記述追加(OpenJDK1.7.0_65のままで大丈夫でした)
参考:AndroidStudio で APK の署名の設定を gradle.properties に記述する

gradle.propertiesに署名関連の設定を記述することで、
gitignoreでgradle.propertiesをgit管理の対象外にすると、署名ファイルのパスワードなどをアップせずに済むので、とても良いです。

gradle.propertiesに記述する
storeFile=/path/to/your.keystore

は、キーストアファイルのある場所が、/home/ysakaguchi/android/release/android.keystoreなら
storeFile=/android/release/android.keystore
となります。

確認方法

deploygateに修正したapkをアップして、JDK7のデフォルト署名方式だとうまくインストールできなかった端末で、再度インストールを試みたところうまくいくことも、先に確認できました。
「パッケージファイルに正しく署名されていません」が発生する端末は、どれなのかまでは絞れてないですが、SHARP端末はなるっぽい?かもです。
手元にIS05があったので、本件の現象が再現できました。
Xperiaは署名方式が違ってもダウンロードできていました。


ちなみに今回の件が分かったアプリはこちらになります↓

2015年1月15日木曜日

appcompat-v7:21.0.3を追加したら、Attribute定義の競合エラーが発生し、ハマった

compile 'com.android.support:appcompat-v7:21.0.3’を追加したら、以下のエラーが出た


Error:Attribute "track" has already been defined
Error:Attribute "thumbTextPadding" has already been defined
Error:Attribute "switchTextAppearance" has already been defined
Error:Attribute "switchMinWidth" has already been defined
Error:Attribute "switchPadding" has already been defined
Error:Attribute "switchStyle" has already been defined
Error:Attribute "theme" has already been defined


原因

appcompat-v7のバージョン21以降で定義されているAttributeの名称と、
org.jraf:android-switch-backport(バージョン1.3.1)や
com.google.android.gms:play-services(バージョン4.4.52)で
定義されているAttributeの名称が競合しているため


対応手順

  1. org.jraf:android-switch-backportのバージョンを1.3.1→1.4.0にアップ
  2. com.google.android.gms:play-servicesのバージョンを4.4.52→6.1.71にアップ(6.1.+ならOK)
  3. compile 'com.android.support:appcompat-v7:21.0.3’を追加



1.org.jraf:android-switch-backportのバージョンを1.3.1→1.4.0にアップ

repositories {
    jcenter()
}
 (...)
dependencies {
    compile 'org.jraf:android-switch-backport:1.4.0'
}

※buld.gradleのrepositoriesにjcenter()の追加も必要


build.gradleの記述を変更し、gradleのSyncを行うと
No resource found that matches the given name: attr 'switchStyle'.
など、Attributeが定義されていません、とエラーが出るので、
エラーが発生している箇所に、"asb_"を追加する
(Attributeの定義名が変更されているので、使用箇所を変更)


<style name="MyTheme" parent="android:Theme.Holo.Light">
        <item name="switchStyle">@style/MySwitch</item>
</style>
<style name="MySwitch" parent="@style/Widget.Holo.Light.CompoundButton.Switch">
        <item name="track">@drawable/switch_track_holo_light</item>
        <item name="thumb">@drawable/switch_inner_holo_light</item>
        <item name="switchTextAppearance">@style/common_switchTextAppearance</item>
        <item name="switchMinWidth">0dip</item>
</style>
<style name="MyTheme" parent="android:Theme.Holo.Light">
        <item name="asb_switchStyle">@style/MySwitch</item>
</style>
<style name="MySwitch" parent="@style/Widget.Holo.Light.CompoundButton.Switch">
        <item name="asb_track">@drawable/switch_track_holo_light</item>
        <item name="asb_thumb">@drawable/switch_inner_holo_light</item>
        <item name="asb_switchTextAppearance">@style/common_switchTextAppearance</item>
        <item name="asb_switchMinWidth">0dip</item>
</style>



2.com.google.android.gms:play-servicesのバージョンを4.4.52→6.1.71にアップ

dependencies {

compile 'com.google.android.gms:play-services:6.1.71'

}
バージョン6.1以降ならOKです。参考



3.compile 'com.android.support:appcompat-v7:21.0.3’を追加

dependencies {

compile 'com.android.support:appcompat-v7:21.0.3’

}


以上で、エラーが解決できました。

2015年1月8日木曜日

Nexus端末を手動でAndroid5.0にアップデート

今回は、Nexus 5(Android 4.4.4)を手動でAndroid5.0にアップデートしました。
他のNexus機でも、対応するOTAファイルをダウンロードして対処になります。

【Android端末】
Androidバージョン4.4.4
ビルド番号:KTU84P

【PC】
Mac OS X 10.9.5

主なアップデート手順の流れ

  1. OTAファイルをダウンロード
  2. Nexus 5のブートローダーを起動し、リカバリーモードへ
  3. OTAファイルをADBコマンド経由でNexus 5にインストール
  4. OTAファイルのインストールが完了したら、”reboot system now”で再起動




アップデート手順と詳細

1. OTAファイルをダウンロード

今回は、Nexus 5のAndroid 4.4.4(KTU84P)をAndroid 5.0(LRX21O)にアップデートするため、Nexus 5(KTU84P)用のOTAファイルをダウンロードします。

ビルド番号が「KTU84P」のNexus 5のひとは、ここからダウンロード

他のビルド番号のNexus 5や他Nexus端末のOTAデータはここから探してダウンロード

2. Nexus 5のブートローダーを起動し、リカバリーモードへ

ブートローダーの起動

  • Nexus 5をシャットダウン
  • 電源ボタンとボリュームダウンボタンを数秒同時に押したままにする

(ボタン操作でブートローダーが起動しない場合、端末を起動し、PC側で"adb reboot bootloader”とADBコマンドを実行する)

ドロイド君が仰向けに倒れている画像が表示されれば、ブートローダー起動完了

リカバリーモードの起動

  • ブートローダーの画面でボリュームダウンボタンを数回押して「Recovery mode」を選択
  • 「Recovery mode」を選択した状態で電源ボタンを押すと、リカバリーモードが起動する


「コマンドが指定されていません。」のメッセージと仰向けに倒れてるドロイド君の上に赤いトライアングルのアイコンがある画像が表示されたら、
リカバリーモードの起動完了

3. OTAファイルをADBコマンド経由でNexus 5にインストール

  • (Nexus 5側)ボリュームアップボタンと電源ボタンを同時に押してリカバリーメニューを表示
  • Nexus 5とPCをUSBケーブルで接続
  • (Nexus 5側)ボリュームボタンを操作し、リカバリーメニューの”apply update from ADB”にカーソルを合わせ、電源ボタンを押す
  • (Nexus 5側)"Now send the package you want to apply to the device with "dab side load <filename>”...”の表示を確認
  • (PC側)ターミナル(Windowsならコマンドプロンプト)で"adb sideload (手順1でダウンロードしたzipファイル)"とADBコマンドを実行

今回は
adb sideload /Users/username/Downloads/c1a33561be84a8a6a7d5a4c8e3463c4db9352ce6.signed-hammerhead-LRX21O-from-KTU84P.c1a33561.zip
と実行しました。
  • (Nexus 5側)"sending: 'sideload’ "が100%になったあとの端末側の自動アップロードが、完了するまで待機


4. OTAファイルのインストールが完了したら、“reboot system now”で再起動

  • (Nexus 5側)"install from ADB complete”と表示されたら自動アップロードの完了
  • (Nexus 5側)ボリュームボタンを操作し、"reboot system now”にカーソルを合わせて電源ボタンを押すと、再起動開始



以上で、4.4.4のNexus 5を手動で5.0にする手順は完了です。

端末の起動が完了すると、通常のOSアップデートするときに毎度みる、アップグレード中のダイアログが表示されます。
アップグレードが完了すると、5.0が操作可能になります。

ちなみに、起動後すぐ「設定」>「端末情報」>「システムアップデート」で、5.0→5.0.1にアップデート出来ました。