㈠ android移動學習系統有沒有基礎結點模型
http://www.eoeandroid.com/forum.php?mod=viewthread&tid=275199
目錄
一、AndroidManifest.xml整體結構
二、各個節點詳細介紹
1、<manifest>屬性
2、應用程序運行環境相關
系統版本
<uses-sdk>
系統軟硬體環境
<uses-feature>
<uses-configuration>
3、屏幕尺寸相關
<supports-screens>
<compatible-screens>
4、許可權相關
<uses-permission>
<permission>
<permission-group>
<permission-tree>
5、測試標簽屬性
<instrumentation>
6、系統標簽
<protected-broadcast>
<package-verifier>
<original-package>
7、<application>屬性
<activity>
<activity-alias>
<meta-data>
<provider>
<grant-uri-permission>
<path-permission>
<receiver>
<service>
<uses-library>
<intent-filter>
<action>
<category>
<data>
一、AndroidManifest.xml整體結構
[mw_shl_code=java,true]
<manifest>
<uses-permission />
<permission />
<permission-tree />
<permission-group />
<instrumentation />
<uses-sdk />
<uses-configuration />
<uses-feature />
<supports-screens />
<compatible-screens />
<supports-gl-texture />
<application>
<activity>
<intent-filter>
<action />
<category />
<data />
</intent-filter>
<meta-data />
</activity>
<activity-alias>
<intent-filter> . . . </intent-filter>
<meta-data />
</activity-alias>
<service>
<intent-filter> . . . </intent-filter>
<meta-data/>
</service>
<receiver>
<intent-filter> . . . </intent-filter>
<meta-data />
</receiver>
<provider>
<grant-uri-permission />
<meta-data />
<path-permission />
</provider>
<uses-library />
</application>
</manifest>
[/mw_shl_code]
二、各個節點詳細介紹
1、<manifest>屬性
<manifest xmlns:android=http://schemas.android.com/apk/res/android
package="string"
android:sharedUserId="string"
android:sharedUserLabel="string resource"
android:versionCode="integer"
android:versionName="string"
android:installLocation=["auto"|"internalOnly"|"preferExternal"]>
...
</manifest>
說明:
這個元素是AndroidManifest.xml文件的根元素。它必須包含一個<application>元素,並且必須要指定xmlns:android和package屬性。
屬性:
xmlns:android:定義android的命名空間。
package:一個完整的java語言風格的應用程序包的名稱,這個必須是唯一的,名字可以包含大小寫字母、數字和下劃線 ('_'),但只能以字母開頭。
android:sharedUserId:這個屬性定義了一個Linux 用戶ID的名稱,這個名稱能夠跟其他應用程序共享。默認情況下,Android會給它的每個應用程序都分配一個唯一的用戶ID。但是,如果有兩個或更多的應用程序把這個屬性都設置了相同的值,那麼它們將共享這個相同的ID---假如並且它們具有相同的數字簽名。擁有相同用戶ID的應用程序能夠訪問彼此的數據,並且它們也可運行在相同的進程中。
android:sharedUserLabel:(API Level 3)這個屬性給共享的userid定義了一個用戶可讀的標簽。這個標簽必須用字元串資源來設置,不能使用原生的字元串。只有在sharedUserId屬性被設置,這個屬性才有意義。
android:versionCode:apk版本號,值為數字,用於版本判斷,對用戶不可見。
android:versionName:apk當前版本的名稱,對用戶可見,由三部分組成:<major>.<minor>.<point>,如:3.4.4。
android:installLocation:(API Level 8)apk安裝位置,apk可以安裝在內部存儲上或外部存儲上。
auto
系統自己判斷安裝位置,安裝位置不定,優先安裝在內部存儲上,用戶可以移動安裝位置;
internalOnly
(默認值)強行安裝在內部存儲上,當內部存儲空間不足時,系統將不會安裝該應用。用戶不能移動安裝位置。
preferExternal
應用程序偏好安裝在外部存儲器 上(SD卡)。系統並不保證恪守這一個規則。如果外部存儲器不可用或空間不足,或者應用程序使用了forward-locking機制(這種機制不支持外 部存儲),那麼應用程序就可以安裝在內部存儲器上。一旦安裝,用戶能夠通過系統設置在內外存儲器之間移動應用程序。
警告:如果應用程序使用的Google Play的復制保護功能,那麼它就不能被安裝在設備的SD卡上。但是,如果使用Google Play的應用程序許可,那麼它就能夠被安裝在內部或外部存儲器上,包括SD卡。
注意:默認情況下,應用程序會被安裝在內部存儲器上,除非把這個屬性值定義為auto或preferExternal,應用程序才能夠被安裝在外部存儲器上。
當應用程序被安裝在外部存儲器上的時候:
1. .apk文件被保存在外部存儲器上,但是任何應用程序數據(如資料庫)依然被保存在內部設備存儲器上;
2. 用一個key把存儲器中保存的.apk文件加密,只允許應用程序在安裝它的設備上運行。用戶不能把安裝在SD卡上應用程序轉移到另一個設備的SD卡上,雖然在一個設備上能夠使用多個SD卡;
3. 在用戶要求的時候,應用程序能夠被轉移到內部存儲器上。用戶也可以要求把應用程序從內部存儲器移動到外部存儲器上。但是,如果這個屬性被設置為internalOnly,那麼系統不允許用戶把應用程序轉移到外部存儲器上。
2、應用程序運行環境相關
系統版本
<uses-sdk>
<uses-sdk
android:minSdkVersion="integer"
android:targetSdkVersion="integer"
android:maxSdkVersion="integer" />
被包含於:
<manifest>
說明:
這個元素用API 的級別(一個整數)來說明應用程序會跟哪些Android平台版本兼容。由應用程序給出的API級別會跟給定不同的設備中的Android系統的API級別比較。
屬性:
android:minSdkVersion:程序運行的最小API版本,如果Android系統的API級別比該應用程序清單中的這個屬性值小,那麼系統就阻止安裝該應用程序。如果不指定該屬性,默認最小API版本為1,即兼容所有版本。
android:targetSdkVersion:(APILevel 4)程序的目標版本,即應用測試時所針對的目標平台版本。當程序運行在比該版本高的平台上時,系統將以兼容模式來運行程序以確保程序能夠正常運行。不指定該屬性時,該值與minSdkVersion相同。
android:maxSdkVersion:(API Level 4)不建議設定該值,指定程序能運行的最高版本,當當前系統版本比該值高時,該程序將不能安裝,如果系統升級後的版本號高於該值時,該程序將被刪除。從Android 2.0.1以後系統在安裝程序或系統升級的時候將不再檢測和使用該屬性。但Google Play在把應用程序展示給用戶下載的時候,會繼續使用這個屬性作為過濾條件。
系統軟硬體環境
<uses-feature>
<uses-feature
android:name="string"
android:required=["true" | "false"]
android:glEsVersion="integer" />
被包含於:
<manifest>
不謝 望採納
㈡ Android初學者提問AndroidManifest文件問題
<?xml version="1.0" encoding="utf-8"?>
<manifest>
<!-- 基本配置 -->
<uses-permission />
<permission />
<permission-tree />
<permission-group />
<instrumentation />
<uses-sdk />
<uses-configuration />
<uses-feature />
<supports-screens />
<compatible-screens />
<supports-gl-texture />
<!-- 應用配置 -->
<application>
<!-- Activity 配置 -->
<activity>
<intent-filter>
<action />
<category />
<data />
</intent-filter>
<meta-data />
</activity>
<activity-alias>
<intent-filter> . . . </intent-filter>
<meta-data />
</activity-alias>
<!-- Service 配置 -->
<service>
<intent-filter> . . . </intent-filter>
<meta-data/>
</service>
<!-- Receiver 配置 -->
<receiver>
<intent-filter> . . . </intent-filter>
<meta-data />
</receiver>
<!-- Provider 配置 -->
<provider>
<grant-uri-permission />
<meta-data />
</provider>
<!-- 所需類庫配置 -->
<uses-library />
</application>
</manifest>
㈢ Eclipse 配置好android開發環境,一直用的好好的,今天突然報錯
Add following code to AndroidManifest.
<instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="your.package"
android:label="your tests label" />
<uses-library android:name="android.test.runner" />
- Right click project on Project Explorer Panel on Eclipse, then click "Run" > "Run Configurations...", then select "android.test.InstrumentationTestRunner" in Instrumentation TestRunner.
㈣ Android 怎麼自定義共享庫
在源碼根目錄下有個 vendor (供應商) 目錄,專門用於存放各個供應商的會有代碼。其中有一個個 sample 目錄,這是 Google 用於示範如何編寫自定義共享庫的示例,它展示了自定義共享庫、JNI 調用、對庫的使用方法及皮膚定製等功能。下面我們通過對該示例進行分析,讓大家熟悉這個輕量級的框架。
1、首先看一下 sample 目錄的結構:
sample
├── Android.mk
├── apps
│ ├── Android.mk
│ ├── client
│ └── upgrade
├── frameworks
│ ├── Android.mk
│ └── PlatformLibrary
├── MODULE_LICENSE_APACHE2
├── procts
│ ├── AndroidProcts.mk
│ └── sample_addon.mk
├── README.txt
├── sdk_addon
│ ├── hardware.ini
│ └── manifest.ini
└── skins
└── WVGAMedDpi
Android.mk: 該文件用於編寫構建規則,默認繼承 Android 的 make 框架。
frameworks: 該目錄在這里的意義等同於 Android 源碼中的 frameworks 。
PlatformLibrary: 該目錄就自定義共享庫。
apps: 該目錄用於編寫依賴該庫的應用程序。經過測試也可以用來編寫不依賴該庫的程序,這有個好處,讓開發商可以把自己特有的應用集成到框架中。
client 與 upgrade: 這是兩個依賴該庫的應用程序示例。
procts: 該目錄中的文件對包含該庫與 Android 框架集成的信息,如模塊名稱等。
AndroidProcts.mk: 指明該模塊的 make 配置文件的在哪裡。
sample_addon.mk :模塊的配置信息。
sdk_addon: 該目錄對該庫的硬體需求進行定義。
hardware.ini: 定義模塊對硬體的需求。
manifest.ini: 模塊的說明文件。名稱、供應商等。
skins: 該目錄用於存放自定義皮膚。
WVGAMedDpi: 已經定義好的一套皮膚。
2.如何封裝 Java 共享庫?
PlatformLibrary 為我們展示了封裝 Java 共享庫的方法。其目錄結構如下: frameworks/PlatformLibrary
├── Android.mk
├── com.example.android.platform_library.xml
├── java
│ └── com
│ └── example
│ └── android
│ └── platform_library
│ └── PlatformLibrary.java
└── README.txt
Android.mk: 該文件說明如何構建該模塊。
com.example.android.platform_library.xml: 該文件是模塊注冊時需要的文件。該文件需要被放置到 /system/etc/permissions 目錄下。
Java /*: Java 源碼所在目錄。具體步驟:
a、編寫 Java 庫,並將源碼放到 java 目錄下。這一步和編寫普通 Java 程序沒有差別。
b、編寫 Android.mk,內容如下:
# 獲得當前目錄,清空環境變數
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) # 源碼所在目錄,all-subdir-java-files 表示所有了目錄中的 Java 文件。
LOCAL_SRC_FILES := \
$(call all-subdir-java-files) # 該模塊是可選的。
LOCAL_MODULE_TAGS := optional # Java 模塊名稱
LOCAL_MODULE:= com.example.android.platform_library # 編譯為 Java 庫。最近以 jar 的形式而不是 apk 的形式存在。
include $(BUILD_JAVA_LIBRARY) # 構建該庫的 API 文檔
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(call all-subdir-java-files) $(call all-subdir-html-files)
LOCAL_MODULE:= platform_library
# 文檔對應的庫
LOCAL_DROIDDOC_OPTIONS := com.example.android.platform_library
# 庫的類型
LOCAL_MODULE_CLASS := JAVA_LIBRARIES
LOCAL_DROIDDOC_USE_STANDARD_DOCLET := true # 編譯為 Java API。
include $(BUILD_DROIDDOC)
c、編寫 com.example.android.platform_library.xml,內容如下:
< xml version="1.0" encoding="utf-8" >
<permissions>
<!-- 庫的名稱及對應的 Jar 文件位置 -->
<library name="com.example.android.platform_library"
file="/system/framework/com.example.android.platform_library.jar"/>
</permissions> 現在基本的庫我們已經編寫完成,現在需要對框架中的其它文件進行配置。
d、編寫 sample/frameworks/Android.mk, 內容如下:
# 包含子目錄中的所有 make 文件 include $(call all-subdir-makefiles) 該文件與 sample/Android.mk 文件相同。
e、編寫 sample/sdk_addon/manifest.ini,內容如下: # 該模塊的名稱、供應商及描述
name=Sample Add-On
vendor=Android Open Source Project
description=sample add-on # 構建該模塊的 Android 平台代號
api=3 # 模塊的版本號。必須為整數。
revision=1 # 該模塊中包括的共享庫列表
libraries=com.example.android.platform_library # 對每個庫的詳細定義,格式如下:
# <library.name>=<name>.jar;<desc> # <library.name>: 通過前面 libraies 定義的庫的名稱。
# <name>.jar: 包含庫 API 的 jar 文件。該文件放在 libs/add-on 下面。
com.example.android.platform_library=platform_library.jar;Sample optional plaform library 該文件還可包括該模塊的其它定義,如皮膚等,為了保持該文檔清晰易懂的初衷,這里不做介紹,需要了解可以給我郵件。
f、編寫 sample/procts/sample_addom.mk,內容如下:
# 要植入系統鏡像的應用及可選類庫。可以包括 Java 庫和本地庫。這里我們只有 Java 庫。
PRODUCT_PACKAGES := \ com.example.android.platform_library # 把 xml 文件復制到系統鏡像中相應的位置去。
PRODUCT_COPY_FILES := \ vendor/
sample/frameworks/PlatformLibrary/com.example.android.platform_library.xml:system/etc/permissions/
com.example.android.platform_library.xml # 這個擴展的名稱
PRODUCT_SDK_ADDON_NAME := platform_library # 把模塊的 manifest 和硬體配置文件復制到系統鏡像中相應的位置。 PRODUCT_SDK_ADDON_COPY_FILES := \
vendor/sample/sdk_addon/manifest.ini:manifest.ini \
vendor/sample/sdk_addon/hardware.ini:hardware.in # 把庫的 Jar 包復制到相應的位置。 PRODUCT_SDK_ADDON_COPY_MODULES := \
com.example.android.platform_library:libs/platform_library.jar # 文檔的名稱。必須與。
# LOCAL_MODULE:= platform_library
PRODUCT_SDK_ADDON_DOC_MODULE := platform_library # 這個擴展繼承系統擴展。 $(call inherit-proct, $(SRC_TARGET_DIR)/proct/sdk.mk) # 這個擴展的真實名字。這個名字會用於編譯。
# 用 'make PRODUCT-<PRODUCT_NAME>-sdk_addon' 的形式來編譯此擴展。
PRODUCT_NAME := sample_addon
g、編寫 sample/procts/AndroidProcts.mk,內容如下:
PRODUCT_MAKEFILES := \
$(LOCAL_DIR)/sample_addon.mk h、最後運行make -j8 PRODUCT-sample_addon-sdk_addon,編譯擴展。
至此,我們就完成了 Java 庫的封裝。
3、接下來我們再來看如何通過 JNI 的方式對 C 代碼進行封裝。
a、在 sample/frameworks/PlatformLibrary 目錄下添加一個文件夾,用於放置 JNI 本地代碼,目錄結構如下:
frameworks/PlatformLibrary/jni
├── Android.mk
└── PlatformLibrary.cpp
b、把 frameworks/PlatformLibrary/java/com/example/android/platform_library/PlatformLibrary.java
文件改寫為 JIN 調用介面,代碼如下 : package com.example.android.platform_library; import android.util.Config;
import android.util.Log; public final class PlatformLibrary {
static { / Load the library. If it's already loaded, this does nothing. System.loadLibrary("platform_library_jni");
private int mJniInt = -1; public PlatformLibrary() {} / Test native methods. public int getInt(boolean bad) {
// this alters mJniInt //
int result = getJniInt(bad); // reverse a string, for no very good reason //
String reverse = reverseString("Android!"); Log.i("PlatformLibrary", "getInt: " + result + ", '" + reverse + "'"); return mJniInt; //
/ Simple method, called from native code. private static void yodel(String msg) {
Log.d("PlatformLibrary", "yodel: " + msg); //
/ Trivial native method call. If "bad" is true, this will throw an
/ exception. native private int getJniInt(boolean bad); / Native method that returns a new string that is the reverse of
/ the original. This also calls yodel(). native private static String reverseString(String str);
}
c、在 frameworks/PlatformLibrary/jni/PlatformLibrary.cpp 中編寫 PlatformLibrary.java 中規定本地調用的具體實現。
d、編寫 frameworks/PlatformLibrary/jni/Android.mk,內容如下:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional # JNI 模塊的名稱
LOCAL_MODULE:= libplatform_library_jni # 依賴的源代碼文件
LOCAL_SRC_FILES:= \
PlatformLibrary.cpp # 編譯時需要的庫
LOCAL_SHARED_LIBRARIES := \
libandroid_runtime \
libnativehelper \
libcutils \
libutils # 沒有靜態庫
LOCAL_STATIC_LIBRARIES := # 包含必須的 JNI 頭文件
LOCAL_C_INCLUDES += \
$(JNI_H_INCLUDE) # 編譯器選項
LOCAL_CFLAGS += # 對該模塊不進行預編譯。使用預編譯可以提高模塊的性能。
LOCAL_PRELINK_MODULE := false # 把它編譯成動態共享庫
include $(BUILD_SHARED_LIBRARY) 該文件主要定義了本地庫的名字、依賴、編譯選項及編譯方式。
e、修改 frameworks/PlatformLibrary/Android.mk,在末尾添加如下兩行:
include $(CLEAR_VARS) # 調用子目錄中的 make 文件。
include $(call all-makefiles-under,$(LOCAL_PATH))
f、修改 sdk_addon/sample_addon.mk,在PRODUCT_PACKAGES 中添加該 JNI 本地庫。
PRODUCT_PACKAGES := \
com.example.android.platform_library \
libplatform_library_jni
g、編譯即可。至此,添加 JNI 庫完畢。
4、添加接下來我們再看看如何添加原生應用程序
添加原生應用程序就很簡單了,只需要把按照 Android 應用開發的基本方法,寫好一個應用,該應用可以依賴這個擴展,也可以不依賴。如 sample 中的 client 應用,目錄結構如下: apps/client/
├── AndroidManifest.xml
├── Android.mk
└── src
└── com
└── example
└── android
└── platform_library
└── client
└── Client.java
a、在應用根目錄中添加一個 Android.mk 文件,內容如下:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS) LOCAL_MODULE_TAGS := user # 目標名稱
LOCAL_PACKAGE_NAME := PlatformLibraryClient # 只編譯這個apk包中的java文件
LOCAL_SRC_FILES := $(call all-java-files-under, src) # 使用當前版本的 SDK
LOCAL_SDK_VERSION := current # 依賴使用剛才編寫的擴展
LOCAL_JAVA_LIBRARIES := com.example.android.platform_library include $(BUILD_PACKAGE)
b、在 AndroidManifest.xml 中添加一句:
<uses-library android:name="com.example.android.platform_library" />
c、修改 sdk_addon/sample_addon.mk,在PRODUCT_PACKAGES 中添加該 JNI 本地庫。
PRODUCT_PACKAGES := \
com.example.android.platform_library \
libplatform_library_jni \
PlatformLibraryClient
d、編譯即可。至此,添加 JNI 庫完畢。
5、其他功能如添加皮膚等,這里就不一一示範了,請參考<sdk-src>/vendor/sample。
㈤ Android中什麼時候需要在AndroidManifest.xml中添加聲明
在AndroidManifest.xml中可以:
1.添加許可權聲明。比如要用到網路,添加<uses-permission android:name="android.permission.INTERNET"></uses-permission>;
2.添加新的Activity。比如增加的Home.java類,繼承Activity,添加<activity android:name="Home" android:configChanges="orientation|keyboardHidden|navigation" />
3.為額外的庫添加聲明。比如要用到Google Map的時候,不是Android內部包,引入包後,添加<uses-library android:name="com.google.android.maps"/>
4.程序運行的最低版本聲明。添加<uses-sdk android:minSdkVersion="3"></uses-sdk>
5.為自己的後台Service聲明。添加<service
android:name=".MyService"
android:exported="true"
android:process=":remote" >
</service>
6.其它情況,比如加入Admob廣告:添加<meta-data android:value="yourID" android:name="ADMOB_PUBLISHER_ID"/>;
廣播事件:<receiver android:name="HippoCustomIntentReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="HIPPO_ON_SERVICE_001" />
<category android:name="android.intent.category.HOME" />
</intent-filter>
</receiver>
還有就是修改程序ICON的時候,可以這裡面修改<application android:icon="@drawable/icon" android:label="@string/app_name">
㈥ 如何將一個android library打包成一個可用文件
第一步,把普通的android project設置成庫項目
庫項目也是一個標準的android項目,因此你先創建一個普通的android項目。 這個項目可以起任何的名稱,任何的報名,設置其他需要設置的欄位等,如圖1所示。
接著把項目設置成庫項目,步驟如下
在Package Explorer中, 滑鼠右鍵項目文件夾,點擊 Properties.
在Properties 窗口, 選擇"Android" ,Library 屬性顯示在右下邊.
把"is Library" 單選框選擇上,再點擊 Apply.
點擊 OK 關閉Properties 窗口.
這時,這個項目就變成庫項目了。
當然,java項目也可以讓其變成一個庫項目,非常簡單,執行上面的四步。其他程序項目就可以引用庫項目了。
圖 1.使一個項目為庫項目
創建manifest文件
一個庫項目的manifest文件也和標準的android應用程序一樣,聲明所有共享的組件。
比如APIDemo中的TicTacToeLib 這個例子,庫項目聲明了Activity GameActivity:
<manifest>
...
<application>
...
<activity android:name="GameActivity" />
...
</application>
</manifest>
第二步 引用庫項目
如果你開發的應用程序想要包括庫項目中的代碼和資源,非常簡單,引用步驟如下
在Package Explorer中, 滑鼠右鍵項目文件夾,點擊 Properties.
在Properties 窗口, 選擇"Android" ,Library 屬性顯示在右下邊.
點擊Add ,打開了Project Selection 對話框.
從可用庫項目列表選擇一個項目,然後點擊 OK.
對話框關閉之後點擊 Apply (在Properties 窗口).
點擊 OK 關閉Properties 窗口.
完成以上六步,Eclipse 會重建項目,把庫項目中的內容包含進去。 如圖2所示
圖 2. 讓項目引用一個庫項目
如果你想增加多個庫項目的引用,使用up和down可以設置他們的相對的優先順序和合並順序。工具在合並引用的庫的時候順序是從低優先順序(列表的下面)到高優先順序(列表的上面)。 如果不只一個庫定義了相同的資源ID,這個工具選擇資源時會選擇高優先順序的資源。應用程序自身擁有最高的優先順序,自身的資源zThe application itself has highest priority and its resources are always used in preference to identical resource IDs defined in libraries.
在menifest文件中聲明庫中的組件
在manifest 文件中必須增加對在當前程序中用到的庫項目中的所有的組件 。比如,你必須聲明任何用到的 <activity>, <service>, <receiver>, <provider>等,<permission>, <uses-library>, 和其他類似的元素。
聲明庫項目中的組件時,必須使用包含包名的類全名。
在TicTacToeMain 例子中,聲明庫Activity GameActivity :
<manifest>
...
<application>
...
<activity android:name="com.example.android.tictactoe.library.GameActivity" />
...
</application>
</manifest>
For more information about the manifest file, see the documentation for AndroidManifest.xml.
本答案來自於互聯網僅供參考學習作用
如果您對我的回答有不滿意的地方,還請您繼續追問;
答題不易,互相理解,互相幫助!
㈦ android如何檢測哪些應用有service
ServiceTestCase 繼承於繼承了Junit
框架中的TestCase的AndroidTestCase類。該類中包含有測試應用的許可,控制被測試的應用和Service
等大量方法。同時也提供了模擬的應用(Applcation)和上下文(Context)方便我們可以使Service 獨立於其應用進行測試。
Service
TestCase.setUp()方法在每個測試用例調用之前執行,該方法執行的時候配置測試數據通過復制並獲得當前系統提供的Context.
你可以通過getSystemContext()取得系統的當前Context。如果你重寫setUp()方法的話,第一條語句應該是super.setUp()。setApplication(Application)方法和setContext(Context)方法允許你在Service啟動之前設置模擬的Context和模擬的Application,如果不做設定,將自動為測試指定MockApplication和MockContext。在調用startService()或者bindService()時,ServiceTestcase會自動初始化測試環境。因此,如果需要設定特定的測試環境,必須要在啟動被測Service之前創建需要模擬的對象等等。
需要注意的是ServiceTestCase
.bindService()方法和Service.bindService()方法的參數不同的:ServiceTestCase.bindService()
方法只需要提供Intent對象,而Service.bindService()還需要指定ServiceConnection和flag。而且ServiceTestCase.bindService()方法返回一個IBinder對象的子類,而Service.bindService
()返回的是布爾值。
在每條測試用例運行結束後,teardown()方法會按照Service的生命周期進行回收。比如,通過bindService()方法啟動Service的情況下,teardown()方法會自動依次調用該Service的onUnbind()方法和onDestroy()方法。
ServiceTestCase默認會執行()方法。用於驗證該測試類是否在運行其他測試用例之前成功地設置了上下文。
下面以SAF的Security組件的API測試為例,描述測試整個過程:
首先Security組件對外提供的API是以AIDL方式暴露的兩個方法
int getAgentVersionCode()
String exec(String[] args, String directory, boolean noResult, boolean
isSync)
因此需要使用ServiceTestCase的bindService()方法來進行測試。
首先新建測試工程,修改AndroidManifest.xml
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<uses-library android:name="android.test.runner" >
</uses-library>
</application>
<instrumentation
android:name=".TestRunner"
android:targetPackage="saf.cmcc.security.agent" >
</instrumentation>
指定被測應用包名,指定TestRunner,聲明使用android.test.runner庫。
新建TestRunner類
public class TestRunner extends InstrumentationTestRunner {
@Override
public
TestSuite getAllTests() {
InstrumentationTestSuite
suite = new InstrumentationTestSuite(this);
suite.addTestSuite(ApiTest.class);
return
suite;
}
}
新建測試類ApiTest
public class ApiTest extends ServiceTestCase<SecurityService> {
public
ApiTest() {
super(SecurityService.class);
}
protected void
setUp() throws Exception {
Log.e(getName(), "setUp...");
super.setUp();
}
protected void
teardown() throws Exception {
Log.e(getName(),
"tearDown...");
super.tearDown();
}
/**
* Test bind
service
*/
public void
testBindable() {
Intent
startIntent = new Intent();
startIntent.setClass(getSystemContext(),
SecurityService.class);
IBinder
service = bindService(startIntent);
assertEquals(true,
service.isBinderAlive());
}
/**
* Test
getAgentVersionCode
*/
public void
testGetAgentVersionCode() {
Intent
startIntent = new Intent();
startIntent.setClass(getSystemContext(),
SecurityService.class);
IBinder
service = bindService(startIntent);
if
(service.isBinderAlive()) {
SecurityAgent
securityAgent = SecurityAgent.Stub
.asInterface(service);
int
versionCode = 0;
try {
versionCode
= securityAgent.getAgentVersionCode();
} catch
(RemoteException e) {
// TODO
Auto-generated catch block
e.printStackTrace();
}
assertEquals(2,
versionCode);
}
}
}
使用與被測應用相同簽名編譯安裝測試apk,即可運行測試了
㈧ 如何創建Android庫以及Android aar文件詳解
創建 Android 庫
Android 庫在結構上與 Android 應用模塊相同。它可以提供構建應用所需的一切內容,包括源代碼、資源文件和 Android 清單。不過,Android 庫將編譯到您可以用作 Android 應用模塊依賴項的 Android 歸檔 (AAR:Android Archive Resource) 文件,而不是在設備上運行的 APK。與 JAR 文件不同,AAR 文件可以包含 Android 資源和一個清單文件,這樣,除了 Java 類與方法外,您還可以捆綁布局和可繪制對象等共享資源。
庫模塊在以下情況下非常有用:
構建使用某些相同組件(例如 Activity、服務或 UI 布局)的多個應用。
構建存在多個 APK 變體(例如免費版本和付費版本)的應用並且需要在兩種版本中使用相同的核心組件。
在任何一種情況下,只需要將您希望重用的文件移動到庫模塊中,然後以依賴項的形式為每個應用模塊添加庫。本頁面將說明如何執行這兩個操作。
創建庫模塊
要在您的項目中創建一個新的庫模塊,請按以下步驟操作:
1、點擊** File > New > New Mole。**
2、在出現的 Create New Mole 窗口中,依次點擊** Android Library 和 Next。還存在一個用於創建 Java 庫的選項,可以構建傳統的 JAR 文件。盡管 JAR 文件在大多數項目中都非常實用(尤其在您希望與其他平台共享代碼時),但這種文件不允許您包含 Android 資源或清單文件,而後者對於 Android 項目中的代碼重用非常有用。**因此,本指南將側重論述創建 Android 庫。
3、為您的庫命名,並為庫中代碼選擇一個最低的 SDK 版本,然後點擊 Finish。
在 Gradle 項目同步完成後,庫模塊將顯示左側的 Project 面板中。如果您未看到新模塊文件夾,請確保將視圖切換為 Android 視圖。
將應用模塊轉換為庫模塊
如果您現有的應用模塊包含您希望重用的所有代碼,則可以按照以下步驟將其轉換為庫模塊:
1、打開現有應用模塊的 build.gradle 文件。您應在頂部看到以下內容:
2、按照下面所示更改插件分配:
3、點擊 Sync Project with Gradle Files。
就這么簡單。模塊的整個結構仍然相同,但是現在它將作為 Android 庫運行,構建也將創建一個 AAR 文件,而不是 APK。
生成aar
在Android Studio1.4中,New project,先默認新建一個Applicaton mole,接後File > New > New Mole,選擇Androd Library > Next,指定Library Name和Mole Name。
新建的Library與正常的Application最大區別是mole build.gradle中是**apply plugin: 『com.android.library』 **而不是 apply plugin: 'com.android.application'
Build > Make project,自動生成aar文件。
以依賴項形式添加您的庫
要在另一個應用模塊中使用您的 Android 庫的代碼,請按以下步驟操作:
1、通過兩種方式之一將庫添加到您的項目(如果您是在相同項目中創建的庫模塊,則該模塊已經存在,您可以跳過此步驟):
添加已編譯的 AAR(或 JAR)文件:
1、點擊 File > New Mole。
2、依次點擊 Import .JAR/.AAR Package 和** Next**。
3、輸入 AAR 或 JAR 文件的位置,然後點擊 Finish。
將庫模塊導入到您的項目中:
1、點擊** File > New > Import Mole。**
2、輸入庫模塊目錄的位置,然後點擊 Finish。
庫模塊將復制到您的項目中,因此您可以盡管編輯庫代碼。如果您希望維護一個版本的庫代碼,則此方法可能不是您想要的,您應按照上文所述導入編譯的 AAR 文件。
2、確保庫列在您 settings.gradle 文件的頂部,如下面名為「my-library-mole」的庫所示:
3、打開應用模塊的 build.gradle 文件,並向 dependencies 塊中添加一行新代碼,如下面的片段所示:
4、點擊 Sync Project with Gradle Files。
在上面的示例中,名為 my-library- mole 的 Android 庫模塊成為 build.gradle 文件所在模塊的構建依賴項。
您的應用模塊現在可以訪問 Android 庫中的任何代碼和資源,庫 AAR 文件在構建時已捆綁到您的 APK 中。
不過,如果希望單獨共享 AAR 文件,則可以在 項目名稱/模塊名稱/build/outputs/aar/ 中找到它,也可以通過點擊 Build > Make Project 的方式重新生成此文件。
選擇要設為公開的資源
庫中的所有資源在默認情況下均處於公開狀態。要將所有資源隱式設為私有,您必須至少將一個特定的屬性定義為公開。資源包括您項目的 res/ 目錄中的所有文件,例如圖像。要阻止您的庫用戶訪問僅供內部使用的資源,您應通過聲明一個或多個公開資源的方式來使用這種自動私有標識機制。
要刪除某個公開資源,請將一個聲明添加到您的庫的 public.xml文件中。如果您之前尚未添加公開資源,則需要在您的庫的 res/values/目錄中創建public.xml 文件。
下面的示例代碼可以創建兩個名稱分別為 mylib_app_name和 mylib_public_string 的公開字元串資源:
android {
defaultConfig {
consumerProguardFiles 'lib-proguard-rules.txt'
}
...
}
dependencies {
debugCompile project(path: ':library', configuration: 'debug')
releaseCompile project(path: ':library', configuration: 'release')
}
android {
...
publishNonDefault true
}```
不過請注意,設置 publishNonDefault會增加構建時間。
為了確保您的庫的 ProGuard 規則不會將意外的壓縮副作用施加到應用模塊,請僅包含適當規則,停用不適用於此庫的 ProGuard 功能。嘗試協助開發者的規則可能會與應用模塊或它的其他庫中的現有代碼沖突,因此不應包含這些規則。例如,您的庫的 ProGuard 文件可以指定在應用模塊的壓縮期間需要保留的代碼。
註:Jack 工具鏈僅支持 ProGuard 的部分壓縮和模糊選項。
AAR 文件詳解
AAR 文件的文件擴展名為 .aar,Maven 工件類型也應當是 aar。文件本身是一個包含以下強制性條目的 zip文件:
/AndroidManifest.xml
/classes.jar
/res/
/R.txt
此外,AAR 文件可能包含以下可選條目中的一個或多個:
/assets/
/libs/**名稱 **.jar
/jni/abi 名稱 /名稱.so(其中 abi 名稱是 Android 支持的 ABI 之一)
/proguard.txt
/lint.jar
㈨ android的問題,剛才在eclipse上改了點程序,之後運行一看,結果eclipse提示找不到launch,請問怎麼辦
頭一回 遇到你說的問題,你在androidmanifest文件里修改了東西吧 。這里相當於總的調度,你需要好好看一下再改動!
AndroidManifest.xml文件綜合詳解
文章分類:移動開發
一,重要性AndroidManifest.xml是Android應用程序中最重要的文件之一。它是Android程序的全局配置文件,是每個 android程序中必須的文件。它位於我們開發的應用程序的根目錄下,描述了package中的全局數據,包括package中暴露的組件(activities, services, 等等),以及他們各自的實現類,各種能被處理的數據和啟動位置等重要信息。
因此,該文件提供了Android系統所需要的關於該應用程序的必要信息,即在該應用程序的任何代碼運行之前系統所必須擁有的信息。一個典型的Android應用程序的結構如下圖所示:
二,主要功能它指定了該應用程序的Java包:該包名作為應用程序的一個獨特標識。
它描述了應用程序組件:該應用程序由哪些activity,service,broadcast receiver和content provider組成。它指定了實現每個組件的類以及公開發布它們的能力(例如,它們能持有哪個Intent信息)。這些聲明使Android系統知道這兒有什麼組件以及在什麼條件下它們可以被載入。
它決定那些進程將容納應用程序組件。
它聲明了本應用程序必須擁有哪些許可,以便訪問API的被保護部分,以及與其他應用程序交互。
它也聲明了其他應用程序在和該應用程序交互時需要持有的許可。
它列出了Instrumentation類,可以在應用程序運行時提供簡檔和其他信息。這些聲明僅當應用程序在開發和測試過程中被提供;它們將在應用程序正式發布之前被移除。
它聲明了該應用程序所需的Android API的最小化水平。
它列出了該應用程序必須鏈接的庫。
三,主要結構及規則下面列表顯示了manifest文件的通常的結構以及它可以含有的元素。每個元素,連同它的所有屬性,會在各個單獨的文檔里進行充分的描繪。
<?xml version="1.0" encoding="utf-8"?>
<manifest> //根節點,描述了package中所有的內容
<uses-permission /> //請求你的package正常運作所需賦予的安全許可。一個manifest能包含零個或更多此元素
<permission /> //聲明了安全許可來限制哪些程序能使用你的package中的組件和功能。一個manifest能包含零個或更多此元素
<permission-tree />
<permission-group />
<instrumentation /> //聲明了用來測試此package或其他package指令組件的代碼。一個manifest能包含零個或更多此元素
<uses-sdk /> //指定當前應用程序兼容的最低sdk版本號
<application> //包含package中application級別組件聲明的根節點。此元素也可包含 application中全局和默認的屬性,如標簽,icon,主題,必要的許可權,等等。一個manifest能包含零個或一個此元素(不允許多餘一個)
<activity> //用來與用戶交互的主要工具。當用戶打開一個應用程序的初始頁面時一個activity,大部分被使用到的其他頁面也由不同的activity所實現並聲明在另外的activity標記中。
<intent-filter> //聲明了指定的一組組件支持的Intent值
<action />
<category />
<data />
<type/>
<schema/>
<authority/>
<path/>
</intent-filter>
<meta-data />
</activity>
<activity-alias>
<intent-filter> . . . </intent-filter>
<meta-data />
</activity-alias>
<service> //Service是能在後台運行任意時間的組件
<intent-filter> . . . </intent-filter>
<meta-data/>
</service>
<receiver> //IntentReceiver能使你的application獲得數據的改變或者發生的操作,即使它當前不在運行
<intent-filter> . . . </intent-filter>
<meta-data />
</receiver>
<provider> //ContentProvider是用來管理持久化數據並發布給其他應用程序使用的組件
<grant-uri-permission />
<meta-data />
</provider>
<uses-library />
<uses-configuration />
</application>
</manifest>
下面是按照字母順序排列的所有可以出現在manifest文件里的元素。它們是唯一合法的元素;你不能加入你自己的元素或屬性。
<action>
<activity>
<activity-alias>
<application>
<category>
<data>
<grant-uri-permission>
<instrumentation>
<intent-filter>
<manifest>
<meta-data>
<permission>
<permission-group>
<permission-tree>
<provider>
<receiver>
<service>
<uses-configuration>
<uses-library>
<uses-permission>
<uses-sdk>
說明:AndroidManifest.xml文件的結構、元素,以及元素的屬性,可以在Android SDK文檔中查看詳細說明。而在看這些眾多的元素以及元素的屬性前,需要先了解一下這些元素在命名、結構等方面的規則:
元素:在所有的元素中只有<manifest>和<application>是必需的,且只能出現一次。如果一個元素包含有其他子元素,必須通過子元素的屬性來設置其值。處於同一層次的元素,這些元素的說明是沒有順序的。
屬性:按照常理,所有的屬性都是可選的,但是有些屬性是必須設置的。那些真正可選的屬性,即使不存在,其也有默認的數值項說明。除了根元素<manifest>的屬性,所有其他元素屬性的名字都是以android:前綴的;
定義類名:所有的元素名都對應其在SDK中的類名,如果你自己定義類名,必須包含類的數據包名,如果類與application處於同一數據包中,可以直接簡寫為「.」;
多數值項:如果某個元素有超過一個數值,這個元素必須通過重復的方式來說明其某個屬性具有多個數值項,且不能將多個數值項一次性說明在一個屬性中;
資源項說明:當需要引用某個資源時,其採用如下格式:@[package :]type :name 。 例如 <activity android:icon=」@drawable/icon 」 . . . >
字元串值:類似於其他語言,如果字元中包含有字元「\」,則必須使用轉義字元「\\」;
四,詳細說明值得一提一些常用之處:
1,幾乎所有的AndroidManifest.xml(以及許多其他Android的xml的文件)在第一個元素中包含了命名空間的聲明 xmlns:android="http://schemas.android.com/apk/res/android"。這樣使得Android中各種標准屬性能在文件中使用,提供了大部分元素中的數據。
2,大部分manifests包含了單個<application>的元素,它定義了所有的application級別組件和屬性,並能在package中使用。
3,任何被用戶看作頂層應用程序,並能被程序啟動器所用的package,需要包含至少一個Activity組件來支持MAIN操作和LAUNCHER種類。動作android.intent.action.MAIN指示這是應用程序的入口點。類別 android.intent.category.LAUNCHER將此Activity放在啟動器窗口中。
在最外層的<manifest>中包含了包名如 package="cn.androidlover.demo" 、軟體的版本號 android:versionCode="1" 以及 android:versionName="1.0"的屬性,而裡面一層的<application>分支中將可能包含Android程序的四種對象 Activity、Service、Content Provider以及Receiver。我們每添加上面四個類型中的任一種新對象都需要在androidmanifest.xml文件中添加相應節點,否則運行時將會產生異常。每一個activity必須要一個<activity>標記對應,無論它給外部使用或是只用於自己的package 中。如果一個activity沒有對應的標記,你將不能運行它。
此文件一個重要的地方就是它所包含的intent-filters。這些filters描述了activity啟動的位置和時間。每當一個 activity(或者操作系統)要執行一個操作,例如:打開網頁或聯系簿時,它創建出一個intent的對象。它能承載一些信息描述了你想做什麼,你想處理什麼數據,數據的類型,和一些其他信息。Android比較了intent對象中和每個application所暴露的intent-filter中的信息,來找到最合適的activity來處理調用者所指定的數據和操作。關於intent的更多信息請訪問Intent參考頁面。
application屬性介紹:
有關AndroidManifest.xml文件的application分支我們有必要了解一些常見的屬性,這里可以看到一些我們實用的選項,比如允許調試android:debuggable、任務關系android:taskAffinity,比如我們常見的方式創建一個新的任務實用標記 FLAG_ACTIVITY_NEW_TASK,為程序制定一個主題,可以使用android:theme指向一個主題文件。平時我們創建的程序使用一些安全敏感項,會需要請求系統許可許可權,這里可以使用android:permission來制定相關的許可,每個程序的service、 activity、content provider、receiver都需要在application的節點內實現。有關完整的屬性可以查看:
<application android:allowClearUserData=["true" | "false"]
android:allowTaskReparenting=["true" | "false"]
android:debuggable=["true" | "false"]
android:description="string resource"
android:enabled=["true" | "false"]
android:hasCode=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:manageSpaceActivity="string"
android:name="string"
android:permission="string"
android:persistent=["true" | "false"]
android:process="string"
android:taskAffinity="string"
android:theme="resource or theme" >
. . .
</application>
另外:Activity的屬性常用的可能為android:name和android:label兩個,但我們需要了解所有的屬性以幫助解決復雜的問題,完整的如下:
android:allowTaskReparenting=["true" | "false"]
android:alwaysRetainTaskState=["true" | "false"]
android:clearTaskOnLaunch=["true"" | "false"]
android:configChanges=[one or more of: "mcc" "mnc" "locale" "touchscreen" "keyboard" "keyboardHidden" "navigation" "orientation" "fontScale"]
android:enabled=["true" | "false"]
android:excludeFromRecents=["true" | "false"]
android:exported=["true" | "false"]
android:finishOnTaskLaunch=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:launchMode=["multiple" | "singleTop" | "singleTask" | "singleInstance"]
android:multiprocess=["true" | "false"]
android:name="string"
android:noHistory=["true" | "false"]
android:permission="string"
android:process="string"
android:screenOrientation=["unspecified" | "user" | "behind" | "landscape" | "portrait" | "sensor" | "nonsensor"]
android:stateNotNeeded=["true" | "false"]
android:taskAffinity="string"
android:theme="resource or theme"
android:windowSoftInputMode=[one or more of: "stateUnspecified" "stateUnchanged" "stateHidden" "stateAlwaysHidden" "stateVisible" "stateAlwaysVisible" "adjustUnspecified" "adjustResize" "adjustPan"]
從Provider節點中用到的定義,可以看到包含了許可權控制、排序方式完整的如下:
<provider android:authorities="list"
android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:grantUriPermissions=["true" | "false"]
android:icon="drawable resource"
android:initOrder="integer"
android:label="string resource"
android:multiprocess=["true" | "false"]
android:name="string"
android:permission="string"
android:process="string"
android:readPermission="string"
android:syncable=["true" | "false"]
android:writePermission="string" >
</provider>
而對於服務相關定義如下:
<service android:enabled=["true" | "false"]
android:exported[="true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:permission="string"
android:process="string" >
</service>
最後是Broadcast使用的Receiver定義,一般配合和隱式處理。
<receiver android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:permission="string"
android:process="string" >
</receiver>
總之,AndroidManifest.xml文件雖然看起來復雜,但是,只要我們理清中裡面各元素的作用,那麼一切就變得簡單了。
㈩ 如何在Android真機上檢測是否有Google Map add-on
方法有兩個:
1)維護兩條代碼分支:
一條分支是針對於內置有Google Map add-on的Android真機,另一條分支是沒有內置有Google Map add-on的Android真機。
但是這樣做會增加維護成本,而且粗心的用戶可能會在自己的機器上安裝了不匹配的分支,從而降低了軟體的友好度。
2)仍然只保留一條代碼分支:
國外一位大牛指出:在<uses-library>標簽中還包含了一個沒有公布的屬性"android:required",你可以將com.google.android.maps庫的這個屬性設置為false,即:
<!-- The "android:required" attribute was added in API level 5 (Android 2.0) -->
<uses-library android:name="com.google.android.maps" android:required="false" />
這代表如果在目標機器上內置了Google Map add-on,則可以正常使用應用;如果目標機器沒有內置Google Map add-on,也可以成功安裝應用。但是開發人員需要在代碼中自行判斷Google Map add-on是否可用,