GPSを有効にする

GPSを有効にするには?

今回、GPSを有効にするために上層の Android.mk に手を入れた。
デフォルトでlibを追加すると、ソースを要求してくるのでそれを回避するようにしてみた。
1.6 の lib の中身は全く分からないので何が起こっても自己責任で。
また、Froyoに含まれない 1.6 の init.rc にある service 類も起動するようにしておく事。

今回の修正はあちこち手を加えたので、結構面倒になっているので、元のファイルをコピーしておくようにする。
ソースの修正より、いかに make を通すかという問題だった。
./build/core/ 内の .mk ファイルは GPS 対応完了後元に戻しても良い。
今回は、修正ファイル、1.6からのファイル、追加ファイルと多いので記述に抜けがあるかもです。
その場合はお知らせいただけると幸いです。

修正ファイルと追加ファイル一覧と設定 ( ./ は$ANDROID_SRC に読み替える事 )
修正
./build/core/clear_vars.mk
./build/core/combo/TARGET_linux-arm.mk
./build/core/binary.mk 
./hardware/libhardware_legacy/gps/Android.mk
./hardware/libhardware_legacy/gps/gps.cpp
もしかすると、prelink-linux-arm.map の変更が必要になるかも。
./build/core/prelink-linux-arm.map 
修正内容は、下記修正箇所に詳細を書いている。
1.6の /system/lib/ より流用。適当なディレクトリに adb pull してから、
./out/target/product/generic/obj/lib にコピーする。
直接 $ANDROID_SRC/out/target/product/generic/obj/lib へ pull しても良いかもしれない。
makeするのに必要になる。
実機へのデプロイも必要だが、いままでの1.6に2.2を上書きする方法だと残っているはず。
1.6より
$ cp -v libgps* "$ANDROID_SRC/out/target/product/generic/obj/lib"
$ cp -v librpc.so "$ANDROID_SRC/out/target/product/generic/obj/lib"
$ cp -v libloc_api* "$ANDROID_SRC/out/target/product/generic/obj/lib"
$ cp -v libcommondefs.so "$ANDROID_SRC/out/target/product/generic/obj/lib"
ここまでで make できるようになる。
(上記の場合、make cleanすると消えるので注意の事。Android.mkの設定しだいでどこからでもリンクできるので好みであわせて欲しい)

実機へ追加
/system/etc/permissions/android.hardware.location.gps.xml

設定の変更
sqlite3を用いて、直接GPSの設定をスタンドアローンに変更する。

  • makeが完了したら、/system/lib (libhardware_legacy.so だけで良いかも?)とxmlファイルを転送後再起動する。(動かなかったら、APP、Framework、binも転送してみる…、途中 Superuser対応とか、マーケットに備えるとかしたので結構混乱中…。)
  • 最後に書いたpermissionを記述した、android.hardware.location.gps.xml を転送。
  • お好みのGPSアプリケーションをインストールしてテストしてみる。
  • 時刻を正確に合わせるために、ClockSyncを入れておくと測位が早くなるかも?
  • ClockSync を使うには Superuser を入れておくのがオススメ。


修正箇所
$ diff -u /froyo_clean/build/core/clear_vars.mk build/core/clear_vars.mk
--- /froyo_clean/build/core/clear_vars.mk	2010-12-31 04:46:12.279711490 +0900
+++ build/core/clear_vars.mk	2011-01-13 18:21:16.873508240 +0900
@@ -43,6 +43,7 @@
 LOCAL_C_INCLUDES:=
 LOCAL_LDFLAGS:=
 LOCAL_LDLIBS:=
+LOCAL_LDLIBS2:=
 LOCAL_AAPT_FLAGS:=
 LOCAL_SYSTEM_SHARED_LIBRARIES:=none
 LOCAL_PREBUILT_LIBS:=

$ diff -ubB /froyo_clean/build/core/combo/TARGET_linux-arm.mk build/core/combo/TARGET_linux-arm.mk
--- /froyo_clean/build/core/combo/TARGET_linux-arm.mk	2010-12-31 04:46:12.309974156 +0900
+++ build/core/combo/TARGET_linux-arm.mk	2011-01-13 17:31:39.658232654 +0900
@@ -225,7 +225,9 @@
 	$(PRIVATE_LDFLAGS) \
 	$(TARGET_GLOBAL_LDFLAGS) \
 	$(TARGET_FDO_LIB) \
-	$(TARGET_LIBGCC)
+	$(TARGET_LIBGCC) \
+	$(PRIVATE_LDLIBS2) 
+
 endef
 
 define transform-o-to-executable-inner

