編輯:關於Android編程
private static String[] mAddedApks = { "HandwritePack.apk", "PinyinPack.apk",
» » » "ChtPack_.apk", "TouchPal.apk" };
public String[] getApks(){
» return mAddedApks;
}
public void scanApkAndInstallAll(){
» » File systemAppDir = new File(Environment.getRootDirectory(), "app");
» » for (String appName : mAddedApks) {
» » » File installApp = new File(systemAppDir, appName);
» » » if(!installApp.exists()){
» » » » continue;
» » » }
» » »
» » » String addedPackage = null;
» » » int addedAppId = -1;
» » » int[] addedUsers = null;
» » » /*
» » » * if (!isPackageFilename(installApp)) { // Ignore entries which are
» » » * not apk's continue; }
» » » */
» » » // Set flag to monitor and not change apk file paths when
» » » // scanning install directories.
» » » int scanMode = SCAN_MONITOR | SCAN_NO_PATHS | SCAN_UPDATE_TIME;
» » » int flags = (PackageParser.PARSE_IS_SYSTEM
» » » » » | PackageParser.PARSE_IS_SYSTEM_DIR | PackageParser.PARSE_CH
ATTY);
» » » if (mNoDexOpt) {
» » » » scanMode |= SCAN_NO_DEX;
» » » }
» » » synchronized (mInstallLock) {
» » » » PackageParser.Package pkg = scanPackageLI(installApp, flags
» » » » » » | PackageParser.PARSE_MUST_BE_APK, scanMode,
» » » » » » System.currentTimeMillis(), UserHandle.ALL);
» » » » // Don't mess around with apps in system partition.
» » » » if (pkg == null 1547
» » » » » » && (flags & PackageParser.PARSE_IS_SYSTEM) == 0
» » » » » » && mLastScanError == PackageManager.INSTALL_FAILED_I
NVALID_APK) {
» » » » » // Delete the apk
» » » » » installApp.delete();
» » » » }
» » » » if (pkg != null) {
» » » » » /*
» » » » » * TODO this seems dangerous as the package may have changed
» » » » » * since we last acquired the mPackages lock.
» » » » » */
» » » » » // writer
» » » » » synchronized (mPackages) {
» » » » » » updatePermissionsLPw(
» » » » » » » » pkg.packageName,
» » » » » » » » pkg,
» » » » » » » » pkg.permissions.size() > 0 ? UPDATE_
PERMISSIONS_ALL
» » » » » » » » » » : 0);
» » » » » }
» » » » » addedPackage = pkg.applicationInfo.packageName;
» » » » » addedAppId = UserHandle.getAppId(pkg.applicationInfo.uid);
» » » » » addedUsers = sUserManager.getUserIds();
» » » » » // reader
» » » » » synchronized (mPackages) {
» » » » » » mSettings.writeLPr();
» » » » » }
» » » » }
» » » }
» » » if (addedPackage != null) {
» » » » Bundle extras = new Bundle(1);
» » » » extras.putInt(Intent.EXTRA_UID, addedAppId);
» » » » sendPackageBroadcast(Intent.ACTION_PACKAGE_ADDED, addedPackage,
» » » » » » extras, null, null, addedUsers);
» » » }
» » }
}
» public void scanApkAndInstall(String apkName) {
» » File systemAppDir = new File(Environment.getRootDirectory(), "app");
» » File installApp = new File(systemAppDir, apkName);
» » if (!installApp.exists()) {
» » » return;
» » }
» » String addedPackage = null;
» » int addedAppId = -1;
» » int[] addedUsers = null;
» » /*
» » * if (!isPackageFilename(installApp)) { // Ignore entries which are not
» » * apk's continue; }
» » */
» » // Set flag to monitor and not change apk file paths when
» » // scanning install directories.
» » int scanMode = SCAN_MONITOR | SCAN_NO_PATHS | SCAN_UPDATE_TIME;
» » int flags = (PackageParser.PARSE_IS_SYSTEM
» » » » | PackageParser.PARSE_IS_SYSTEM_DIR | PackageParser.PARSE_CHATTY);
» » if (mNoDexOpt) {
» » » scanMode |= SCAN_NO_DEX;
» » }
» » synchronized (mInstallLock) {
» » » PackageParser.Package pkg = scanPackageLI(installApp, flags
» » » » » | PackageParser.PARSE_MUST_BE_APK, scanMode,
» » » » » System.currentTimeMillis(), UserHandle.ALL);
» » » // Don't mess around with apps in system partition.
» » » if (pkg == null
» » » » » && (flags & PackageParser.PARSE_IS_SYSTEM) == 0
» » » » » && mLastScanError == PackageManager.INSTALL_FAILED_INVALID_A
PK) {
» » » » // Delete the apk
» » » » installApp.delete();
» » » }
» » » if (pkg != null) {
» » » » /*
» » » » * TODO this seems dangerous as the package may have changed
» » » » * since we last acquired the mPackages lock.
» » » » */
» » » » // writer
» » » » synchronized (mPackages) {
» » » » » updatePermissionsLPw(pkg.packageName, pkg,
» » » » » » » pkg.permissions.size() > 0 ? UPDATE_PERMISSI
ONS_ALL
» » » » » » » » » : 0);
» » » » }
» » » » addedPackage = pkg.applicationInfo.packageName;
» » » » addedAppId = UserHandle.getAppId(pkg.applicationInfo.uid);
» » » » addedUsers = sUserManager.getUserIds();
» » » » // reader
» » » » synchronized (mPackages) {
» » » » » mSettings.writeLPr();
» » » » }
» » » }
» » }
» » if (addedPackage != null) {
» » » Bundle extras = new Bundle(1);
» » » extras.putInt(Intent.EXTRA_UID, addedAppId);
» » » sendPackageBroadcast(Intent.ACTION_PACKAGE_ADDED, addedPackage,
» » » » » extras, null, null, addedUsers);
» » }
» }
scanApkAndInstallAll()是安裝預先放在system/app裡面的文件,安裝為系統app,而不是普通應用。
scanApkAndInstall(String apk),安裝system/app下面的其他的文件。 void scanApkAndInstall(String apkName);
void scanApkAndInstallAll();
Android應用安裝有如下四種方式:
1.系統應用安裝---開機時完成,沒有安裝界面--------->>重要:既然我們需要選擇安裝,所以第一次開機就不需要安裝某些APK(以後檢測到SIM卡在安裝)
2.網絡下載應用安裝---通過market應用完成,沒有安裝界面。
3.ADB工具安裝---沒有安裝界面。 --------->其實adb push到/system/app,system/priv-app的時候執行了安裝動作,只是沒有界面。
4.第三方應用安裝---通過SD卡裡的APK文件安裝,有安裝界面,由 packageinstaller.apk應用處理安裝及卸載過程的界面。
應用安裝的流程及路徑
應用安裝涉及到如下幾個目錄:
system/app ---------------系統自帶的應用程序,獲得adb root權限才能刪除
data/app ---------------用戶程序安裝的目錄。安裝時把apk文件復制到此目錄
data/data ---------------存放應用程序的數據
data/dalvik-cache--------將apk中的dex文件安裝到dalvik-cache目錄下(dex文件是dalvik虛擬機的可執行文件)
安裝過程:
復制APK安裝包到data/app目錄下,解壓並掃描安裝包,把dex文件(Dalvik字節碼)保存到dalvik-cache目錄,並data/data目錄下創建對應的應用數據目錄。
卸載過程:
刪除安裝過程中在上述三個目錄下創建的文件及目錄。
所以,為了避免開機的時候安裝,我們需要過濾某些檢測到SIM卡之後才安裝的apk。我們在PackageManagerService.java的函數 private void scanDirLI(File dir, int flags, int scanMode, long currentTime) 裡面過濾這些apk。 private boolean isContainsMyApks(String appName){
» if(appName == null){
» » return false;
» }
» for(String app:mAddedPHICOMMApks){
» » if(app.equals(appName)){
» » » return true;
» » };
» }
» return false;
»
}for (i = 0; i < files.length; i++) {
if (dir.getPath().equals(mSystemAppPath) && isContainsMyApks(files[i])) { } else {
File file = new File(dir, files[i]);
if (!isPackageFilename(files[i])) {
continue;
}
PackageParser.Package pkg = scanPackageLI(file, flags .............下面的省略package com.android.settings;
2
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.IPackageManager;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemProperties;
import android.telephony.TelephonyManager;
import android.util.Log;
/**
* This doucment was added by haiyong.liu to install system/app if SIM iccid is from taiwan .
* @author
*
*/
public class SIMStateReceiver extends BroadcastReceiver {
» private static final String PERSIST_SYS_SIMAPK_INSTALL = "persist.sys.simapkinstall";
» private static boolean isInstalling = false;
» @Override
» public void onReceive(Context context, Intent intent) {
» » if (intent.getAction()
» » » » .equals("android.intent.action.SIM_STATE_CHANGED")) {
» » » TelephonyManager tm = (TelephonyManager) context
» » » » » .getSystemService(Service.TELEPHONY_SERVICE);
» » » int state = tm.getSimState();
» » » switch (state) {
» » » case TelephonyManager.SIM_STATE_READY:
» » » » Log.e("haiyong.liu", "SIM_STATE_READY");
» » » » if (!isInstalling) {
» » » » » isInstalling = true;
» » » » » installPHICOMMApksAndOther(tm);
» » » » }
» » » » break;
» » » default:
» » » » break;
» » » }
» » }
» }
private void installPHICOMMApksAndOther(TelephonyManager tm) {
» » String propSimString = SystemProperties.get(PERSIST_SYS_SIMAPK_INSTALL);
» » String iccidString = tm.getSimSerialNumber();
» » if (iccidString.startsWith("8988")
» » » » && (propSimString == null || propSimString.equals(""))) {
» » » IPackageManager iPackageManager = IPackageManager.Stub
» » » » » .asInterface(ServiceManager.getService("package")); 注意該接口的使用,因開機注冊的時候使用的是"package"
"
» » » try {
» » » » iPackageManager.scanPHICOMMApkAndInstallAll();
» » » } catch (RemoteException e) {
» » » » Log.e("haiyong.liu", "SIMStateReceiver RemoteException:" + e);
» » » }
» » » SystemProperties.set(PERSIST_SYS_SIMAPK_INSTALL, "installed");
» » } else if (propSimString.equals("installed")) {
» » }
» }
}
Android編程ProgressBar自定義樣式之動畫模式實現方法
本文實例講述了Android編程ProgressBar自定義樣式之動畫模式實現方法。分享給大家供大家參考,具體如下:忘記在哪裡看到的那位仁兄寫的,就是通過用動畫效果來實現
Android事件傳遞(二)ViewGroup事件的傳遞
經過上一篇的實驗,我門只是僅僅對View的事件的傳遞進行了分析,但是還有一個比較厲害的ViewGroup我們肯定是要說一下的,ViewGroup的二叉視圖分析 我們能看到
C++調用Android函數彈出一個提示框中出現的問題總結
(1) 在Jni.cpp中使用了全局變量 JNIEnv *g_env;jobject g_object;然後在第一個傳入了JNIEnv和jobject的函數中初
Android MVP開發模式詳解(十九)
(一).前言:今天我們的項目繼續更新,今天我們主要講解MVP開發模式以及具體實例。 (二).簡介:MVP(Model ViewPrese