Pages:  1 2 3 4 5 6 7 ... 11 12
Android – Page 4 – lytsing's Blog

Category: 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