導航:首頁 > 操作系統 > libcryptoandroid

libcryptoandroid

發布時間:2023-03-15 13:52:23

安卓系統/system/lib/目錄下libcutils.so這個文件有什麼作用

lib目錄中存放的主要是系統底層庫,如平台運行時庫。
而libcutils.so是屬於加密組件
下面這些都是加密組件其中包含libcutils.so
\\system\\lib\\libcrypto.so
\\system\\lib\\libctest.so
\\system\\lib\\libcutils.so
\\system\\lib\\libdbus.so
\\system\\lib\\libdl.so
你要是有興趣研究,這里有一份比較詳細的安卓組件作用目錄
\\system\\app\\AlarmClock.apk 鬧鍾
\\system\\app\\AlarmClock.odex
\\system\\app\\Browser.apk 瀏覽器
\\system\\app\\Browser.odex
\\system\\app\\Bugreport.apk Bug報告
\\system\\app\\Bugreport.odex
\\system\\app\\Calculator.apk 計算器
\\system\\app\\Calculator.odex
\\system\\app\\Calendar.apk 日歷
\\system\\app\\Calendar.odex
\\system\\app\\CalendarProvider.apk 日歷提供
\\system\\app\\CalendarProvider.odex
\\system\\app\\Camera.apk 照相機
\\system\\app\\Camera.odex
\\system\\app\\com.amazon.mp3.apk 亞馬遜音樂
\\system\\app\\Contacts.apk 聯系人
\\system\\app\\Contacts.odex
\\system\\app\\DownloadProvider.apk 下載提供
\\system\\app\\DownloadProvider.odex
\\system\\app\\DrmProvider.apk DRM數字版權提供
\\system\\app\\DrmProvider.odex
\\system\\app\\Email.apk 電子郵件客戶端
\\system\\app\\Email.odex
\\system\\app\\FieldTest.apk 測試程序
\\system\\app\\FieldTest.odex
\\system\\app\\GDataFeedsProvider.apk GoogleData提供
\\system\\app\\GDataFeedsProvider.odex
\\system\\app\\Gmail.apk Gmail電子郵件
\\system\\app\\Gmail.odex
\\system\\app\\GmailProvider.apk Gmail提供
\\system\\app\\GmailProvider.odex
\\system\\app\\GoogleApps.apk 谷歌程序包
\\system\\app\\GoogleApps.odex
\\system\\app\\GoogleSearch.apk 搜索工具
\\system\\app\\GoogleSearch.odex
\\system\\app\\gtalkservice.apk GTalk服務
\\system\\app\\gtalkservice.odex
\\system\\app\\HTMLViewer.apk HTML查看器
\\system\\app\\HTMLViewer.odex
\\system\\app\\IM.apk 即使通訊組件包含MSN、yahoo通
\\system\\app\\ImCredentialProvider.apk
\\system\\app\\ImProvider.apk
\\system\\app\\ImProvider.odex
\\system\\app\\Launcher.apk 啟動載入器
\\system\\app\\Launcher.odex
\\system\\app\\Maps.apk 電子地圖
\\system\\app\\Maps.odex
\\system\\app\\MediaProvider.apk 多媒體播放提供
\\system\\app\\MediaProvider.odex
\\system\\app\\Mms.apk 簡訊、彩信
\\system\\app\\Mms.odex
\\system\\app\\Music.apk 音樂播放器
\\system\\app\\Music.odex
\\system\\app\\MyFaves.apk T-Mobile MyFaves程序
\\system\\app\\MyFaves.odex
\\system\\app\\PackageInstaller.apk apk安裝程序
\\system\\app\\PackageInstaller.odex
\\system\\app\\Phone.apk 電話撥號器
\\system\\app\\Phone.odex
\\system\\app\\Settings.apk 系統設置
\\system\\app\\Settings.odex
\\system\\app\\SettingsProvider.apk 設置提供
\\system\\app\\SettingsProvider.odex
\\system\\app\\SetupWizard.apk 設置向導
\\system\\app\\SetupWizard.odex
\\system\\app\\SoundRecorder.apk 錄音工具
\\system\\app\\SoundRecorder.odex
\\system\\app\\Street.apk 街景地圖
\\system\\app\\Street.odex
\\system\\app\\Sync.apk 同步程序
\\system\\app\\Sync.odex
\\system\\app\\Talk.apk 語音程序
\\system\\app\\Talk.odex
\\system\\app\\TelephonyProvider.apk 電話提供
\\system\\app\\TelephonyProvider.odex
\\system\\app\\Updater.apk 更新程序
\\system\\app\\Updater.odex
\\system\\app\\Vending.apk 製造商信息
\\system\\app\\Vending.odex
\\system\\app\\VoiceDialer.apk 語音撥號器
\\system\\app\\VoiceDialer.odex
\\system\\app\\YouTube.apk Youtube視頻
\\system\\app\\YouTube.odex

\\system\\bin
這個目錄下的文件都是系統的本地程序,從bin文件夾名稱可以看出是binary二進制的程序,裡面主要是linux系統自帶的組件,android手機網就主要文件做下簡單的分析介紹:
\\system\\bin\\akmd
\\system\\bin\\am
\\system\\bin\\app_process 系統進程
\\system\\bin\\dalvikvm Dalvik虛擬機宿主
\\system\\bin\\dbus-daemon 系統BUS匯流排監控
\\system\\bin\\debuggerd 調試器
\\system\\bin\\debug_tool 調試工具
\\system\\bin\\dexopt DEX選項
\\system\\bin\\dhcpcd DHCP伺服器
\\system\\bin\\mpstate 狀態抓取器
\\system\\bin\\mpsys 系統抓取器
\\system\\bin\\dvz
\\system\\bin\\fillup
\\system\\bin\\flash_image 快閃記憶體映像
\\system\\bin\\hciattach
\\system\\bin\\hcid HCID內核
\\system\\bin\\hostapd
\\system\\bin\\hostapd_cli
\\system\\bin\\htclogkernel
\\system\\bin\\input
\\system\\bin\\installd
\\system\\bin\\itr
\\system\\bin\\linker
\\system\\bin\\logcat Logcat日誌列印
\\system\\bin\\logwrapper
\\system\\bin\\mediaserver
\\system\\bin\\monkey
\\system\\bin\\mountd 存儲掛載器
\\system\\bin\\netcfg 網路設置
\\system\\bin\\ping Ping程序
\\system\\bin\\playmp3 MP3播放器
\\system\\bin\\pm 包管理器
\\system\\bin\\qemud QEMU虛擬機
\\system\\bin\\radiooptions 無線選項
\\system\\bin\\rild RIL組件
\\system\\bin\\sdptool
\\system\\bin\\stil
\\system\\bin\\service
\\system\\bin\\servicemanager 服務管理器
\\system\\bin\\sh
\\system\\bin\\ssltest SSL測試
\\system\\bin\\surfaceflinger 觸摸感應驅動
\\system\\bin\\svc 服務
\\system\\bin\\system_server
\\system\\bin\\telnetd Telnet組件
\\system\\bin\\toolbox
\\system\\bin\\wlan_loader
\\system\\bin\\wpa_cli
\\system\\bin\\wpa_supplicant

\\system\\etc
從文件夾名稱來看保存的都是系統的配置文件,比如APN接入點設置等核心配置。
\\system\\etc\\apns-conf.xml APN接入點配置文件
\\system\\etc\\AudioFilter.csv 音頻過濾器配置文件
\\system\\etc\\AudioPara4.csv
\\system\\etc\\bookmarks.xml 書簽資料庫
\\system\\etc\\dbus.conf 匯流排監視配置文件
\\system\\etc\\dhcpcd
\\system\\etc\\event-log-tags
\\system\\etc\\favorites.xml 收藏夾
\\system\\etc\\firmware 固件信息
\\system\\etc\\gps.conf GPS設置文件
\\system\\etc\\hcid.conf內核HCID配置文件
\\system\\etc\\hosts 網路DNS緩存
\\system\\etc\\init.goldfish.sh
\\system\\etc\\location 定位相關
\\system\\etc\\mountd.conf 存儲掛載配置文件
\\system\\etc\\NOTICE.html 提示網頁
\\system\\etc\\permissions.xml 許可權許可
\\system\\etc\\pvplayer.conf
\\system\\etc\\security
\\system\\etc\\wifi WLAN相關組件
\\system\\etc\\dhcpcd\\dhcpcd-hooks
\\system\\etc\\dhcpcd\\dhcpcd-run-hooks
\\system\\etc\\dhcpcd\\dhcpcd.conf
\\system\\etc\\dhcpcd\\dhcpcd-hooks\\01-test
\\system\\etc\\dhcpcd\\dhcpcd-hooks\\20-dns.conf
\\system\\etc\\dhcpcd\\dhcpcd-hooks\\95-configured
\\system\\etc\\firmware\\brf6300.bin
\\system\\etc\\location\\gps
\\system\\etc\\location\\gps\\location 定位相關
\\system\\etc\\location\\gps\\nmea GPS數據解析
\\system\\etc\\location\\gps\\properties
\\system\\etc\\security\\cacerts.bks
\\system\\etc\\security\\otacerts.zip OTA下載驗證
\\system\\etc\\wifi\\Fw1251r1c.bin
\\system\\etc\\wifi\\tiwlan.ini
\\system\\etc\\wifi\\wpa_supplicant.conf WPA驗證組件