$ diff -ubB froyo_clean/build/core/binary.mk build/core/binary.mk
--- /froyo_clean/build/core/binary.mk	2010-12-31 04:46:12.279711490 +0900
+++ build/core/binary.mk	2011-01-13 17:31:00.315191459 +0900
@@ -414,6 +414,7 @@
 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_C_INCLUDES := $(LOCAL_C_INCLUDES)
 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_LDFLAGS := $(LOCAL_LDFLAGS)
 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_LDLIBS := $(LOCAL_LDLIBS)
+$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_LDLIBS2 := $(LOCAL_LDLIBS2)
 
 # this is really the way to get the files onto the command line instead
 # of using $^, because then LOCAL_ADDITIONAL_DEPENDENCIES doesn't work

いつもの事ながら、動きを見るためLOGを大量に入れたので削除しても構わない。
$ diff -ubB /froyo_clean/hardware/libhardware_legacy/gps/gps.cpp ./gps.cpp
--- /froyo_clean/hardware/libhardware_legacy/gps/gps.cpp	2010-12-31 04:49:23.870161896 +0900
+++ ./gps.cpp	2011-01-13 20:35:41.955134313 +0900
@@ -8,8 +8,8 @@
 static const GpsInterface*  sGpsInterface = NULL;
 
 static void
