2011年2月28日月曜日

AWS Amazon Linux AMIのメモ

ちょっとはまったのでメモメモ

rootで入れないのでec2-userでログインし、
sudo su -
でパスワードもなくroot権限取得

2011年2月17日木曜日

AndroidでのローカルHTMLファイルの見方


Androidでローカルに入れたHTMLファイルを見たい場合は、
以下をブラウザに入力すると見れる。
content://com.android.htmlfileprovider/sdcard/ファイル名

でもNexus SだとPermissionエラーが出た。
2.3ではできない?

2011年2月10日木曜日

AccountManagerService.addAccount での署名チェック先

さっきの記事の署名チェック箇所における
RegisteredServicesCache.ServiceInfoがどこにあるのか?
それを突き止めるためにさらに調査。

/frameworks/base/core/java/android/content/pm/RegisteredServicesCache.java


コンストラクタにこんなものが、


100         File dataDir = Environment.getDataDirectory();
101         File systemDir = new File(dataDir, "system");
102         File syncDir = new File(systemDir, "registered_services");
103         mPersistentServicesFile = new AtomicFile(new File(syncDir, interfaceName + ".xml"));


怪しいのでRoot化した端末で中を見てみる。

adb shell
su
cd /data/system/registerd_services
cat android.accounts.AccountAuthenticator.xml

こんなん出ました。


<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<services>
<service uid="10041" type="com.android.exchange" />
<service uid="10019" type="com.google" />
</services>


ここに追加すれば独自アカウントも入れられるかな?

あと同じフォルダに、
android.content.SyncAdapter.xml
なるものが、


<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<services>
<service uid="10041" authority="com.android.contacts" accountType="com.android.exchange" />
<service uid="10019" authority="com.android.contacts" accountType="com.google" />
<service uid="10038" authority="gmail-ls" accountType="com.google" />
<service uid="10019" authority="subscribedfeeds" accountType="com.google" />
<service uid="10041" authority="com.android.calendar" accountType="com.android.exchange" />
<service uid="10019" authority="com.android.calendar" accountType="com.google" />
</services>

ここに追加したらどうなるんだろう?同期してくれる?どうやって?

Account Managerを利用したアカウント登録について(失敗)

Account Managerについて調べる中で、
プログラムからアカウントが自動登録できないか挑戦してみました。

http://developer.android.com/reference/android/accounts/AccountManager.html#addAccountExplicitly(android.accounts.Account, java.lang.String, android.os.Bundle)

このaddAccountExplicitlyと既存のアカウント、PWがあればいけるか?
と思いManifestにAUTHENTICATE_ACCOUNTSを追加してやってみたのですがSecurity Exception発生。
呼び出し元のアプリのUidが権限ありませんよ、とのこと。
ちなみに今回のアカウントはGoogleアカウント。

ソースをたどるとこんな感じ。
frameworks/base/core/java/android/accounts/AccountManager.java



482     public boolean addAccountExplicitly(Account account, String password, Bundle userdata) {
483         if (account == null) throw new IllegalArgumentException("account is null");
484         try {
485             return mService.addAccount(account, password, userdata);
486         } catch (RemoteException e) {
487             // won't ever happen
488             throw new RuntimeException(e);
489         }
490     }


mServiceはIAccountManagerのインスタンス。

79 public class AccountManagerService
80         extends IAccountManager.Stub
81         implements RegisteredServicesCacheListener<AuthenticatorDescription> {


そして、ソースを追ってAccountManagerServiceへ、


/frameworks/base/core/java/android/accounts/AccountManagerService.java
AddAccountメソッド


387     public boolean addAccount(Account account, String password, Bundle extras) {
388         if (account == null) throw new IllegalArgumentException("account is null");
389         checkAuthenticateAccountsPermission(account);
390
391         // fails if the account already exists
392         long identityToken = clearCallingIdentity();
393         try {
394             return insertAccountIntoDatabase(account, password, extras);
395         } finally {
396             restoreCallingIdentity(identityToken);
397         }
398     }

checkAuthenticateAccountsPermissionメソッド


1882     private void checkAuthenticateAccountsPermission(Account account) {
1883         checkBinderPermission(Manifest.permission.AUTHENTICATE_ACCOUNTS);
1884         checkCallingUidAgainstAuthenticator(account);
1885     }



Manifestのチェックと,Uidのチェック


checkCallingUidAgainstAuthenticatorメソッド

1838     private boolean hasAuthenticatorUid(String accountType, int callingUid) {
1839         for (RegisteredServicesCache.ServiceInfo<AuthenticatorDescription> serviceInfo :
1840                 mAuthenticatorCache.getAllServices()) {
1841             if (serviceInfo.type.type.equals(accountType)) {
1842                 return (serviceInfo.uid == callingUid) ||
1843                         (mContext.getPackageManager().checkSignatures(serviceInfo.uid, callingUid)
1844                                 == PackageManager.SIGNATURE_MATCH);
1845             }
1846         }
1847         return false;


serviceInfoに格納されているuidと呼び出し元のuidが同一かどうかチェックしています。
自家製のアプリではuidが同じではないので、Security Exception発生という流れ。

自前サービスのアカウントならいけるのか?というのは今後の検討。

Android サンプルコード集

Googleが提供しているサンプルコードです。

http://code.google.com/p/apps-for-android/

2008年の時点のものなので、それ以降のOSでは動かない、強制終了されてしまうものもあるかも。

とりあえず、PhotoStreamを使って写真共有アプリを作ってみよう。

2011年2月7日月曜日

Unparsed aapt error(s)

えらいハマった&良く出るエラーなのでメモ

aapt errorが出た場合、
エラーを右クリックで削除して、
プロジェクト→自動ビルドのチェックをオフ→クリーン→プロジェクトのビルド

http://stackoverflow.com/questions/4714711/android-packaging-problem-resources-ap-does-not-exist

これでほぼ直る。

ただ、さっきはこれでも直らなかったので、
ADTアップデートのせいか?とか、
Eclipseを入れなおしたら?とか奮闘しているうちに、
こないだAPKTOOL導入のためにaapt.exeを入れ替えてたことを思い出し、
前のaapt.exeに変えたらあっさり直った。

なんか悔しい。