\\system\\fonts
字體文件夾,除了標准字體和粗體、斜體外可以看到文件體積最大的可能是中文字型檔,或一些unicode字型檔,從T-Mobile G1上可以清楚的看到顯示簡體中文正常,其中DroidSansFallback.ttf文件大小
\\system\\fonts\\DroidSans-Bold.ttf
\\system\\fonts\\DroidSans.ttf
\\system\\fonts\\DroidSansFallback.ttf
\\system\\fonts\\DroidSansMono.ttf
\\system\\fonts\\DroidSerif-Bold.ttf
\\system\\fonts\\DroidSerif-BoldItalic.ttf
\\system\\fonts\\DroidSerif-Italic.ttf
\\system\\fonts\\DroidSerif-Regular.ttf

\\system\\framework
framework主要是一些核心的文件,從後綴名為jar可以看出是是系統平台框架。
\\system\\framework\\am.jar
\\system\\framework\\am.odex
\\system\\framework\\android.awt.jar AWT庫
\\system\\framework\\android.awt.odex
\\system\\framework\\android.policy.jar
\\system\\framework\\android.policy.odex
\\system\\framework\\android.test.runner.jar
\\system\\framework\\android.test.runner.odex
\\system\\framework\\com.google.android.gtalkservice.jar GTalk服務
\\system\\framework\\com.google.android.gtalkservice.odex
\\system\\framework\\com.google.android.maps.jar 電子地圖庫
\\system\\framework\\com.google.android.maps.odex
\\system\\framework\\core.jar 核心庫,啟動桌面時首先載入這個
\\system\\framework\\core.odex
\\system\\framework\\ext.jar
\\system\\framework\\ext.odex
\\system\\framework\\framework-res.apk
\\system\\framework\\framework-tests.jar
\\system\\framework\\framework-tests.odex
\\system\\framework\\framework.jar
\\system\\framework\\framework.odex
\\system\\framework\\input.jar 輸入庫
\\system\\framework\\input.odex
\\system\\framework\\itr.jar
\\system\\framework\\itr.odex
\\system\\framework\\monkey.jar
\\system\\framework\\monkey.odex
\\system\\framework\\pm.jar 包管理庫
\\system\\framework\\pm.odex
\\system\\framework\\services.jar
\\system\\framework\\services.odex
\\system\\framework\\ssltest.jar
\\system\\framework\\ssltest.odex
\\system\\framework\\svc.jar 系統服務
\\system\\framework\\svc.odex

\\system\\lib
lib目錄中存放的主要是系統底層庫,如平台運行時庫。
\\system\\lib\\libaes.so
\\system\\lib\\libagl.so
\\system\\lib\\libandroid_runtime.so Android運行時庫
\\system\\lib\\libandroid_servers.so 系統服務組件
\\system\\lib\\libaudio.so 音頻處理
\\system\\lib\\libaudioeq.so EQ均衡器
\\system\\lib\\libaudioflinger.so 音頻過濾器
\\system\\lib\\libbluetooth.so 藍牙組件
\\system\\lib\\libc.so
\\system\\lib\\libcamera.so 超相機組件
\\system\\lib\\libcameraservice.so
\\system\\lib\\libcorecg.so
\\system\\lib\\libcrypto.so 加密組件
\\system\\lib\\libctest.so
\\system\\lib\\libcutils.so
\\system\\lib\\libdbus.so
\\system\\lib\\libdl.so
\\system\\lib\\libdrm1.so DRM解析庫
\\system\\lib\\libdrm1_jni.so
\\system\\lib\\libdvm.so
\\system\\lib\\libexif.so
\\system\\lib\\libexpat.so
\\system\\lib\\libFFTEm.so
\\system\\lib\\libGLES_CM.so
\\system\\lib\\libgps.so
\\system\\lib\\libhardware.so
\\system\\lib\\libhgl.so
\\system\\lib\\libhtc_ril.so
\\system\\lib\\libicudata.so
\\system\\lib\\libicui18n.so
\\system\\lib\\libicuuc.so
\\system\\lib\\liblog.so
\\system\\lib\\libm.so
\\system\\lib\\libmedia.so
\\system\\lib\\libmediaplayerservice.so
\\system\\lib\\libmedia_jni.so
\\system\\lib\\libnativehelper.so
\\system\\lib\\libnetutils.so
\\system\\lib\\libOmxCore.so
\\system\\lib\\libOmxH264Dec.so
\\system\\lib\\libpixelflinger.so
\\system\\lib\\libpvasf.so
\\system\\lib\\libpvasfreg.so
\\system\\lib\\libpvauthor.so
\\system\\lib\\libpvcommon.so
\\system\\lib\\libpvdownload.so
\\system\\lib\\libpvdownloadreg.so
\\system\\lib\\libpvmp4.so
\\system\\lib\\libpvmp4reg.so
\\system\\lib\\libpvnet_support.so
\\system\\lib\\libpvplayer.so
\\system\\lib\\libpvrtsp.so
\\system\\lib\\libpvrtspreg.so
\\system\\lib\\libqcamera.so
\\system\\lib\\libreference-ril.so
\\system\\lib\\libril.so
\\system\\lib\\librpc.so
\\system\\lib\\libsgl.so
\\system\\lib\\libsonivox.so
\\system\\lib\\libsoundpool.so
\\system\\lib\\libsqlite.so
\\system\\lib\\libssl.so
\\system\\lib\\libstdc++.so
\\system\\lib\\libsurfaceflinger.so
\\system\\lib\\libsystem_server.so
\\system\\lib\\libthread_db.so
\\system\\lib\\libUAPI_jni.so
\\system\\lib\\libui.so
\\system\\lib\\libutils.so
\\system\\lib\\libvorbisidec.so
\\system\\lib\\libwbxml.so
\\system\\lib\\libwbxml_jni.so
\\system\\lib\\libwebcore.so
\\system\\lib\\libwpa_client.so
\\system\\lib\\libxml2wbxml.so
\\system\\lib\\libz.so
\\system\\lib\\moles
\\system\\lib\\moles\\wlan.ko

❷ 怎麼使用Android源碼編譯c模塊生成可執行文件

1. 在./development目錄下創建一目錄 如:myhello
2. 進入hello目錄,在其下編寫自己的.c文件,如: myhello.c
#include <stdio.h>
int main()
{
printf("hello world\n");
exit(0);
//return 0;
}
3. 在hello目錄中,編寫Android.mk, 內容如下:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := myhelloworld
LOCAL_SRC_FILES := myhello.c
LOCAL_MODULE_TAGS := optional
include $(BUILD_EXECUTABLE)
4. 回到Android源代碼頂層目錄,進行編譯,make myhelloworld
5. 生成的可執行文件位於:out/target/proct/lotus/system/bin/ 目錄下
6. adb push 到手機 /data 目錄下,然後進入adb shell,到data目錄下,執行./myhelloworld 皆可

手動編譯連接【arm-eabi-gcc 的目錄隨andorid的版本而有變化,還有就是需要鏈接的文件如果比較多時,需要很多-l 就很麻煩了】
7、編譯成目標文件:
#$(yourAndroid)/prebuilt/linux-x86/toolchain/[arm-eabi-4.2.1]/bin/arm-eabi-gcc -I bionic/libc/arch-arm/include/ -I bionic/libc/include -I bionic/libc/kernel/common -I bionic/libc/kernel/arch-arm -g -c helloworld.c -o hello.o
8、生成可執行代碼:
#$(yourAndroid)/prebuilt/linux-x86/toolchain/[arm-eabi-4.2.1]/bin/arm-eabi-gcc -nostdlib -Bdynamic -Wl,-T,build/core/armelf.x -Wl,-dynamic-linker,/system/bin/linker -Wl,--gc-sections -Wl,-z,noreloc -o helloworld -Lout/target/proct/[generic]/obj/lib -Wl,-rpath-link=out/target/proct/[generic]/obj/lib -lc hello.o -entry=main

