アプリをアップデート版で更新すると、soライブラリが配置されない

1,562 views
Skip to first unread message

大田豪

unread,
Jun 25, 2013, 12:09:48 AM6/25/13
to android-g...@googlegroups.com
大田と申します。はじめて質問させていただきます。

業務でAndroidアプリを提供しており、現在アプリのUpdate版の評価を行っております。
アプリはC++で作成したライブラリを使用しております。

この度いくつかの機種でUpdate後にsoライブラリが見つからずエラーが発生する事象に遭遇し困っております。
【手順】
version1のアプリをGooglePlayからインストール。
version2のアプリをadb installでアップデート。アプリを起動する。

----<error>------------------------------------------------------------------------------------------------------------------
W/System.err(25890): java.lang.ExceptionInInitializerError
W/System.err(25890):     at android.navi.ui.mainmap.LoadingActivity$2.run(LoadingActivity.java:695)
W/System.err(25890): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load naviSys: findLibrary returned null
W/System.err(25890):     at java.lang.Runtime.loadLibrary(Runtime.java:365)
W/System.err(25890):     at java.lang.System.loadLibrary(System.java:535)
W/System.err(25890):     at android.navi.pubHead.NaviCore.<clinit>(NaviCore.java:3766)
W/System.err(25890):     ... 1 more
----------------------------------------------------------------------------------------------------------------------------------

事象を以下に整理します。
(1) 事象が発生する確認済み端末は下記のとおり
・GalaxyS3 (SC 06D : OS 4.1.2) : 最近OS アップデート。OS 4.0.xでは発生しない
・HTC J butterfly (HTL21 : OS 4.1.1)

(2) 下記端末では発生しない
・XPeria Z (OS 4.1.2)
・SC-02E (OS 4.1.2)
・Nexus 7(OS 4.2.2)

(3) adb installや、端末でAPKファイルを直接インストールした場合、soライブラリは通常下記のパスに配置されるようです。(※) xxxx:アプリ名、yyyy:ライブラリ名
/data/data/xxxx/lib/yyyy.so
※Nexus7のみ /data/app-lib/xxxx-1/yyyy.so

(4) version1をGoogle Playからインストールした場合、soライブラリは(どの端末でも必ず)下記のバスに配置されます。
/mnt/asec/xxxx-1/lib/yyyy.xo

(5) 今回の事象は、(1)の端末を使用して、version1をGooglePlayからインストールし、version2をadb installした時のみ発生します。
※ (1)の端末でも、version1をadb install でインストールし、version2をadb installした時には発生しません。
※ また、Galaxy S3でもOSアップデート前(OS 4.0.4)では発生しません

【気になっている点】
(5)で、version1をadb installでインストールした場合は(3)のパスにsoライブラリが配置され、GooglePlayからインストールした場合は
(4)のパスに配置されることが気になっています。

また、adb install同士では異常終了しないことから、もしかしたらGooglePlay経由同士でも事象は発生しないかもしれないと思っています。
version2をGooglePlayにUpしてアップデートを確認すればどうなるかはわかると思うのですが、最悪アプリが異常終了してしまうため怖くて公開できません。

本事象についてご存知の方がいらっしゃいましたら、何卒ご教示いただけますようよろしくお願いします。

Koutarou Tanaka

unread,
Jun 25, 2013, 12:25:11 AM6/25/13
to android-g...@googlegroups.com
たなかと申します。

推測でしかありませんが、adb install -rではどうでしょう?
> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com にメールを送信します。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
> その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>
>

大田豪

unread,
Jun 25, 2013, 1:00:12 AM6/25/13
to android-g...@googlegroups.com
たなか 様

ご返信ありがとうございます。
adb install -r を早速試してみました。
結果は残念ながらadb installの場合と同じく、soライブラリが見つからない状態となりました。

