顯示具有 Android 標籤的文章。 顯示所有文章
顯示具有 Android 標籤的文章。 顯示所有文章

2012年11月13日 星期二

[Android] 3.1 之後 Broadcast 行為的改變

前些陣子聽到實驗室學妹跟我說她自己寫的 App 收不到 BOOT_COMPLETED,我還嗤之以鼻的表示一定收的到啊~結果今天自己在 trace code 的時候就被打臉了 ... Q__Q
(學妹表示:你太嫩了!)

In frameworks/base/services/java/com/android/server/am/ActivityManagerService.java :

    private final int broadcastIntentLocked(ProcessRecord callerApp,
            String callerPackage, Intent intent, String resolvedType,
            IIntentReceiver resultTo, int resultCode, String resultData,
            Bundle map, String requiredPermission,
            boolean ordered, boolean sticky, int callingPid, int callingUid) {
        intent = new Intent(intent);

        // By default broadcasts do not go to stopped apps.
        intent.addFlags(Intent.FLAG_EXCLUDE_STOPPED_PACKAGES);

        ... (略)

就是由於 Android 在 broadcast 的時候將 intent 加上了預設的 flag (Intent.FLAG_EXCLUDE_STOPPED_PACKAGES),因此,在 Stopped 階段的 packages 基本上收不到 intent,但是 3rd party app 可以自己加入 Intent.FLAG_INCLUDE_STOPPED_PACKAGES 這個 flag 讓 Stopped 階段的程式可以收到廣播內容!

因此,如果你不一想讓 App 收 System broadcast 的話,可以到管理選單上「Force Stop」,這樣就不會收到 broadcast 囉。同樣的,如果 App 沒有 Activity 的話,目前看起來就無法讓他自己跑起來了 ... ?

In frameworks/base/service/java/com/android/server/am/ActivityManagerService.java :


    public void forceStopPackage(final String packageName) {
        if (checkCallingPermission(android.Manifest.permission.FORCE_STOP_PACKAGES)
                != PackageManager.PERMISSION_GRANTED) {
            String msg = "Permission Denial: forceStopPackage() from pid="
                    + Binder.getCallingPid()
                    + ", uid=" + Binder.getCallingUid()
                    + " requires " + android.Manifest.permission.FORCE_STOP_PACKAGES;
            Slog.w(TAG, msg);
            throw new SecurityException(msg);
        }

        long callingId = Binder.clearCallingIdentity();
        try {
            IPackageManager pm = AppGlobals.getPackageManager();
            int pkgUid = -1;
            synchronized(this) {
                try {
                    pkgUid = pm.getPackageUid(packageName);
                } catch (RemoteException e) {
                }
                if (pkgUid == -1) {
                    Slog.w(TAG, "Invalid packageName: " + packageName);
                    return;
                }
                forceStopPackageLocked(packageName, pkgUid);
                try {
                    pm.setPackageStoppedState(packageName, true);
                } catch (RemoteException e) {
                } catch (IllegalArgumentException e) {
                    Slog.w(TAG, "Failed trying to unstop package "
                            + packageName + ": " + e);
                }
            }
        } finally {
            Binder.restoreCallingIdentity(callingId);
        }
    }

在這邊有個 forceStopPackage() method,會呼叫 PackageManagerService.setPackageStoppedState,這個 method 會呼叫 Setting.setPackageManagerServiceLPw,然後把相對應 PackageName 的 PackageSetting 設定成 stopped ...

Android Developer 上有提到:http://developer.android.com/about/versions/android-3.1.html(但是我之前都沒注意到啊啊啊啊啊....)。

這個教訓告訴我們「要注意看 API Document」!


BTW,我這邊貼 code 是用 http://hilite.me/ 這個網站產生的。

2012年6月16日 星期六

[openSUSE] Note: compile Android source code on openSUSE 12.1

之前只要關於 Android Source Code 的東西,我通常是放在 Ubuntu 11.10 上面作,但是因為這一兩年習慣了用 openSUSE 當主要使用的 Linux distro,所以就想試試看在這平台上編譯,但是大部分文件都是寫給 Ubuntu 使用者看的,讓我遇到了不少麻煩。

在這邊寫下筆記,是希望之後的 openSUSEer 不要在花跟我一樣多的時間來找這些套件! :D

平台:openSUSE 12.1
package:
gcc python libstd++46-devel-32bit perl-Switch libncurses6-32bit ncurses-devel-32bit zlib-devel-32bit Mesa-devel-32bit

目前仍然在編譯當中,而且這也不是完整的 List,先作個筆記,之後確認完在 update!

2011年6月27日 星期一

[Android-x86] wifi and touchscreen problem?

WIFI:
就 TARGET_PRODUCT 先不要用 generic-x86 請試試 eeepc 吧 :-)