其中[ ]中部分根據實際情況修改

**************************************************
實驗:
1. 建目錄(my Android)/development/test, 在該目錄下新建 Android.mk和fb_test.c文件

2. Android.mk文件

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := myfbtest
LOCAL_SRC_FILES := fb_test.c
LOCAL_MODULE_TAGS := optional
include $(BUILD_EXECUTABLE)

3. 以下為fb_test.c
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>
#include <linux/kd.h>

#include <stdio.h>

#define FBBIT_PER_PIXEL 32
#define FBBIT_PIXEL_IMAGE 16
#define PIXELS_WIDTH_BYTE 4
#define BYTE_PER_PIXEL 3
#define FB_GRAPHICS_PATH "/dev/graphics/fb0"
#define DEV_TTY0_PATH "/dev/tty0"

#define DISPLAY_ERROR -1
#define DISPLAY_SUCCESS 0

#define GET_BATTERYCAPACITY_ERR -1

#define MAX_STR 255

static struct {
int fd;
void *pixels;
struct fb_fix_screeninfo fixed;
struct fb_var_screeninfo var;
int align_xres;
} fb;

int getBatteryCapacity(void)
{
FILE *in;
char tmpStr[MAX_STR + 1];
char capfile[] = "/sys/class/power_supply/battery/capacity";

if (capfile == NULL)
return GET_BATTERYCAPACITY_ERR;

in = fopen(capfile, "rt");
if (in == NULL)
return GET_BATTERYCAPACITY_ERR;

if (fgets(tmpStr, MAX_STR, in) == NULL) {
printf("Failed to read battery capacity!\n");
fclose(in);
return GET_BATTERYCAPACITY_ERR;

}

printf("Battery capacity(ascii): %s\n", tmpStr);
fclose(in);

return 0;//atoi(tmpStr);
}

static int vt_set_graphicsmode(int graphics)
{
int fd, r;
fd = open(DEV_TTY0_PATH, O_RDWR | O_SYNC);
if (fd < 0)
return DISPLAY_ERROR;
r = ioctl(fd, KDSETMODE, graphics);
close(fd);
return r;
}

int display_init(void)
{
fb.fd = open(FB_GRAPHICS_PATH, O_RDWR);
if (fb.fd < 0)
return DISPLAY_ERROR;

if (ioctl(fb.fd, FBIOGET_FSCREENINFO, &fb.fixed) < 0)
return DISPLAY_ERROR;
if (ioctl(fb.fd, FBIOGET_VSCREENINFO, &fb.var) < 0)
return DISPLAY_ERROR;
fb.align_xres = fb.fixed.line_length /
(fb.var.bits_per_pixel >> BYTE_PER_PIXEL);

fb.pixels = mmap(0, fb.fixed.line_length * fb.var.yres_virtual,
PROT_READ | PROT_WRITE, MAP_SHARED, fb.fd, 0);
if (fb.pixels == MAP_FAILED)
return DISPLAY_ERROR;

vt_set_graphicsmode(KD_GRAPHICS);

memset(fb.pixels, 0, fb.fixed.line_length * fb.var.yres_virtual);
//display_update(fb.pixels, fb.align_xres, fb.var.yres);
fb.var.activate = FB_ACTIVATE_FORCE;
ioctl(fb.fd, FBIOPUT_VSCREENINFO, &fb.var);

printf("display_init ok\n");

return DISPLAY_SUCCESS;
}

void display_on(void)
{
ioctl(fb.fd, FBIOBLANK, FB_BLANK_UNBLANK);
}

void display_off(void)
{
ioctl(fb.fd, FBIOBLANK, FB_BLANK_POWERDOWN);
}

int main()
{
display_init();
display_off();//關顯示屏

getBatteryCapacity();
sleep(5);

display_on();//開顯示屏

return 0;
}

❸ android 7.0對開發者會有哪些影響

Android N 除了提供諸多新特性和功能外,還對系統和 API 行為做出了各種變更。 本文重點介紹您應該了解並在開發應用時加以考慮的一些重要變更。

如果您之前發布過 Android 應用,請注意您的應用可能受到這些平台變更的影響。

電池和內存

Android N 包括旨在延長設備電池壽命和減少 RAM 使用的系統行為變更。 這些變更可能會影響您的應用訪問系統資源,以及您的系統通過特定隱式 Intent 與其他應用互動的方式。

低電耗模式

Android 6.0(API 級別
23)引入了低電耗模式,當用戶設備未插接電源、處於靜止狀態且屏幕關閉時,該模式會推遲 CPU 和網路活動,從而延長電池壽命。而 Android N
則通過在設備未插接電源且屏幕關閉狀態下、但不一定要處於靜止狀態(例如用戶外出時把手持式設備裝在口袋裡)時應用部分 CPU
和網路限制,進一步增強了低電耗模式。

圖 1. 低電耗模式如何應用第一級系統活動限制以延長電池壽命的圖示。

當設備處於充電狀態且屏幕已關閉一定時間後,設備會進入低電耗模式並應用第一部分限制: 關閉應用網路訪問、推遲作業和同步。 如果進入低電耗模式後設備處於靜止狀態達到一定時間,系統則會對 PowerManager.WakeLock、AlarmManager 鬧鈴、GPS
和 Wi-Fi 掃描應用餘下的低電耗模式限制。 無論是應用部分還是全部低電耗模式限制,系統都會喚醒設備以提供簡短的維護時間窗口,在此窗口期間,應用程序可以訪問網路並執行任何被推遲的作業/同步。

圖 2. 低電耗模式如何在設備處於靜止狀態達到一定時間後應用第二級系統活動限制的圖示。

請注意,激活屏幕或插接設備電源時,系統將退出低電耗模式並取消這些處理限制。 此項新增的行為不會影響有關使您的應用適應 Android 6.0(API 級別 23)中所推出的舊版本低電耗模式的建議和最佳實踐,如低電耗模式和應用待機模式優化中所討論。
您仍應遵循這些建議(例如使用 Google Cloud Messaging (GCM) 發送和接收消息)並開始安排更新計劃以適應新增的低電耗模式行為。

Project Svelte:後台優化

Android N 刪除了三項隱式廣播,以幫助優化內存使用和電量消耗。 此項變更很有必要,因為隱式廣播會在後台頻繁啟動已注冊偵聽這些廣播的應用。 刪除這些廣播可以顯著提升設備性能和用戶體驗。

移動設備會經歷頻繁的連接變更,例如在 Wi-Fi 和移動數據之間切換時。 目前,可以通過在應用清單中注冊一個接收器來偵聽隱式 CONNECTIVITY_ACTION廣播,讓應用能夠監控這些變更。
由於很多應用會注冊接收此廣播,因此單次網路切換即會導致所有應用被喚醒並同時處理此廣播。

同理,應用可以注冊接收來自其他應用(例如相機)的隱式 ACTION_NEW_PICTURE 和 ACTION_NEW_VIDEO 廣播。
當用戶使用相機應用拍攝照片時,這些應用即會被喚醒以處理廣播。

為緩解這些問題,Android N 應用了以下優化措施:

面向 Android N 開發的應用不會收到 CONNECTIVITY_ACTION 廣播,即使它們已有清單條目來請求接受這些事件的通知。
在前台運行的應用如果使用BroadcastReceiver 請求接收通知,則仍可以在主線程中偵聽 CONNECTIVITY_CHANGE。
應用無法發送或接收 ACTION_NEW_PICTURE 或 ACTION_NEW_VIDEO 廣播。此項優化會影響所有應用,而不僅僅是面向
Android N 的應用。

如果您的應用使用任何 Intent,您仍需要盡快移除它們的依賴關系,以正確適配 Android N 設備。 Android 框架提供多個解決方案來緩解對這些隱式廣播的需求。 例如,JobScheler API
提供了一個穩健可靠的機制來安排滿足指定條件(例如連入無限流量網路)時所執行的網路操作。 您甚至可以使用JobScheler 來適應內容提供程序變化。

如需了解有關 Android N 中後台優化以及如何改寫應用的詳細信息,請參閱後台優化。

許可權更改

Android N 做了一些許可權更改,這些更改可能會影響您的應用。

系統許可權更改

為了提高私有文件的安全性,面向 Android N 或更高版本的應用私有目錄被限制訪問(0700)。 此設置可防止私有文件的元數據泄漏,如它們的大小或存在。 此許可權更改有多重副作用:

