Categories
Android

解决android 2.2 market搜索结果偏少的问题

那是很久很久以前的事了,大概花了两个星期去折腾,整理整理,与朋友们分享一下。

我们开始移植到 2.2时,market运行很好,过一段时间测试组提出bug。问题现象:Android market 搜素记录严重偏少,比如搜索 qq,在我们的broncho a1上,只有1条记录。

首先,确定apk包是没有问题的。同样的包安装在G1上,可以找到300多条记录。此外,特意让上海龙旗的一位网友看了他们公司的手机,说可以搜索到25条qq记录,他们的分辨率是 800 * 600, 我们的是480 * 320。他把apk包发给我,在我们机器上还是同样的结果。

其次,在javaeye上,有网友说跟机器有 root权限有关,他发布一款软件到market上,他的机器是root权限,搜索不到他刚发布的程序,改为普通用户后,就可以了。这有可能,因为我们的机器一直是root权限,重新编译kernel,改为普通用户,还是不行。

后来有人说,跟market上设置的protected权限有关。我为此还花了25$注册 market开发者,写个小程序放上去,关闭权限,结果还是没有生效。

解决问题最好的方法是找差异。为此,getprop 获取G1系统参数做比较,还是没有找到有异常嫌疑之处。gpps包是从cm上获取的,我们没有通过正规的渠道拿到,怀疑是跟授权有关,如果真的是这样,那就没办法了,不过,上海龙旗既然可以搜索到25条记录,我想应该跟这没关系。

用 tcpdump与 wireshark 工具观察 market请求发出的数据包找出url,那是一串经过序列化然后再经过base64加密后的字符串。有开源的 android market api,基于protobuf协议,之前也是运行好好的,最近就不行了。翻遍它的 google groups,说什么帐号跟手机的deviceId挂钩了,我重新注册个gmail帐号,还是一样。又有说根据ip来源,返回不同的搜索结果。我干脆把程序放在美国的服务器上跑,还是没成功。

绝望,绝望!!! 一个android手机,如果电子市场不能使用,那简直是暗淡无光。

正值网络上爆出android暗含高达40% 的扣费短信。wusong童鞋无聊给我发个帖子链接《近期 Android 平台扣费软件检测的分析心得与思路分享》,说是如何扫描apk包含扣费短信的,文章中说通过反编译apk,插入 Log.v 打印出非法信息。灵光一闪,既然我无法全部理解那长长的url,那何不如让它自己打印出自己的信息呢?

修改ProtoBuf里的insertObject函数,添加Object toString()打印对象,如果是vector,就遍历打印。

结果发现,我们只有这个信息:

1222 insertObject: W tag=10 index=0com.google.android.feature.GOOGLE_BUILD

相应的g1的有很多信息,经查询, 问题出现在 FeatureInfo[] systemAvailableFeatures =
packageManager.getSystemAvailableFeatures(); 这个函数。

运行时,PackageManagerService.java 从 /system/etc/permissions/ 下所有
的文件读取 features/permissions。这个目录下,我们只有一个features.xml, 而这个文件还是从gapps里拷贝过来的。
所以,应该把以下文件

frameworks/base/data/etc:
android.hardware.camera.autofocus.xml
android.hardware.location.gps.xml
android.hardware.telephony.gsm.xml
android.hardware.touchscreen.multitouch.xml
android.hardware.wifi.xml
handheld_core_hardware.xml

生成image时拷贝到

/system/etc/permissions/

如果是cdma,
请把 android.hardware.telephony.gsm.xml
替换为
android.hardware.telephony.cdma.xml

测试,OK。

我把问题解决后,才发现一下别人的帖子:
APAD IMX515 安装 Android Market 方法

Working Android market and all google app (for 2.2)

问题解决后再回顾:

1. 如果我早用 Quick system info 这个工具,会很快找到问题,这个工具可以显示 system availabe features信息,两机器都同时安装,跟G1一对比,一目了然。

2. 如果把 market的数据清空,再抓数据包,在 base64 decode,虽然不能看出所有的含义,但至少也看到 xxx.xx.xx 这样可显示的字符串,也可以尽快找出问题。market 手机系统信息,是第一次运行时才收集,后面的url请求只需要从cache里获取系统信息即可。

