Category Archives: Android

电子市场 Google 软件精选管理器

很多手拿Android手机的人不明白这个软件是干啥的,其实,就是Market Updater,我也不明白为什么中文会叫成这样。在Broncho的时候,反编译过这个MarketUpdater.apk,以后我也不干这坏事了,把成果贴出来吧: https://github.com/lytsing/MarketUpdater

就30多行代码,它干的事情很少,监听 “com.android.vending.UPDATE_MARKET”, intent把下载后的apk url传过来,调用静默安装apk的方法。

那么,谁发 “com.android.vending.UPDATE_MARKET” 这个intent action? 当然是电子市场了:

<receiver 
    android:name=".InitializeMarketAction$DownloadBroadcastReceiver"
    android:permission="android.permission.SEND_DOWNLOAD_COMPLETED_INTENTS"
    android:exported="true">
<receiver />

大致的InitializeMarketAction.java代码:

// From Vending.apk
package com.android.vending;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;

public class InitializeMarketAction {

    public class DownloadBroadcastReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            final Uri contentUri = intent.getData();
            int status = DownloadManagerUtil.getStatus(context, contentUri);
            if (DownloadManagerUtil.isStatusAuthFailure(status)) {
                new Thread() {
                    public void run() {
                        VendingApplication.getVendingApplication().invalidateAuthTokenBlocking(
                                AuthService.ANDROID_SECURE);
                    }
                }.start();
                
            } else if (DownloadManagerUtil.isStatusSuccess(status)) {
                setBackgroundRunnable(new Runnable() {

                    @Override
                    public void run() {
                        ServiceLocator.getCacheManager().clear();
                        Context app = VendingApplication.getVendingApplication();
                        app.sendBroadcast(new Intent("com.android.vending.UPDATE_MARKET",
                                contentUri));
                    }
                    
                });
            }
            
        }
    }
}

那电子市场是如何自我更新的呢? 这个问题问得好。待续。。。

解决电子市场 3.13版本 “您的设备与此商品不兼容”的问题

Android market: Your device is not compatible with this item


用 apktool 1.4.1 反编译Vending.apk 3.1.3版本,遇到错误,无法插入调试信息再打包重新安装。搜索反编译后的文件查找信息:

您的设备与此商品不兼容。

smali/com/android/vending/R$string.smali:.field public static final availability_restriction_hardware:I = 0x7f080191

deli@deli-laptop:~/Desktop/a/Vending$ grep 0x7f080191 * -r
smali/com/google/android/finsky/activities/DetailsAvailabilityRestrictionViewBinder.smali: const v3, 0x7f080191

猜出大概代码:

public bind(View view, Document document, int iconWidth, int iconRightMargin, DfeToc toc) {

	TextView reason = view.findViewById(R.id.restriction_reason);
	int restriction = document.getAvailabilityRestriction();

	switch (restriction) {
	case 4:
		reason.setText(R.string.availability_restriction_hardware);
		break;
	}
}

public int getAvailabilityRestriction() {
	boolean hasAvailability = mFinskyDoc.hasAvailability();
	if (hasAvailability) {
		int restriction = mFinskyDoc.getAvailability().getRestriction();
		reutrn restriction;
	}

	return -1;
}

restriction的值是通过 setRestriction 设置,读取protobuf数据,也没弄清楚,因为无法插入调试信息。发现3.1.3版本比以前版本复杂多了。

最后发现

  deli@deli-laptop:~$ diff build.prop build.prop~
  31c31
  < ro.build.fingerprint=N708_800_600/broncho_N708/N708_800_600/:2.2/FRF91/user.N708_800_600.20110917.133140:user/test-keys
  ---
  > ro.build.fingerprint=N708/broncho_N708/N708_800_600/:2.2/FRF91/user.N708_800_600.20110917.133140:user/test-keys

ro.build.fingerprint=N708,N708这个是我们的项目名,临时修改编译脚本成N708_800_600,出现下划线,导致被google过滤掉了。搞第三方ROM的,注意了,别随意修改系统参数,除非你真的明白你在干啥东东。

汉化 google+ 1.02 Android客户端


正在研究G+ Android客户的一些设计方法,发现蛮复杂的。