私有文件的文件許可權不應再由所有者放寬,為使用 MODE_WORLD_READABLE 和/或 MODE_WORLD_WRITEABLE 而進行的此類嘗試將觸發SecurityException。
註:迄今為止,這種限制尚不能完全執行。 應用仍可能使用原生 API 或 File API 來修改它們的私有目錄許可權。 但是,我們強烈反對放寬私有目錄的許可權。

傳遞軟體包網域外的 file:// URI 可能給接收器留下無法訪問的路徑。 因此,嘗試傳遞 file:// URI 會觸發 FileUriExposedException。 分享私有文件內容的推薦方法是使用 FileProvider。
DownloadManager 不再按文件名分享私人存儲的文件。
舊版應用在訪問 COLUMN_LOCAL_FILENAME 時可能出現無法訪問的路徑。
面向 Android N 或更高版本的應用在嘗試訪問 COLUMN_LOCAL_FILENAME 時會觸發 SecurityException。
通過使用DownloadManager.Request.() 或 DownloadManager.Request.() 將下載位置設置為公共位置的舊版應用仍可以訪問 COLUMN_LOCAL_FILENAME 中的路徑,但是我們強烈反對使用這種方法。
訪問由 DownloadManager 公開的文件的首選方式是使用 ContentResolver.openFileDescriptor()。

應用間共享文件

對於面向 Android N 的應用,Android 框架執行的 StrictMode API
政策禁止向您的應用外公開 file:// URI。 如果一項包含文件 URI 的 Intent 離開您的應用,應用失敗,並出現 FileUriExposedException 異常。

若要在應用間共享文件,您應發送一項 content:// URI,並授予 URI 臨時訪問許可權。 進行此授權的最簡單方式是使用 FileProvider 類。
如需有關許可權和共享文件的更多信息,請參閱共享文件。

無障礙改進

為提高平台對於視力不佳或視力受損用戶的可用性,Android N 做出了一些更改。這些更改一般並不要求更改您的應用代碼,不過您應仔細檢查並使用您的應用測試這些功能,以評估它們對用戶體驗的潛在影響。

屏幕縮放

Android N 支持用戶設置顯示尺寸,以放大或縮小屏幕上的所有元素,從而提升設備對視力不佳用戶的可訪問性。用戶無法將屏幕縮放至低於最小屏幕寬度 sw320dp,該寬度是
Nexus 4 的寬度,也是常規中等大小手機的寬度。

圖 3. 右側屏幕顯示的是一台運行 Android N 系統映像的設備增大顯示尺寸後的效果。

當設備密度發生更改時,系統會以如下方式通知正在運行的應用:

如果是面向 API 級別 23 或更低版本系統的應用,系統會自動終止其所有後台進程。 這意味著如果用戶切換離開此類應用,轉而打開「Settings」屏幕並更改 Display size 設置,則系統會像處理內存不足的情況一樣終止該應用。 如果應用具有任何前台進程,則系統會如處理運行時變更中所述將配置變更通知給這些進程,就像對待設備屏幕方向變更一樣。
如果是面向 Android N 的應用,則其所有進程(前台和後台)都會收到有關配置變更的通知,如處理運行時變更中所述。

大多數應用並不需要進行任何更改即可支持此功能,不過前提是這些應用遵循 Android 最佳實踐。具體要檢查的事項:

在屏幕寬度為 sw320dp 的設備上測試您的應用,並確保其充分運行。
當設備配置發生變更時,更新任何與密度相關的緩存信息,例如緩存點陣圖或從網路載入的資源。當應用從暫停狀態恢復運行時,檢查配置變更。
註:如果您要緩存與配置相關的數據,則最好也包括相關元數據,例如該數據對應的屏幕尺寸或像素密度。 保存這些元數據便於您在配置變更後決定是否需要刷新緩存數據。

避免用像素單位指定尺寸,因為像素不會隨屏幕密度縮放。應改為使用與密度無關像素 (dp)
單位指定尺寸。

設置向導中的視覺設置

Android N 在「Welcome」屏幕中加入了「Vision Settings」,用戶可以在新設備上設置以下無障礙功能設置: Magnification gesture、Font size、Display size 和 TalkBack。 此項變更增強了與不同屏幕設置相關的錯誤的可見性。
要評估此功能的影響,您應在啟用這些設置的狀態下測試應用。 您可以在Settings > Accessibility 中找到這些設置。

NDK 應用鏈接至平台庫

Android N 做了一些命名空間更改,以阻止載入非公開 API。 如果您使用 NDK,則只能使用 Android 平台提供的公開 API。 在下一個官方發布的 Android 版本上使用非公開 API 會導致應用崩潰。

為提醒您使用了非公開 API,在 Android N
設備上運行的應用會在有應用調用非公開 API 時在日誌消息輸出中生成一個錯誤。
此錯誤還會作為消息顯示在設備屏幕上,以幫助增強您對此情況的認識。 您應檢查應用代碼以刪除使用非公開平台
API,並使用預覽版設備或模擬器全面測試應用。

如果您的應用依賴平台庫,則請參見 NDK 文檔,了解使用公開 API 等效項替換普通私有 API 的典型修復。 您還可以鏈接至平台庫,而無需實現此應用,如果應用使用的庫是平台的一部分(例如 libpng),但不屬於 NDK,則更可如此。 此情況下,請確保您的 APK 包含您打算鏈接到的所有 .so 文件。

注意:有些第三方庫可能會鏈接至非公開 API。 如果您的應用使用這些庫,那麼當您的應用在下一個官方發布的 Android 版本上運行時可能會出現崩潰現象。

應用不應依賴或使用不屬於 NDK
的原生庫,因為這些庫可能會發生更改或從一個 Android 版本遷移至另一版本。 例如,從 OpenSSL 切換至 BoringSSL
即屬於此類更改。 此外,不同的設備可能提供不同級別的兼容性,因為不屬於 NDK 中的平台庫沒有兼容性要求。 如果您必須在較舊設備上訪問非 NDK
庫,則請依據 Android API 級別進行載入。

為幫助您診斷此類問題,下面列舉了一些在您試圖使用 Android N 開發應用時可能遇到的 java 和 NDK 錯誤:

Java 錯誤示例:
java.lang.UnsatisfiedLinkError: dlopen failed: library "/system/lib/libcutils.so"
is not accessible for the namespace "classloader-namespace"

NDK 錯誤示例:
dlopen failed: cannot locate symbol "__system_property_get" referenced by ...

以下是遇到這類錯誤的應用的一些典型修復:

可以使用標准 JNI 函數來替代使用 libandroid_runtime.so 中的 getJavaVM 和 getJNIEnv:
AndroidRuntime::getJavaVM -> GetJavaVM from <jni.h>
AndroidRuntime::getJNIEnv -> JavaVM::GetEnv or
JavaVM::AttachCurrentThread from <jni.h>.

可以使用公開 alternative __system_property_get 來替代使用 libcutils.so 中的 property_get 符號。如需這樣做,請使用__system_property_get 及以下 include 函數:
#include <sys/system_properties.h>

應使用應用本地版本來替代使用 libcrypto.so 中的 SSL_ctrl 符號。例如,您應在 .so 文件中靜態鏈接 libcyrpto.a,或者在應用中包含您自己的來自 BoringSSL 或 OpenSSL 的動態 libcrypto.so。

Android for Work

Android N 包含一些針對面向 Android
for Work 的應用的變更,包括對證書安裝、密碼重置、二級用戶管理、設備標識符訪問許可權的變更。如果您是要針對 Android for
Work 環境開發應用,則應仔細檢查這些變更並相應地修改您的應用。