-gps_find_hardware( void )
-{
+gps_find_hardware( void ) {
+LOGD("gps: %s() in..." , __FUNCTION__ );
 #ifdef HAVE_QEMU_GPS_HARDWARE
     if (qemu_check()) {
         sGpsInterface = gps_get_qemu_interface();
@@ -22,6 +22,7 @@
 
 #ifdef HAVE_GPS_HARDWARE
     sGpsInterface = gps_get_hardware_interface();
+    LOGD("gps: %s(): gps_get_hardware_interface()" , __FUNCTION__ );
 #endif
     if (!sGpsInterface)
         LOGD("no GPS hardware on this device\n");
@@ -30,8 +31,11 @@
 const GpsInterface*
 gps_get_interface()
 {
+LOGD("gps: %s() in..." , __FUNCTION__ );
     if (sGpsInterface == NULL)
          gps_find_hardware();
 
+LOGD("gps: %s(): gps_get_hardware_interface()" , __FUNCTION__ );
+
    return sGpsInterface;
}

$ diff -ubB /froyo_clean/hardware/libhardware_legacy/gps/Android.mk ./Android.mk
--- /froyo_clean/hardware/libhardware_legacy/gps/Android.mk	2010-12-31 04:49:23.870161896 +0900
+++ ./Android.mk	2011-01-13 20:36:45.073265304 +0900
@@ -1,8 +1,9 @@
 # Use hardware GPS implementation if available.
 #
+BOARD_GPS_LIBRARIES := libgps
 ifneq ($(BOARD_GPS_LIBRARIES),)
   LOCAL_CFLAGS           += -DHAVE_GPS_HARDWARE
-  LOCAL_SHARED_LIBRARIES += $(BOARD_GPS_LIBRARIES)
+  LOCAL_LDLIBS2 := -lloc_api -lrpc
 endif
 
 # Use emulator GPS implementation if QEMU_HARDWARE is set.


以下に書いた android.hardware.location.gps.xml を実機に転送する。
$ adb push android.hardware.location.gps.xml /system/etc/permissions/
$ adb shell chmod 644 /system/etc/permissions/android.hardware.location.gps.xml
/system/etc/permissions/android.hardware.location.gps.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2009 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.
-->

<!-- These are the location-related features for devices that include GPS. -->
<permissions>
    <feature name="android.hardware.location" />
    <feature name="android.hardware.location.network" />
    <feature name="android.hardware.location.gps" />
</permissions>

GPSの設定を stand-alone にする。
$ adb shell
したあと、実機で行う。
# cd /data/data/com.android.providers.settings/databases/
# sqlite3 settings.db
sqlite> select * from secure;
(省略)
sqlite> update secure set value=0 where name='assisted_gps_enabled';
sqlite> select * from secure;
(省略、assisted_gps_enabled の項目が 0 になっていればok)
sqlite> .exit
#

prelink-linux-arm.map 及び linker 問題
もし動かなかったら、下記 prelink-linux-arm.map に変更してみると良いかもしれない。
現状、linker のソースを全部見ていないので理解が追いついていません。
とりあえず、表層上新旧libが混じってもうごくかも?な対応をしてみている。
ふと気づいたのだが、librpc.so のアドレスがずれている様な気が…
0x5*以下のアドレス調整が必要かもしれない、ここに来て影響が出てくるとは…。
0x6* は矛盾がないようにしたつもり。
libgps はコメントアウトすること。全アドレスが変更になっているので、patchではなく全テキスト掲載です。
本変更を行う場合は、変更を行った後、make clean してから make するようにして下さい。
また、make 中にエラーが出た際はツイッターかコメントでお知らせいただければ幸いです。

この問題が他の機能、多岐にわたる問題になりそうだったら別ページに移動させる予定。
アドレスに不具合を見つけられたら、コメントいただけると幸いです。

./build/core/prelink-linux-arm.map
libdl.so            0x6FF00000
libc.so            0x6FE00000
libstdc++.so            0x6FD00000
libm.so            0x6FC00000
liblog.so            0x6FBC0000
libcutils.so            0x6FB00000
libthread_db.so            0x6FA00000
libz.so            0x6F900000
libssl.so            0x6F700000
libcrypto.so            0x6F500000
libsysutils.so            0x6F400000
libgraphicseditor.so            0x6F300000
libbluedroid.so            0x6EA00000
libdbus.so            0x6E800000
libril.so            0x6E400000
libreference-ril.so            0x6E000000
libwpa_client.so            0x6DC00000
libnetutils.so            0x6DB00000
libandroid_servers.so            0x6D900000
libicuuc.so            0x6D500000
libicui18n.so            0x6D400000
libandroid_runtime.so            0x6D300000
libnativehelper.so            0x6D200000
libdvm.so            0x6D000000
libpixelflinger.so            0x6CF00000
libcorecg.so            0x6CE00000
libsurfaceflinger.so            0x6CD00000
libagl.so            0x6CC00000
libGLESv1_CM.so            0x6CB00000
libEGL.so            0x6C700000
libexif.so            0x6C500000
libui.so            0x6C400000
libsgl.so            0x6C000000
libaudio.so            0x6B700000
libsonivox.so            0x6B600000
libsoundpool.so            0x6B500000
libvorbisidec.so            0x6B400000
libmedia_jni.so            0x6B300000
libmediaplayerservice.so            0x6B280000
libmedia.so            0x6B200000
libFFTEm.so            0x6B100000
libaudioflinger.so            0x6B000000
libsqlite.so            0x6AC00000
libexpat.so            0x6AB00000
libwebcore.so            0x6A000000
libutils.so            0x69D00000
libcameraservice.so            0x69C80000
libhardware.so            0x69C70000
libhardware_legacy.so            0x69C00000
libsystem_server.so            0x69A00000
libcamera.so            0x69680000
libqcamera.so            0x69400000
libcamerarecognition.so            0x69180000
libcamerasupport.so            0x69000000
libcameraocr.so            0x68B00000
libfacesolid.so            0x68A00000
libphotosolid.so            0x68800000
libphotoscouter.so            0x68600000
libopencore_author.so            0x67800000
libopencore_player.so            0x67000000
libopencorehw.so            0x66F50000
libevent.so            0x66100000
libopencore_common.so            0x66000000

# new lib start -------------------------------
liba2dp.so            0x65F00000
input.so            0x65E00000
libbluetoothd.so            0x65D00000
libbluetooth.so            0x65C00000
libdvm-ARM.so            0x65B00000
libGLES_android.so            0x65A00000
libGLESv2.so            0x65900000
libOpenVG_CM.so            0x65800000
libOpenVGU_CM.so            0x65700000
libETC1.so            0x65600000
libacc.so            0x65500000
libcamera_client.so            0x65400000
libskia.so            0x65200000
librs_jni.so            0x65100000
libRS.so            0x65000000
libjnigraphics.so            0x64F00000
libskiagl.so            0x64E00000
libFLAC.so            0x64D00000
libSR_AudioIn.so            0x64A00000
libime.so            0x64900000
#libgps.so            0x64800000
libpvasf.so            0x64700000
libpvasfreg.so            0x64600000
libomx_sharedlibrary.so            0x64500000
libopencore_download.so            0x64400000
libopencore_downloadreg.so            0x64300000
libomx_aacdec_sharedlibrary.so            0x64200000
libomx_amrdec_sharedlibrary.so            0x64100000
libstagefright.so            0x64000000
libgsl.so            0x63F00000
libhtc_acoustic.so            0x63E00000
libhtc_ril.so            0x63D00000
liblvmxipc.so            0x63C00000
libreference-cdma-sms.so            0x63B00000
libspeech.so            0x63A00000
liboemcamera.so            0x63900000
libdiskconfig.so            0x63800000
libemoji.so            0x63700000
libjni_latinime.so            0x63600000
libjni_pinyinime.so            0x63500000
libttssynthproxy.so            0x63400000
libttspico.so            0x63300000
libopencore_net_support.so            0x63200000
libopencore_rtsp.so            0x63100000
libopencore_rtspreg.so            0x63000000
libomx_amrenc_sharedlibrary.so            0x62F00000
libomx_avcdec_sharedlibrary.so            0x62E00000
libomx_avcenc_sharedlibrary.so            0x62D00000
libomx_m4vdec_sharedlibrary.so            0x62C00000
libomx_m4venc_sharedlibrary.so            0x62B00000
libomx_mp3dec_sharedlibrary.so            0x62A00000
libopencore_mp4local.so            0x62900000
libopencore_mp4localreg.so            0x62800000
libmm-adspsvc.so            0x62700000
libOmxCore.so            0x62600000
libOmxMpeg4Dec.so            0x62500000
libOmxH264Dec.so            0x62400000
libOmxVidEnc.so            0x62300000
libOmxVdec.so            0x62200000
libmm-omxcore.so            0x62100000
libqcomm_omx.so            0x62000000
libstagefright_amrnb_common.so            0x61F00000
libstagefright_avc_common.so            0x61E00000
libstagefright_color_conversion.so            0x61D00000
libstagefright_omx.so            0x61C00000
libstagefrighthw.so            0x61B00000
libbinder.so            0x61A00000
libsurfaceflinger_client.so      0x61900000

###########
# libraries for specific apps or temporary libraries
libcam_ipl.so           0x5F000000 # [???]
libwbxml.so             0x5EF00000 # [???]
libwbxml_jni.so         0x5EE00000 # [~1M]
libxml2wbxml.so         0x5EB00000 # [~1M]
libdrm1.so              0x5EA00000 # [~1M]
libdrm1_jni.so          0x5E900000 # [<64K]
libwapcore.so           0x5E800000 # [???]
libstreetview.so        0x5E700000 # [???]
libwapbrowsertest.so    0x5E600000 # [???]
libminiglobe.so         0x5E500000 # [???]
libearth.so             0x5E400000 # [???]
libembunit.so           0x5E300000 # [<64K]
libneon.so              0x5E200000 # [???]
libjni_example.so       0x5E100000 # [???]
libjni_load_test.so     0x5E000000 # [???]
libjni_lib_test.so      0x5DF00000 # [???]
librunperf.so           0x5DE00000 # [???]
libctest.so             0x5DD00000 # [<64K]
libUAPI_jni.so          0x5DC00000 # [???]
librpc.so               0x5DB00000 # [~1M]
libtrace_test.so        0x5DA00000 # [???]
libsrec_jni.so          0x5D800000 # [~2M]
libjpeg.so              0x5D700000 # [~1M]
libiprouteutil.so       0x5D600000 # [~1M] for external/iproute2
libnetlink.so           0x5D500000 # [<64K] for external/iproute2
libpagemap.so           0x5D400000 # [<64K] for system/extras/libpagemap
libstlport.so           0x5D100000 # [~3M] for external/stlport
libzxing.so             0x5D000000 # [<64K] for goggles
libinterstitial.so      0x5CF00000 # [<64K] for goggles
liblept.so              0x5CA00000 # [~5M] for external/leptonica


以上

makeが通らない、動かない、より良い方法などありましたらコメント頂けると幸いです。
コメント
  • >libgps はコメントアウトすること。
    prelinkなlibは通常のSharedLibからaprioriで変換するして生成する様なので、コメントアウトするよりprelinkなlibに変換する方が良いかも知れません。
    -- (fi01) 2011-01-19 00:04:42
  • fi01さんありがとうございます。
    今回、端末からlibをpullしたので libgps を prelink に
    してもよいかもしれませんね。

    当初、pullせずに、端末内で旧libなどをコピーして動くようにしていたので
    調べていませんでした。
    apriori でprelink な lib に変換していたんですね。
    もうちょっと、apriori を見てみないといけないかもです。
    apriori を引数無しで実行すると help が出ていましたが、
    まだ全く見ていませんでした。 -- (is01rebuild) 2011-01-19 00:45:01
名前:
コメント:

すべてのコメントを見る









(2011/01/16 1:00 公開)
最終更新:2011年01月19日 00:50
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。