3. DeviceConfiguration.java 有 toString(),注入调试信息也可以显示出来。

4. 仔细阅读官方文件 http://developer.android.com/guide/appendix/market-filters.html, 有提到getSystemAvailableFeatures()这个函数.

Categories
他山之石

Hardening guide for VSFTPD on RHEL 5.4

The guide bellow instruct how to install, configure and secure FTP server called VSFTP, based on RHEL 5.4, enabling only SFTP access to the server.

Installation phase

1. Login to the server using Root account.
2. Install from the RHEL 5.4 DVD the following RPM:
rpm -ivh vsftpd-2.0.5-16.el5.i386.rpm
3. Create a group for FTP users:
groupadd ftp-users
4. Create folder for the FTP:
mkdir -p /ftp
5. Change ownership and permissions on the FTP folder:
chown root:ftp-users /ftp
chmod 777 -R /ftp
6. Example of user creation:
useradd -g ftp-users -d /ftp user1
passwd user1
7. Edit using VI, the file /etc/vsftpd/vsftpd.conf
Change from:
anonymous_enable=YESTo:
anonymous_enable=NO

Change from:
xferlog_std_format=YESTo:
xferlog_std_format=NO

Change from:
#tftpd_banner=Welcome to blah FTP service.To:
tftpd_banner=Secure FTP server

Add the lines bellow:
local_root=/ftp
userlist_file=/etc/vsftpd/user_list
userlist_deny=NO
vsftpd_log_file=/var/log/vsftpd.log
ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
ssl_ciphers=ALL:-ADH:+HIGH:+MEDIUM:-LOW:-SSLv2:-EXP
rsa_cert_file=/etc/vsftpd/vsftpd.pem
8. Run the command bellow to create VSFTP SSL key:
openssl req -x509 -nodes -newkey rsa:1024 -keyout /etc/vsftpd/vsftpd.pem -out /etc/vsftpd/vsftpd.pem
Note: The command above should written as one line.
9. Edit using VI, the file /etc/vsftpd/user_list and add members of the FTP-Users group to this list.
10. Run the command bellow to manually start the VSFTP service:
/etc/init.d/vsftpd start
11. Run the command bellow to configure the VSFTP to start at server startup:
chkconfig vsftpd on

原文 无法打开,在google cache 找到 http://security-24-7.com/hardening-guide-for-vsftpd-on-rhel-5-4/

Categories
tools

svnlook: Expected FS format ‘2’; found format ‘4’

原来在fc12安装的svn是:
[deli@athena ~]$ rpm -qa|grep subversion
subversion-javahl-1.6.13-1.fc12.1.i686
subversion-libs-1.6.13-1.fc12.1.i686
subversion-1.6.13-1.fc12.1.i686

将旧的代码仓库数据移到新的服务器,装的是 rhel 5.4, svn手动安装 subversion-1.6.9。
可以 update,但提交代码时发现:

svnlook: Expected FS format ‘2’; found format ‘4’

也是同样的 svn版本,可能新的服务器是64位。只好先把svn降级了。

mv resp resp_bak.20110121
svnadmin create --pre-1.5-compatible resp
svnadmin dump resp_bak.20110121 |svnadmin load resp
svnserve -d -r /var/svn/web/resp

重新 commit, ok.

Categories
Android

直接修改Market包显示支持收费软件,首页推荐软件

目前用MarketEnable,MarketAccess 之类的软件可以做到,但也有缺点:被修改apn,重启后无效。

大陆第三方ROM,一般都直接修改了电子市场包,观察一下安卓网自制的ROM,build.prop中都多了两行代码:

hiapk.vending.operator.name=T-Mobile
hiapk.vending.operator=310260

把运营商改为美国的。然后用

SystemProperties.get("hiapk.vending.operator.name");
SystemProperties.get("hiapk.vending.operator");

替换

TelephonyManager.getSimOperatorName();
TelephonyManager.getSimOperator()

下面是我修改的2.2.7版本的patch:

$ colordiff Vending_o/smali/com/android/vending/VendingApplication\$ApiClientContext.smali Vending/smali/com/android/vending/VendingApplication\$ApiClientContext.smali 
239,245c239
<     iget-object v2, p0, Lcom/android/vending/VendingApplication$ApiClientContext;->this$0:Lcom/android/vending/VendingApplication;
< 
<     invoke-static {v2}, Lcom/android/vending/VendingApplication;->access$100(Lcom/android/vending/VendingApplication;)Landroid/telephony/TelephonyManager;
< 
<     move-result-object v2
< 
<     invoke-virtual {v2}, Landroid/telephony/TelephonyManager;->getSimOperatorName()Ljava/lang/String;
---
>     const-string v2, "T-Mobile"
247c241
<     move-result-object v7
---
>     move-object/from16 v7, v2
259,265c253
<     iget-object v2, p0, Lcom/android/vending/VendingApplication$ApiClientContext;->this$0:Lcom/android/vending/VendingApplication;
< 
<     invoke-static {v2}, Lcom/android/vending/VendingApplication;->access$100(Lcom/android/vending/VendingApplication;)Landroid/telephony/TelephonyManager;
< 
<     move-result-object v2
< 
<     invoke-virtual {v2}, Landroid/telephony/TelephonyManager;->getSimOperator()Ljava/lang/String;
---
>     const-string v2, "310260"
267c255
<     move-result-object v9
---
>     move-object/from16 v9, v2

重新打包,签名即可。

Categories
Android

Android Market 之 deviceId

有时候我们在market上无法下载软件,总停留在 downloading… 界面,有时候恢复出厂设置又可以下载了,这是为什么呢?

在market上下载一个应用程序发出的URL请求,可以参考Tim Strazzere的博文 Downloading market applications without the vending app

其中涉及到一个参数手机设备号,与Android_ID有关,这个Android_ID可以参看官方文档

http://developer.android.com/reference/android/provider/Settings.Secure.html#ANDROID_ID

“A 64-bit number (as a hex string) that is randomly generated on the device’s first boot and should remain constant for the lifetime of the device. (The value may change if a factory reset is performed on the device.) ”

AndroidId,通常用做识别唯一设备。可以通过下面的函数获取:
String androidId = Settings.System.getString(getContentResolver(),
Settings.Secure.ANDROID_ID);

具体的函数实现与系统环境变量”ro.serialno”有关,大概过程是:

/system/core/init/init.c 读取kernel启动参数 /proc/cmdline 获取 androidboot.serialno, 然后是设置系统变量

property_set(“ro.serialno”, serialno[0] ? serialno : “”);

下面是 HTC G1的kernel启动参数:

~ # cat /proc/cmdline
board_trout.disable_uart3=0 board_trout.usb_h2w_sw=0 board_trout.disable_sdcard=0 smisize=64 androidboot.baseband=2.22.19.26I androidboot.cid=T-MOB010 androidboot.carrier=TMUS androidboot.keycaps=qwerty androidboot.mode=normal androidboot.serialno=HT839GZ04643 androidboot.bootloader=1.33.2005 no_console_suspend=1 console=null
~ # getprop |grep serialno
[ro.serialno]: [HT839GZ04643]

adb shell devices
列出的就是ro.serialno , 如果为空,用默认的值: “1234567890ABCDEF”.
注意,有些机器总是显示 9774d56d682e549c,说明系统环境变量”ro.serialno”没有设置,最近的Android 2.2代码已经修改这个bug.

strazzere的博文提到,可以用 tcpdump与wireshark工具观察数据包,可以得到手机的deviceId。其实也不需要那么麻烦,Android Market依赖于Downloads这个provider,那么查看sqlite数据库也是一目了然的:

$ adb pull /data/data/com.android.providers.downloads/databases/downloads.db .
$ strings downloads.db

或者可以这样找

$ adb pull /data/data/com.android.providers.settings/databases/settings.db .
$ sqlite3 settings.db
$ .tables
$ select * from secure

据观察,deviceId跟ANDROID_ID有一定的关系,deviceId是Google服务器自动生成的。 在Android 2.2之前的版本,可以为伪造一个地址蒙蔽过关,SDK上提供的是16个0。而在android 2.2之后的market,这个值与email帐号挂钩起来了,如果不一致,会收到HTTP 400 的错误码,这样只好把手机恢复出厂设置,重新生成deviceId。

Pages: Prev 1 2 3 ... 8 9 10 11 12 13 14 ... 20 21 22 Next