您必須先安裝授權證書安裝程序,然後 DPC 才能對其進行設置。 對於面向 N SDK 的個人資料和設備所有者應用,您應在設備策略控制器 (DPC) 調用DevicePolicyManager.setCertInstallerPackage() 之前安裝授權證書安裝程序。 如果尚未安裝此安裝程序,則系統會引發IllegalArgumentException。
針對設備管理員的重置密碼限制現在也適用於個人資料所有者。 設備管理員無法再使用 DevicePolicyManager.resetPassword() 來清除或更改已經設置的密碼。 設備管理員仍可以設置密碼,但只能在設備沒有密碼、PIN 或圖案時這樣做。
即使設置了限制,設備所有者和個人資料所有者仍可以管理帳戶。而且,即使具有 DISALLOW_MODIFY_ACCOUNTS 用戶限制,設備所有者和個人資料所有者仍可調用 Account Management API。
設備所有者可以更輕松地管理二級用戶。當設備在設備所有者模式下運行時,系統將自動設置 DISALLOW_ADD_USER 限制。 這樣可以防止用戶創建非託管二級用戶。 此外,CreateUser() 和 createAndInitializeUser() 方法已棄用,取而代之的是 DevicePolicyManager.createAndManageUser() 方法。
設備所有者可以訪問設備標識符。設備所有者可以使用 DevicePolicyManagewr.getWifiMacAddress() 訪問設備的 Wi-Fi MAC 地址。 如果設備上從未啟用 Wi-Fi,則此方法將返回一個 null 值。
工作模式設置控制工作應用訪問。當工作模式關閉時,系統啟動器通過使工作應用顯示為灰色來指示它們不可用。 啟用工作模式會再次恢復正常行為。

如需了解有關 Android N 中針對 Android for Work 所做變更的詳細信息,請參閱 Android for
Work 更新。

註解保留

Android N 在註解可見性被忽略時修復錯誤。這種問題將啟用本不應被允許的運行時訪問註解。 這些註解包括:

VISIBILITY_BUILD:僅應編譯時可見。
VISIBILITY_SYSTEM:運行時應可見,但僅限基本系統。

如果您的應用依賴這種行為,請在註解中添加一項運行時必須可用的保留政策。 您可通過使用 @Retention(RetentionPolicy.RUNTIME) 來如此做。

其他重要說明

如果一個應用在 Android N 上運行,但卻是針對更低 API 級別開發的,那麼在用戶更改顯示尺寸時,系統將終止此應用進程。 應用必須能夠正常處理此情景。 否則,當用戶從最近使用記錄中恢復運行應用時,應用將會出現崩潰現象。
您應測試應用以確保不會發生此行為。要進行此測試,您可以通過 DDMS 手動終止應用,以造成相同的崩潰現象。

在密度發生更改時,系統不會自動終止面向 N 及更高版本的應用;不過,這些應用仍可能對配置變更做出不良響應。

Android N 上的應用應能夠正常處理配置變更,並且在後續啟動時不會出現崩潰現象。您可以通過更改字體大小 (Setting > Display > Font size) 並隨後從最近使用記錄中恢復運行應用,來驗證應用行為。
由於之前的 Android 版本中的一項錯誤,系統未能將對主線程上的一個 TCP 套接字的寫入操作舉報為嚴格模式違反。 Android N 修復了此錯誤。呈現出這種行為的應用引發 android.os.NetworkOnMainThreadException。一般情況下,我們不建議在主線程上執行網路操作,因為這些操作通常都有可能導致 ANR 和卡頓的高尾延遲。
Debug.startMethodTracing() 方法族現在默認在您的共享的存儲空間上的軟體包特定目錄中存儲輸出,而非 SD 卡頂級。 這意味著應用不再需要請求WRITE_EXTERNAL_STORAGE 使用這些 API 的許可權。
許多平台 API 現在開始檢查在 Binder 事務間發送的大負載,系統現在會將 TransactionTooLargeExceptions 再次作為 RuntimeExceptions 引發,而不再只是默默記錄或抑制它們。
一個常見例子是在 Activity.onSaveInstanceState() 上存儲過多數據,導致 ActivityThread.StopInfo 在您的應用面向
Android N 時引發 RuntimeException。
如果應用向 View 發布 Runnable 任務,並且 View 未附加到窗口,系統會用 View 為 Runnable 任務排隊;在 View 附加到窗口之前,Runnable 任務不會執行。
此行為會修復以下錯誤:
如果一項應用是從並非預期窗口 UI 線程的其他線程發布到 View,則Runnable 可能會因此運行錯誤的線程。
如果 Runnable 任務是從並非環路線程的其他線程發布,則應用可能會曝光 Runnable 任務。
如果 Android N 上一項有 DELETE_PACKAGES 許可權的應用嘗試刪除一個軟體包,但另一項應用已經安裝了這個軟體包,則系統可能要求用戶確認。
在這種情況下,應用在調用 PackageInstaller.uninstall() 時的返回狀態應為 STATUS_PENDING_USER_ACTION。

❹ 怎麼測試給資料庫加密的android模塊

1.概述

SharedPreferences是Android提供用來存儲一些簡單配置信息的機制,其以KEY-VALUE對的方式進行存儲,以便我們可以方便進行察簡讀取和存儲。主要可以用來存儲應用程序的歡迎語、常量參數或登錄賬號密碼等。

2.實例

(1)創建項目SharedPreferencesDemo項目

(2)編輯主界面的布局文件main.xml如下:

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="SharedPreferences,是Android提供用來存儲一些簡單的配置信息的一種機制。"

/>

(3)創建AES加解密工具類AESEncryptor.java

其中主要提供加密encrypt、解密decrypt兩個方法。(AES加解密演算法具體大家可以到網上搭手搜索相關資料)

以下為該類文件的源碼:

package ni.demo.sharedpreferences;

import java.security.SecureRandom;

import javax.crypto.Cipher;

import javax.crypto.KeyGenerator;

import javax.crypto.SecretKey;

import javax.crypto.spec.SecretKeySpec;

/**

* AES加密器

* @author Eric_Ni

*

*/

public class AESEncryptor {

/**

* AES加密

*/

public static String encrypt(String seed, String cleartext) throws
Exception {

byte[] rawKey = getRawKey(seed.getBytes());

byte[] result = encrypt(rawKey, cleartext.getBytes());

return toHex(result);

}

/**

* AES解密

*/

public static String decrypt(String seed, String encrypted) throws
Exception {

byte[] rawKey = getRawKey(seed.getBytes());

byte[] enc = toByte(encrypted);

byte[] result = decrypt(rawKey, enc);

return new String(result);

}

private static byte[] getRawKey(byte[] seed) throws Exception {

KeyGenerator kgen = KeyGenerator.getInstance("AES"知沒嫌);

SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");

sr.setSeed(seed);

kgen.init(128, sr); // 192 and 256 bits may not be available

SecretKey skey = kgen.generateKey();

byte[] raw = skey.getEncoded();

return raw;

}

private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception
{

SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");

Cipher cipher = Cipher.getInstance("AES");

cipher.init(Cipher.ENCRYPT_MODE, skeySpec);

byte[] encrypted = cipher.doFinal(clear);

return encrypted;

}

private static byte[] decrypt(byte[] raw, byte[] encrypted) throws
Exception {

SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");

Cipher cipher = Cipher.getInstance("AES");

cipher.init(Cipher.DECRYPT_MODE, skeySpec);

byte[] decrypted = cipher.doFinal(encrypted);

return decrypted;

}

public static String toHex(String txt) {

return toHex(txt.getBytes());

}

public static String fromHex(String hex) {

return new String(toByte(hex));

}

public static byte[] toByte(String hexString) {

int len = hexString.length()/2;

byte[] result = new byte[len];

for (int i = 0; i < len; i++)

result[i] = Integer.valueOf(hexString.substring(2*i, 2*i+2),
16).byteValue();

return result;

}

public static String toHex(byte[] buf) {

if (buf == null)

return "";

StringBuffer result = new StringBuffer(2*buf.length);

for (int i = 0; i < buf.length; i++) {

appendHex(result, buf[i]);

}

return result.toString();

}

private final static String HEX = "0123456789ABCDEF";

private static void appendHex(StringBuffer sb, byte b) {

sb.append(HEX.charAt((b>>4)&0x0f)).append(HEX.charAt(b&0x0f));

}

}

(4)編輯SharedPreferencesDemo.java

源碼如下:

package ni.demo.sharedpreferences;

import android.app.Activity;

import android.content.SharedPreferences;

import android.content.SharedPreferences.Editor;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.Toast;