念のため、手順を以下に記します。
端末 GalaxyS3 (OS 4.1.2)
1) Google Playより、version1を新規でインストール → soライブラリは [/mnt/asec/xxxx-1/lib/yyyy.so] に配置されていることを確認
------ adb shell でsoライブラリを確認 -------------------------------------------------------------------------
shell@android:/ $ ls -alF /data/data/xxxx/lib
ls -alF /data/data/xxxx/lib
lrwxrwxrwx system   system            2013-06-25 13:44 lib -> /mnt/asec/xxxx-1/lib
----------------------------------------------------------------------------------------------------------------------------

2) version2 をadb install -r でUpdate → soライブラリが確認できず
------ adb shell でsoライブラリを確認 -------------------------------------------------------------------------
shell@android:/ $ ls -alF /data/data/xxxx/lib
ls -alF /data/data/xxxx/lib
opendir failed, Permission denied
---------------------------------------------------------------------------------------------------------------------------

root取得しておりませんので、/data/data/* 配下のディレクトリ構成はわからないのですが、おそらくyyyy.soが無いと思われます。

Hiroshi SAKURAI

unread,
Jun 25, 2013, 1:18:30 AM6/25/13
to android-g...@googlegroups.com
桜井と申します。

4.1.1の端末では、copy protectionをONにしていたアプリがインストールされている状態で
copy protectionをOFFにしたアプリをインストールすると、.soが見つからないというエラーがでます。

回避方法は、一度アプリをアンインストールしてもらうしかありません。

参考:
https://code.google.com/p/android/issues/detail?id=46074&q=java.lang.UnsatisfiedLinkError%3A&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars#makechangeshttps://code.google.com/p/android/issues/detail?id=35962
https://code.google.com/p/android/issues/detail?id=34880


> version2をGooglePlayにUpしてアップデートを確認すればどうなるかはわかると思うのですが、最悪アプリが異常終了してしまうため怖くて公開できません。

新しいDeveloper Consoleのalpha/beta公開の機能を使えば、試すことができます。

Hiroshi SAKURAI





2013/6/25 大田豪 <g.oht...@gmail.com>:

大田豪

unread,
Jun 25, 2013, 2:35:04 AM6/25/13
to android-g...@googlegroups.com
桜井 様

貴重な情報、誠にありがとうございます。
ご教授いただいたURLの内容をこれから確認いたします。
進展がございましたら改めて返信させていただきます。まずは、お礼までに。


2013年6月25日火曜日 14時18分30秒 UTC+9 an.oli...@gmail.com:
> このグループから退会し、メールの受信を停止するには、android-group-japan+unsubscribe@googlegroups.com
> にメールを送信します。
> このグループに投稿するには、android-group-ja...@googlegroups.com にメールを送信してください。

大田豪

unread,
Jun 25, 2013, 11:36:09 PM6/25/13
to android-g...@googlegroups.com
本件、解決しましたので下記のとおりご報告いたします。

【概要】
Googel Developer Consoleで、version2のAPKをα版として登録し、Google Play経由でUpdateを行うと異常終了は発生しませんでした。

【詳細】
手順1 : Googel Playからversion1を新規インストール
手順2 : version2をα版公開し、テストユーザとしてGoogle Playからversion2でUpdate更新
結果、soライブラリは下記ディレクトリに正常に配置され、アプリ正常起動ができました。
/mnt/asec/xxxx-1/lib/yyyy.so   (※) xxxx:アプリ名、yyyy:ライブラリ名

※事象が発生した下記端末で正常動作を確認

・GalaxyS3 (SC 06D : OS 4.1.2)
・HTC J butterfly (HTL21 : OS 4.1.1)

本問題はJNI(native libraries)を使用しているアプリをGooglePlayからインストールし、adb installのようにapkから直接Updateした場合、
且つ、一部のAndroid 4.1系端末でのみ発生するようです。

もしかしたら、桜井様にご指摘いただいたcopy protectionの問題の他に、
下記が関連しているかもしれません。(確証はありませんが。。)
『グーグル、「Google Play」を介さないアプリのアップデートを禁止』
http://japan.cnet.com/news/sec/35031441/

今後、アプリのアップデートの確認は必ずα版/ベータ版登録して評価を行うように心がけます。
この度はとても参考になる情報をありがとうございました。

今後ともよろしくお願いします。
Reply all
Reply to author
Forward
0 new messages