很早就知道如何汉化 apk了,只是不屑于干那样的活,觉得没什么技术含量。上电子市场,发现好多人留言希望赶紧出中文版,需求蛮大的。台湾的兄弟早搞出来了,目前没有发现有简体中文的。大陆的兄弟们,是不是要跟上呢?小弟e文功底差,只能照着 google+ 网页中文版翻译一些基本的字段。翻译真是苦差活,随着使用G+的深入使用,会持续更新。有错误不妥之处,请留言提醒哈。

适用机型: Android 2.1以上
下载地址: http://lytsing.org/downloads/gplus-1.0.2.apk

更新:
忙了一个下午,再搜索,发现 Jay Chua 同学已经搞过了。看了他空间,网页字体不错,我也升级了wp。以后最好跟他一起汉化,免得浪费时间。

翻译心得:
1. 认真是一种能力,而不是仅仅是态度,既然要翻译了,就努力做好,不能做到一半就丢了。
2. 注意标点符号,注意圆角。

Android Market 最新版本 2.3.6

亮点: 在设置多一下个选项,如图:

下载地址: http://lytsing.org/downloads/Vending-2.3.6-enable-paid.apk

如包名所示,我修改了几行代码,使它可以查看付费软件。

安装后,设置 – 应用程序 – 管理应用程序 – 全部 – 电子市场 – 清除缓存

适用范围:

Android 2.2,刷过 使用 test-key 签名的 第三方 rom ,比如大名鼎鼎的 CM.否则遇到下面的FC:

I/ActivityManager( 116): Process com.android.protips (pid 537) has died and restarted (pid 0).
E/DatabaseUtils( 364): Writing exception to parcel
E/DatabaseUtils( 364): java.lang.SecurityException: Permission Denial: writing com.google.android.gsf.settings.GoogleSettingsPrS
E/DatabaseUtils( 364): at android.content.ContentProvider
$Transport.enforceWritePermission(ContentProvider.java:325)
E/DatabaseUtils( 364): at android.content.ContentProvider $Transport.insert(ContentProvider.java:173)
E/DatabaseUtils( 364): at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:146)
E/DatabaseUtils( 364): at android.os.Binder.execTransact(Binder.java:288)
E/DatabaseUtils( 364): at dalvik.system.NativeStart.run(Native
Method)
W/dalvikvm( 353): threadid=33: thread exiting with uncaught exception (group=0x4001d7c8)
E/AndroidRuntime( 353): FATAL EXCEPTION: work-service-handler-thread
E/AndroidRuntime( 353): java.lang.SecurityException: Permission Denial: writing com.google.android.gsf.settings.GoogleSettingsPS
E/AndroidRuntime( 353): at android.os.Parcel.readException(Parcel.java:1247)
E/AndroidRuntime( 353): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:160)
E/AndroidRuntime( 353): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:114)

可能会出现的问题:
(一)下载软件,一直卡在“Download paused”/“下载暂停”。

解决方法:
1. 把SDCARD卸载。
2. 删除 “/mnt/secure/asec/smdl2tmp1.asec” 或者 sd卡上的空目录 “.android_secure”.

Android apk forward lock

forward lock 干啥用?Android market有用到,开发者上传apk时候,可以设置。官方文档也说明了

http://developer.android.com/guide/appendix/market-filters.html

Forward-Locked Applications

To forward lock an application, set copy protection to “On” when you upload the application to Market. Market will not show copy-protected applications on developer devices or unreleased devices.

查看源代码,frameworks/base/core/java/android/content/pm/PackageManager.java 注释说明:

标识本应用属于受限应用,应用将会被安装到保护目录,只有该应用可以访问代码段和不属于resource的asset资源。

那么安装这样的一个 apk,需要设置 FORWARD LOCK 标志位。

1758     public abstract void installPackage(
1759             Uri packageURI, IPackageInstallObserver observer, int flags,
1760             String installerPackageName);

Android 1.5, PackageManager.FORWARD_LOCK_PACKAGE = 0x00000001;

Android 2.2 改成了 INSTALL_FORWARD_LOCK

Pages: Prev 1 2 3 4 5 6 7 8 9 10 11 12 Next