public class SharedPreferencesDemo extends Activity {

public static final String MY_PREFERENCES = "MY_PREFERENCES";
//Preferences文件的名稱

public static final String MY_ACCOUNT = "MY_ACCOUNT"; //

public static final String MY_PASSWORD = "MY_PASSWORD";

private EditText edtAccount;

private EditText edtPassword;

private Button btnClear;

private Button btnExit;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

edtAccount = (EditText)findViewById(R.id.edtAccount);

edtPassword = (EditText)findViewById(R.id.edtPassword);

//獲取名字為「MY_PREFERENCES」的參數文件對象,並獲得MYACCOUNT、MY_PASSWORD元素的值。

SharedPreferences sp = this.getSharedPreferences(MY_PREFERENCES, 0);

String account = sp.getString(MY_ACCOUNT, "");

String password = sp.getString(MY_PASSWORD, "");

//對密碼進行AES解密

try{

password = AESEncryptor.decrypt("41227677", password);

}catch(Exception ex){

Toast.makeText(this, "獲取密碼時產生解密錯誤!", Toast.LENGTH_SHORT);

password = "";

}

//將賬號和密碼顯示在EditText控制項上。

edtAccount.setText(account);

edtPassword.setText(password);

//獲取"清空"按鈕的對象,並為其綁定監聽器,如被點擊則清空賬號和密碼控制項的值。

btnClear = (Button)findViewById(R.id.btnClear);

btnClear.setOnClickListener(new OnClickListener(){

@Override

public void onClick(View arg0) {

edtAccount.setText("");

edtPassword.setText("");

}

});

//獲取「退出」按鈕的對象,並為其綁定監聽,如被點擊則退出程序。

btnExit = (Button)findViewById(R.id.btnExit);

btnExit.setOnClickListener(new OnClickListener(){

@Override

public void onClick(View arg0) {

SharedPreferencesDemo.this.finish();

}

});

}

@Override

protected void onStop() {

super.onStop();

//獲得賬號、密碼控制項的值,並使用AES加密演算法給密碼加密。

String account = edtAccount.getText().toString();

String password = edtPassword.getText().toString();

try{

password = AESEncryptor.encrypt("41227677", password);

}catch(Exception ex){

Toast.makeText(this, "給密碼加密時產生錯誤!", Toast.LENGTH_SHORT);

password = "";

}

//獲取名字為「MY_PREFERENCES」的參數文件對象。

SharedPreferences sp = this.getSharedPreferences(MY_PREFERENCES, 0);

//使用Editor介面修改SharedPreferences中的值並提交。

Editor editor = sp.edit();

editor.putString(MY_ACCOUNT, account);

editor.putString(MY_PASSWORD,password);

editor.commit();

}

}

(5)效果測試

首先,在AVD我們可以看到如下界面,在兩個控制項上我們分別輸入abc和123456。

接著,我們打開DDMS的File
Explore可以看到在data->data->ni->shared_prefs下面產生了一個名字叫做MY_PREFERENCES.xml的文件,該文件就是用來存儲我們剛才設置的賬號和密碼。

將其導出,並打開,可以看到如下內容:

abc這說明我們可以成功將賬號和加密後的密碼保存下來了。

最後,我們點擊「退出」按鈕將應用程序結束掉,再重新打開。我們又再次看到我們退出前的界面,賬號密碼已經被重新讀取出來。

文章的最後,我們進入Android API手冊,看看關於SharedPreferences的介紹:

Interface for accessing and modifying preference data returned by
getSharedPreferences(String, int). For any particular set of preferences, there
is a single instance of this class that all clients share. Modifications to the
preferences must go through an SharedPreferences.Editor object to ensure the
preference values remain in a consistent state and control when they are
committed to storage.

SharedPreferences是一個用來訪問和修改選項數據的介面,通過getSharedPreferences(Stirng,int)來獲得該介面。對於任何特別的選項集,只能有一個實例供所有客戶端共享。針對選項參數的修改必須通過一個SharedPreferences.Editor對象來進行,以保證所有的選項值保持在一個始終如一的狀態,並且通過該對象提交存儲。

可見,SharedPreferences操作選項文件時是線程安全的。

❺ APK打包報錯 這個路徑明顯不對,但是就是不知道怎麼解決。

資料庫連接用相對路徑,不要用絕對路徑,或者在程序中可以動態設定 其他錯誤估計是缺少運行時文件

❻ 有人研究過更新android系統中的openssl版本么

android4.4系統中自動的openssl版本是1.0.1e, 而且這個版本存在安全漏洞,客戶要求升級android系統中的openssl版本, 我看了下external/openssl下面的 README.android, 有些沒看懂, 不知道有沒有大俠弄過。

OpenSSL on the Android platform.
---

The code in this directory is based on $OPENSSL_VERSION in the file
openssl.version. See patches/README for more information on how the
code differs from $OPENSSL_VERSION.

Porting New Versions of OpenSSL.
--

The following steps are recommended for porting new OpenSSL versions.

1) Retrieve the appropriate version of the OpenSSL source from
www.openssl.org/source (in openssl-*.tar.gz file). Check the PGP
signature (found in matching openssl-*.tar.gz.asc file) with:

gpg openssl-*.tar.gz.asc

If the public key is not found, import the the one with the
matching RSA key ID from http://www.openssl.org/about/, using:

gpg --import # paste PGP public key block on stdin

2) Update the variables in openssl.config and openssl.version as appropriate.
At the very least you will need to update the openssl.version.

3) Run:

./import_openssl.sh import openssl-*.tar.gz

4) If there are any errors, then modify openssl.config, openssl.version
and patches in patches/ as appropriate. You might want to use:

./import_openssl.sh regenerate patches/*.patch

Repeat step 3.

5) Cleanup before building with:

m -j16 clean-libcrypto clean-libssl clean-openssl clean-ssltest

6) Build openssl from the external/openssl directory with:

mm -j16 snod && adb remount && adb sync system

If there are build errors, then patches/*.mk, openssl.config, or
android-config.mk may need updating.

7) Run tests to make sure things are working:

# Run local openssl tests
(cd android.testssl/ && ./testssl.sh)
# Build and sync libcore tests
(croot && cd libcore && mm -j16 snod && adb remount && adb sync)
# Run tests from libcore
(croot && vogar --classpath out/target/common/obj/JAVA_LIBRARIES/core-tests_intermediates/classes.jar javax.net.ssl tests.api.javax.net)
# Run tests from Harmony
(croot && vogar --classpath out/target/common/obj/JAVA_LIBRARIES/apache-harmony-tests_intermediates/classes.jar tests.api.java.math.BigIntegerTest org.apache.harmony.tests.java.math)
# try an https website
adb shell am start https://online.citibank.com # confirm result in browser

The vogar tool can be found externally at http://code.google.com/p/vogar/

Quick installation instructions (without rebuilding from source):
VOGAR=$HOME/vogar
svn co http://vogar.googlecode.com/svn/trunk/ $VOGAR
mkdir -p $VOGAR/build/
curl -o $VOGAR/build/vogar.jar https://vogar.googlecode.com/files/vogar.jar
PATH=$PATH:$VOGAR/bin

Within Google, you can find it under:
/home/dalvik-prebuild/vogar/bin/vogar

# You can also run openssl s_server as a test server on the device:
adb push ./android.testssl/CAss.cnf /sdcard/CAss.cnf
adb shell openssl req -config /sdcard/CAss.cnf -x509 -nodes -days 365 -subj '/C=US/ST=California/L=Mountain View/CN=localhost' -newkey rsa:1024 -keyout /sdcard/server.pem -out /sdcard/server.pem
adb shell openssl s_server -cert /sdcard/server.pem -www -verify 1
adb shell am start https://localhost:4433 # confirm result in browser

8) Do a full build before checking in:

m -j16

Optionally, check whether build flags (located in CONFIGURE_ARGS in
openssl.config, plus some extras in android-config.mk), need to be updated.
Doing this step will help ensure that the compiled library is appropriately
optimized for speed and size.

❼ android 7.0對開發者會有哪些影響

Android N 除了提供諸多新特性和功能外,還對系統和 API 行為做出了各種變更。 本文重點介紹您應該了解並在開發應用時加以考慮的一些重要變更。

如果您之前發布過 Android 應用,請注意您的應用可能受到這些平台變更的影響。

電池和內存

Android N 包括旨在延長設備電池壽命和減少 RAM 使用的系統行為變更。 這些變更可能會影響您的應用訪問系統資源,以及您的系統通過特定隱式 Intent 與其他應用互動的方式。

低電耗模式

Android 6.0(API 級別
23)引入了低電耗模式,當用戶設備未插接電源、處於靜止狀態且屏幕關閉時,該模式會推遲 CPU 和網路活動,從而延長電池壽命。而 Android N
則通過在設備未插接電源且屏幕關閉狀態下、但不一定要處於靜止狀態(例如用戶外出時把手持式設備裝在口袋裡)時應用部分 CPU
和網路限制,進一步增強了低電耗模式。

圖 1. 低電耗模式如何辯蠢應用第一級系統活動限制以延攜畢陪長電池壽命的圖示。

當設備處於充電狀態且屏幕已關閉一定時間後,設備會進入低電耗模式並應用第一部分限制: 關閉應用網路訪問、推遲作業和同步。 如果進入低電耗模式後設備處於靜止狀態達到一定時間,系統則會對 PowerManager.WakeLock、AlarmManager 鬧鈴、GPS
和 Wi-Fi 掃描應用餘下的低電耗模式限制。 無論是應用部分還是全部低電耗模式限制,系統都會喚醒設備以提供簡短的維護時間窗口,在此窗口期間,應用程序可以訪問網路並執行任何被推遲的作業/同步。

圖 2. 低電耗模式如何在設備處於靜止狀態達到一定時間後應用第二級系統活動限制的圖示。

請注意,激活屏幕或插接設備電源時,系統將退出低電耗模式並取消這些處理限制。 此項新增的行為不會影響有關使您的應用適應 Android 6.0(API 級別 23)中所推出的舊版本低電耗模式的建議和最佳實踐,如低電耗模式和應用待機模式優化中所討論。
您仍應遵循這些建議(例如使用 Google Cloud Messaging (GCM) 發送和接收消息)並開始安排更新計劃以適應新增的低電耗模式行為。

Project Svelte:後台優化

Android N 刪除了三項隱式廣播,以幫助優化內存使用和電量消耗。 此項變更很有必要,因為隱式廣播會在後台頻繁啟動已注冊偵聽這些廣播的應用。 刪除這些廣播可以顯著提升設備性能和用戶體驗。

移動設備會經歷頻繁的連接變更,例如在 Wi-Fi 和移動數據之間切換時。 目前,可以通過在應用清單中注冊一個接收器來偵聽隱式 CONNECTIVITY_ACTION廣播,讓應用能夠監控這些變更。
由於很多應用會注冊接收此廣播,因此單次網路切換即會導致所有應用被喚醒並同時處理此廣播。

同理,應用可以注冊接收來自數碰其他應用(例如相機)的隱式 ACTION_NEW_PICTURE 和 ACTION_NEW_VIDEO 廣播。
當用戶使用相機應用拍攝照片時,這些應用即會被喚醒以處理廣播。

為緩解這些問題,Android N 應用了以下優化措施:

面向 Android N 開發的應用不會收到 CONNECTIVITY_ACTION 廣播,即使它們已有清單條目來請求接受這些事件的通知。
在前台運行的應用如果使用BroadcastReceiver 請求接收通知,則仍可以在主線程中偵聽 CONNECTIVITY_CHANGE。
應用無法發送或接收 ACTION_NEW_PICTURE 或 ACTION_NEW_VIDEO 廣播。此項優化會影響所有應用,而不僅僅是面向
Android N 的應用。

如果您的應用使用任何 Intent,您仍需要盡快移除它們的依賴關系,以正確適配 Android N 設備。 Android 框架提供多個解決方案來緩解對這些隱式廣播的需求。 例如,JobScheler API
提供了一個穩健可靠的機制來安排滿足指定條件(例如連入無限流量網路)時所執行的網路操作。 您甚至可以使用JobScheler 來適應內容提供程序變化。

如需了解有關 Android N 中後台優化以及如何改寫應用的詳細信息,請參閱後台優化。

許可權更改

Android N 做了一些許可權更改,這些更改可能會影響您的應用。

系統許可權更改

為了提高私有文件的安全性,面向 Android N 或更高版本的應用私有目錄被限制訪問(0700)。 此設置可防止私有文件的元數據泄漏,如它們的大小或存在。 此許可權更改有多重副作用:

私有文件的文件許可權不應再由所有者放寬,為使用 MODE_WORLD_READABLE 和/或 MODE_WORLD_WRITEABLE 而進行的此類嘗試將觸發SecurityException。
註:迄今為止,這種限制尚不能完全執行。 應用仍可能使用原生 API 或 File API 來修改它們的私有目錄許可權。 但是,我們強烈反對放寬私有目錄的許可權。

傳遞軟體包網域外的 file:// URI 可能給接收器留下無法訪問的路徑。 因此,嘗試傳遞 file:// URI 會觸發 FileUriExposedException。 分享私有文件內容的推薦方法是使用 FileProvider。
DownloadManager 不再按文件名分享私人存儲的文件。
舊版應用在訪問 COLUMN_LOCAL_FILENAME 時可能出現無法訪問的路徑。
面向 Android N 或更高版本的應用在嘗試訪問 COLUMN_LOCAL_FILENAME 時會觸發 SecurityException。
通過使用DownloadManager.Request.() 或 DownloadManager.Request.() 將下載位置設置為公共位置的舊版應用仍可以訪問 COLUMN_LOCAL_FILENAME 中的路徑,但是我們強烈反對使用這種方法。
訪問由 DownloadManager 公開的文件的首選方式是使用 ContentResolver.openFileDescriptor()。

應用間共享文件

對於面向 Android N 的應用,Android 框架執行的 StrictMode API
政策禁止向您的應用外公開 file:// URI。 如果一項包含文件 URI 的 Intent 離開您的應用,應用失敗,並出現 FileUriExposedException 異常。

若要在應用間共享文件,您應發送一項 content:// URI,並授予 URI 臨時訪問許可權。 進行此授權的最簡單方式是使用 FileProvider 類。
如需有關許可權和共享文件的更多信息,請參閱共享文件。

無障礙改進

為提高平台對於視力不佳或視力受損用戶的可用性,Android N 做出了一些更改。這些更改一般並不要求更改您的應用代碼,不過您應仔細檢查並使用您的應用測試這些功能,以評估它們對用戶體驗的潛在影響。

屏幕縮放

Android N 支持用戶設置顯示尺寸,以放大或縮小屏幕上的所有元素,從而提升設備對視力不佳用戶的可訪問性。用戶無法將屏幕縮放至低於最小屏幕寬度 sw320dp,該寬度是
Nexus 4 的寬度,也是常規中等大小手機的寬度。

圖 3. 右側屏幕顯示的是一台運行 Android N 系統映像的設備增大顯示尺寸後的效果。

當設備密度發生更改時,系統會以如下方式通知正在運行的應用:

如果是面向 API 級別 23 或更低版本系統的應用,系統會自動終止其所有後台進程。 這意味著如果用戶切換離開此類應用,轉而打開「Settings」屏幕並更改 Display size 設置,則系統會像處理內存不足的情況一樣終止該應用。 如果應用具有任何前台進程,則系統會如處理運行時變更中所述將配置變更通知給這些進程,就像對待設備屏幕方向變更一樣。
如果是面向 Android N 的應用,則其所有進程(前台和後台)都會收到有關配置變更的通知,如處理運行時變更中所述。

大多數應用並不需要進行任何更改即可支持此功能,不過前提是這些應用遵循 Android 最佳實踐。具體要檢查的事項:

在屏幕寬度為 sw320dp 的設備上測試您的應用,並確保其充分運行。
當設備配置發生變更時,更新任何與密度相關的緩存信息,例如緩存點陣圖或從網路載入的資源。當應用從暫停狀態恢復運行時,檢查配置變更。
註:如果您要緩存與配置相關的數據,則最好也包括相關元數據,例如該數據對應的屏幕尺寸或像素密度。 保存這些元數據便於您在配置變更後決定是否需要刷新緩存數據。

避免用像素單位指定尺寸,因為像素不會隨屏幕密度縮放。應改為使用與密度無關像素 (dp)
單位指定尺寸。

設置向導中的視覺設置

Android N 在「Welcome」屏幕中加入了「Vision Settings」,用戶可以在新設備上設置以下無障礙功能設置: Magnification gesture、Font size、Display size 和 TalkBack。 此項變更增強了與不同屏幕設置相關的錯誤的可見性。
要評估此功能的影響,您應在啟用這些設置的狀態下測試應用。 您可以在Settings > Accessibility 中找到這些設置。

NDK 應用鏈接至平台庫

Android N 做了一些命名空間更改,以阻止載入非公開 API。 如果您使用 NDK,則只能使用 Android 平台提供的公開 API。 在下一個官方發布的 Android 版本上使用非公開 API 會導致應用崩潰。

為提醒您使用了非公開 API,在 Android N
設備上運行的應用會在有應用調用非公開 API 時在日誌消息輸出中生成一個錯誤。
此錯誤還會作為消息顯示在設備屏幕上,以幫助增強您對此情況的認識。 您應檢查應用代碼以刪除使用非公開平台
API,並使用預覽版設備或模擬器全面測試應用。

如果您的應用依賴平台庫,則請參見 NDK 文檔,了解使用公開 API 等效項替換普通私有 API 的典型修復。 您還可以鏈接至平台庫,而無需實現此應用,如果應用使用的庫是平台的一部分(例如 libpng),但不屬於 NDK,則更可如此。 此情況下,請確保您的 APK 包含您打算鏈接到的所有 .so 文件。

注意:有些第三方庫可能會鏈接至非公開 API。 如果您的應用使用這些庫,那麼當您的應用在下一個官方發布的 Android 版本上運行時可能會出現崩潰現象。

應用不應依賴或使用不屬於 NDK
的原生庫,因為這些庫可能會發生更改或從一個 Android 版本遷移至另一版本。 例如,從 OpenSSL 切換至 BoringSSL
即屬於此類更改。 此外,不同的設備可能提供不同級別的兼容性,因為不屬於 NDK 中的平台庫沒有兼容性要求。 如果您必須在較舊設備上訪問非 NDK
庫,則請依據 Android API 級別進行載入。

為幫助您診斷此類問題,下面列舉了一些在您試圖使用 Android N 開發應用時可能遇到的 Java 和 NDK 錯誤:

Java 錯誤示例:
java.lang.UnsatisfiedLinkError: dlopen failed: library "/system/lib/libcutils.so"
is not accessible for the namespace "classloader-namespace"

NDK 錯誤示例:
dlopen failed: cannot locate symbol "__system_property_get" referenced by ...

以下是遇到這類錯誤的應用的一些典型修復:

可以使用標准 JNI 函數來替代使用 libandroid_runtime.so 中的 getJavaVM 和 getJNIEnv:
AndroidRuntime::getJavaVM -> GetJavaVM from <jni.h>
AndroidRuntime::getJNIEnv -> JavaVM::GetEnv or
JavaVM::AttachCurrentThread from <jni.h>.

可以使用公開 alternative __system_property_get 來替代使用 libcutils.so 中的 property_get 符號。如需這樣做,請使用__system_property_get 及以下 include 函數:
#include <sys/system_properties.h>

應使用應用本地版本來替代使用 libcrypto.so 中的 SSL_ctrl 符號。例如,您應在 .so 文件中靜態鏈接 libcyrpto.a,或者在應用中包含您自己的來自 BoringSSL 或 OpenSSL 的動態 libcrypto.so。

Android for Work

Android N 包含一些針對面向 Android
for Work 的應用的變更,包括對證書安裝、密碼重置、二級用戶管理、設備標識符訪問許可權的變更。如果您是要針對 Android for
Work 環境開發應用,則應仔細檢查這些變更並相應地修改您的應用。

您必須先安裝授權證書安裝程序,然後 DPC 才能對其進行設置。 對於面向 N SDK 的個人資料和設備所有者應用,您應在設備策略控制器 (DPC) 調用DevicePolicyManager.setCertInstallerPackage() 之前安裝授權證書安裝程序。 如果尚未安裝此安裝程序,則系統會引發IllegalArgumentException。
針對設備管理員的重置密碼限制現在也適用於個人資料所有者。 設備管理員無法再使用 DevicePolicyManager.resetPassword() 來清除或更改已經設置的密碼。 設備管理員仍可以設置密碼,但只能在設備沒有密碼、PIN 或圖案時這樣做。
即使設置了限制,設備所有者和個人資料所有者仍可以管理帳戶。而且,即使具有 DISALLOW_MODIFY_ACCOUNTS 用戶限制,設備所有者和個人資料所有者仍可調用 Account Management API。
設備所有者可以更輕松地管理二級用戶。當設備在設備所有者模式下運行時,系統將自動設置 DISALLOW_ADD_USER 限制。 這樣可以防止用戶創建非託管二級用戶。 此外,CreateUser() 和 createAndInitializeUser() 方法已棄用,取而代之的是 DevicePolicyManager.createAndManageUser() 方法。
設備所有者可以訪問設備標識符。設備所有者可以使用 DevicePolicyManagewr.getWifiMacAddress() 訪問設備的 Wi-Fi MAC 地址。 如果設備上從未啟用 Wi-Fi,則此方法將返回一個 null 值。
工作模式設置控制工作應用訪問。當工作模式關閉時,系統啟動器通過使工作應用顯示為灰色來指示它們不可用。 啟用工作模式會再次恢復正常行為。

如需了解有關 Android N 中針對 Android for Work 所做變更的詳細信息,請參閱 Android for
Work 更新。

註解保留

Android N 在註解可見性被忽略時修復錯誤。這種問題將啟用本不應被允許的運行時訪問註解。 這些註解包括:

VISIBILITY_BUILD:僅應編譯時可見。
VISIBILITY_SYSTEM:運行時應可見,但僅限基本系統。

如果您的應用依賴這種行為,請在註解中添加一項運行時必須可用的保留政策。 您可通過使用 @Retention(RetentionPolicy.RUNTIME) 來如此做。

其他重要說明

如果一個應用在 Android N 上運行,但卻是針對更低 API 級別開發的,那麼在用戶更改顯示尺寸時,系統將終止此應用進程。 應用必須能夠正常處理此情景。 否則,當用戶從最近使用記錄中恢復運行應用時,應用將會出現崩潰現象。
您應測試應用以確保不會發生此行為。要進行此測試,您可以通過 DDMS 手動終止應用,以造成相同的崩潰現象。

在密度發生更改時,系統不會自動終止面向 N 及更高版本的應用;不過,這些應用仍可能對配置變更做出不良響應。

Android N 上的應用應能夠正常處理配置變更,並且在後續啟動時不會出現崩潰現象。您可以通過更改字體大小 (Setting > Display > Font size) 並隨後從最近使用記錄中恢復運行應用,來驗證應用行為。
由於之前的 Android 版本中的一項錯誤,系統未能將對主線程上的一個 TCP 套接字的寫入操作舉報為嚴格模式違反。 Android N 修復了此錯誤。呈現出這種行為的應用引發 android.os.NetworkOnMainThreadException。一般情況下,我們不建議在主線程上執行網路操作,因為這些操作通常都有可能導致 ANR 和卡頓的高尾延遲。
Debug.startMethodTracing() 方法族現在默認在您的共享的存儲空間上的軟體包特定目錄中存儲輸出,而非 SD 卡頂級。 這意味著應用不再需要請求WRITE_EXTERNAL_STORAGE 使用這些 API 的許可權。
許多平台 API 現在開始檢查在 Binder 事務間發送的大負載,系統現在會將 TransactionTooLargeExceptions 再次作為 RuntimeExceptions 引發,而不再只是默默記錄或抑制它們。
一個常見例子是在 Activity.onSaveInstanceState() 上存儲過多數據,導致 ActivityThread.StopInfo 在您的應用面向
Android N 時引發 RuntimeException。
如果應用向 View 發布 Runnable 任務,並且 View 未附加到窗口,系統會用 View 為 Runnable 任務排隊;在 View 附加到窗口之前,Runnable 任務不會執行。
此行為會修復以下錯誤:
如果一項應用是從並非預期窗口 UI 線程的其他線程發布到 View,則Runnable 可能會因此運行錯誤的線程。
如果 Runnable 任務是從並非環路線程的其他線程發布,則應用可能會曝光 Runnable 任務。
如果 Android N 上一項有 DELETE_PACKAGES 許可權的應用嘗試刪除一個軟體包,但另一項應用已經安裝了這個軟體包,則系統可能要求用戶確認。
在這種情況下,應用在調用 PackageInstaller.uninstall() 時的返回狀態應為 STATUS_PENDING_USER_ACTION。

閱讀全文

與libcryptoandroid相關的資料

熱點內容
安卓怎麼關許可權保護隱私 瀏覽:390
海牛微視app怎麼用 瀏覽:70
單片機怎樣選變壓器 瀏覽:829
癌症pdf 瀏覽:725
雲伺服器鏡像批量部署環境 瀏覽:683
安卓手機瀏覽器能訪問什麼網站 瀏覽:254
找不到網站的伺服器ip地址該如何解決 瀏覽:743
演算法十個數降序排列 瀏覽:95
基於單片機的老年人健康監測系統 瀏覽:706
python入門經典pdf下載 瀏覽:17
東芝變頻2p空調壓縮機 瀏覽:227
自家wifi怎麼能加密 瀏覽:644
紅米k40加密門禁卡 瀏覽:847
什麼樣的源碼好看 瀏覽:156
手機主伺服器有什麼用 瀏覽:612
程序編寫命令 瀏覽:597
android發送心跳包 瀏覽:385
指標源碼和原理 瀏覽:700
汽車空調壓縮吸盤 瀏覽:208
崽崽因app版本不同不能邀請怎麼辦 瀏覽:686