Touchscreen:
請找找你的 touchscreen driver 有沒有在 Android-x86 的 kernel 中,我想大部分都沒有...

[Android-x86] Gingerbread LAN 設定

會寫這一篇的理由是我最近因為實習工作的關係,必須要使用 Android-x86,而 Gingerbread-x86 這個版本在 Setting 中找不到 LAN 的設定,所以只好想其他辦法讓區域網路能動,以用 adb 來 debug。


  • ifconfig eth0 up
  • (netcfg eth0 dhcp)
  • dhcpcd eth0
  • setprop net.dns1 [ip]


可以參考: http://owenhuangtw.pixnet.net/blog/post/24278564

2011年4月21日 星期四

[Android] Spydroid



這兩天到了國科會去參加 NSoC 的八年成果展,說實在蠻心虛的,我實際加入的計畫並不是NSoC,而是自由軟體計畫,更心虛的是我其實也做的不好。

Spydroid原先是個在Android Framework上偵測spyware的軟體,利用behavior not permission來判斷,不過一般來說spyware有些模糊地帶,每個人認定的spyware範圍並不一樣,像TaintDroid這個強大的研究就會把IMEI Stealing也當作是重要的feature,那其實Spydroid也想在某方面達成類似TaintDroid所做的事情,但是我們卻沒有利用taint的技巧(由於我一開始認為taint的效能不彰),而是改用在framework/API這邊以uid為單位紀錄程式所作所為,以行為順序的組合判斷spyware。

2010年9月15日 星期三

[Android] 寫程式挖 .apk

我原本以為要挖 .apk 出來是有困難的,不過後來發現大部分的 .apk 是可以直接挖出來的,但是原先就在 ROM 的 .apk 就算挖出來,也無法安裝,拆開 .apk 會發現沒有 classes.dex!


2010年9月7日 星期二

[Android] 關於美國 Blackhat 和 Defcon 的幾個講題

其實說有很多講題,我也只看完兩個而已(遮臉),也剛好覺得有些東西應該隨手記一下以免忘記。


2010年5月20日 星期四

[Android] 大家很愛用的 JNI in Android

不過這篇不是要討論 JNI 怎麼用在 Android App,有了 NDK 之後,這方面的使用應該是很方便也沒什麼問題了。

可能有些人遇到跟我一樣的麻煩在於如果想對 SDK 內容作更動的時候,又想 call JNI function 甚至是自己新增的 system call,那就不能用原本的 JNI 方式去做了。

JNI Calls in Android SDK/Platform

這個是我的 wiki,有空會更新版本....。

我知道這版本有漏洞啦 Orz

基本上跟 NDK 使用的方式就不太一樣囉,Android SDK 本身有自己的註冊方式,大家都註冊在同樣的地方。

2010年1月14日 星期四

[Android] Rooting 和刷 BootLoader 筆記 (HTC T-Mobile G1)

其實這件事情已經做過幾次了,只是覺得應該筆記下來,之後比較容易記得,不用每次都找網路上的資訊找很久 XD,一定很多人看過類似的文章,我只是自己紀錄一下備份而已。

2009年11月16日 星期一

[Android] android-msm-2.6.29-donut + Dount

嘗試了許多版本的 android kernel 和 cupcake、donut 的組合,怎麼都沒辦法 port 上我的 HTC G1 呢,好不容易在經過 N 次嘗試之後,確認了這個組合是可以的啊啊啊啊啊!!!

步驟:
  1.  git clone git://android.git.kernel.org/kernel/msm.git
  2. 先看一下有哪些 branch,git branch -r
  3. git checkout --track -b android-msm-2.6.29-donut origin/android-msm-2.6.29-donut
  4. git branch 確認一下
  5. ARCH=arm SUBARCH=arm CROSS_COMPILE=自己設一下路徑 make msm_defconfig
  6. ARCH=arm SUBARCH=arm CROSS_COMPILE=自己設一下路徑 make -j2
然後再 copy 到 dount/vendor/htc/dream-open/ 底下蓋掉 kernel。

2009年9月9日 星期三

[Android] 最近忙碌的重點

其實應該說我今年計畫的重點就是要完成Android的Security,目標是要解決spyware!

因為我們想要從Linux Kernel下手,科科,所以必須先學會編Android....
所以我就來順手寫個Note啦!