Android 8.1 (רמת API 27) כולל מגוון של תכונות ויכולות חדשות למשתמשים ולמפתחים. במסמך הזה נדגיש את התכונות החדשות למפתחים.
(Go edition) Android Oreo
Android Go היא היוזמה שלנו לאופטימיזציה של חוויית השימוש ב-Android מיליארדי אנשים נכנסים לאינטרנט בכל העולם. החל מ-Android 8.1, אנחנו הופכים את Android לפלטפורמה מעולה למכשירים פשוטים. תכונות ב-Android Oreo ההגדרות של (מהדורת Go) כוללות:
- אופטימיזציות של זיכרון. שימוש משופר בזיכרון בכל הפלטפורמה כדי להבטיח שאפליקציות יכולות לפעול ביעילות במכשירים עם זיכרון RAM בנפח של 1GB או פחות.
- אפשרויות טירגוט גמישות. פי'צר חדש תכונת חומרה קבועים כדי לאפשר לכם לטרגט את הפצת האפליקציות למכשירים רגילים או עם נפח RAM נמוך באמצעות Google Play.
- Google Play.כל האפליקציות יהיו זמינות במכשירים עם מערכת ההפעלה Android Oreo (מהדורת Go), Google Play תספק חשיפה לאפליקציות שעברו אופטימיזציה במיוחד על ידי מפתחים כדי לספק חוויה נהדרת למיליארדי אנשים, מבנה שיכול לשמש למיליארדי אנשים הנחיות.
עדכנו את המבנה בשביל מיליארדי אנשים הנחיות נוספות לבצע אופטימיזציה של האפליקציה למכשירים שפועלים Android Oreo (מהדורת Go). עבור רוב המפתחים, כדאי לבצע אופטימיזציה של ה-APK הקיים או להשתמש של Google Play תכונת APK מרובה שמטרגטת גרסה של ה-APK למכשירים עם נפח RAM נמוך היא הדרך הטובה ביותר להתכונן למכשירים שמותקנת בהם מערכת Android Oreo (מהדורת Go). חשוב לזכור שהפקודה אפליקציה קלים ויעילים יותר שיועילו לכל הקהל, בלי קשר למכשיר.
ממשק API של רשתות נוירונים
ממשק ה-API של רשתות נוירונים (Neural Networks API) מספק יכולות מחשוב והסקת מסקנות מהירות יותר במחשב במכשיר מסגרות למידה כמו TensorFlow Lite – ספריית למידת המכונה בפלטפורמות שונות של Google לנייד – וגם Caffe2 ואחרים. ביקור ב-TensorFlow Lite קוד פתוח repo להורדות ולמסמכים. TensorFlow Lite עובד עם ה-API של רשתות הנוירונים כדי להריץ מודלים כמו MobileNets, Inception v3, ו- התכונה 'תשובה מהירה' במכשיר הנייד.
עדכונים של framework למילוי אוטומטי
ב-Android 8.1 (רמת API 27) יש כמה שיפורים במילוי האוטומטי מסגרת שאפשר לשלב באפליקציות.
BaseAdapter
הכיתה כוללת עכשיו את setAutofillOptions()
, שמאפשרת לספק ייצוגי מחרוזות של הערכים
עם מתאם בלבד. זה שימושי לספינר
אמצעי בקרה שיוצרים באופן דינמי את הערכים במתאמים שלהם. לדוגמה,
אפשר להשתמש בשיטה setAutofillOptions()
כדי לספק מחרוזת
ייצוג של רשימת השנים שהמשתמשים יכולים לבחור כחלק
תאריך התפוגה של כרטיס האשראי. שירותי המילוי האוטומטי יכולים להשתמש בייצוג מחרוזות
כדי למלא כראוי את התצוגות שבהן נדרשים הנתונים.
בנוסף, AutofillManager
המחלקה כוללת את השיטה notifyViewVisibilityChanged(View, int, boolean)
שתוכל להתקשר כדי להודיע ל-framework על שינויים בחשיפה של
את התצוגה במבנה וירטואלי. יש גם עומס יתר על השיטה
של מבנים וירטואליים. עם זאת, מבנים לא וירטואליים בדרך כלל לא מצריכים
להודיע ל-framework באופן מפורש כי ל-method כבר קראו את הקריאה
View
בכיתה.
ב-Android 8.1 גם יש לשירותי המילוי האוטומטי יותר אפשרות להתאים אישית את ממשק המשתמש לשמירה
יותר משתלם על ידי הוספת תמיכה ב-CustomDescription
and
Validator
בתוך SaveInfo
.
תיאורים בהתאמה אישית הם שימושיים שעוזרים לשירות המילוי האוטומטי להבהיר מה
שמירה, לדוגמה, כשהמסך מכיל כרטיס אשראי, ייתכן
להציג את הלוגו של בנק כרטיס האשראי, את ארבע הספרות האחרונות של כרטיס האשראי
ואת מספר פקיעת התוקף שלו. מידע נוסף זמין ב
CustomDescription
בכיתה.
Validator
אובייקטים משמשים למניעת הצגה של ממשק המשתמש לשמירה במילוי אוטומטי כשכלי התיקוף
לא מתקיים. מידע נוסף זמין ב
המחלקה לאימות יחד עם מחלקות המשנה שלה,
LuhnChecksumValidator ו-RegexValidator.
התראות
מערכת Android 8.1 כוללת את השינויים הבאים בהתראות:
- אפליקציות יכולות עכשיו להשמיע צליל התראת התראות רק פעם בשנייה. צלילי התראה שחורגים מהטווח השערים האלה לא נוספים לתור ויאבדו. השינוי הזה לא משפיע על היבטים אחרים של ההתראות הודעות ההתנהגות וההתראות עדיין יפורסמו כצפוי.
-
NotificationListenerService
והקבוצה אין תמיכה ב-ConditionProviderService
עם זיכרון RAM נמוך מכשירי Android שמחזיריםtrue
כאשר מתבצעת שיחה אלActivityManager.isLowRamDevice()
.
עדכון EditText
החל מרמת API 27, ה-method EditText.getText()
מחזירה Editable
; בעבר
הוא החזיר CharSequence
. השינוי הזה הוא
תואם לאחור, כפי ש-Editable
מיישם
CharSequence
.
הממשק של Editable
מספק ערך נוסף
החדשה. לדוגמה, כי גם Editable
יכול להחיל את הממשק Spannable
, אפשר להחיל תגי עיצוב
תוכן במופע של EditText
.
פעולות פרוגרמטיות של גלישה בטוחה
באמצעות
WebView
ההטמעה של ממשק ה-API של הגלישה הבטוחה, האפליקציה שלך יכולה
זיהוי כשמופע של WebView
מנסה לנווט
לכתובת URL ש-Google סיווגה כאיום ידוע. כברירת מחדל,
ב-WebView
מוצגת מודעת מעברון שמזהירה את המשתמשים מפני האיום הידוע.
מסך זה מאפשר למשתמשים לטעון את כתובת האתר בכל זאת או לחזור
הדף הקודם הבטוח.
ב-Android 8.1, ניתן להגדיר באופן פרוגרמטי איך האפליקציה מגיבה לאיום ידוע:
- באפשרותך לקבוע אם האפליקציה תדווח על איומים מוכרים ל-Safe גלישה.
- אפשר להגדיר שהאפליקציה תבצע באופן אוטומטי פעולה מסוימת, כמו חוזרים לדף הבטוח – בכל פעם שהיא נתקלת בכתובת URL שגלישה בטוחה מסווג כאיום ידוע.
הערה: כדי לקבל הגנה אופטימלית מפני איומים מוכרים, יש להמתין
עד שתפעיל את הגלישה הבטוחה לפני שתפעיל
ה-method loadUrl()
של אובייקט WebView
.
קטעי הקוד הבאים מראים איך אפשר להורות על מקרים של אפליקציות
WebView
כדי לחזור למצב בטוח לאחר שנתקלים
איום ידוע:
<manifest> <application> ... <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing" android:value="true" /> </application> </manifest>
Kotlin
private var superSafeWebView: WebView? = null private var safeBrowsingIsInitialized: Boolean = false // ... override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) superSafeWebView = WebView(this).apply { webViewClient = MyWebViewClient() safeBrowsingIsInitialized = false startSafeBrowsing(this@SafeBrowsingActivity, { success -> safeBrowsingIsInitialized = true if (!success) { Log.e("MY_APP_TAG", "Unable to initialize Safe Browsing!") } }) } }
Java
private WebView superSafeWebView; private boolean safeBrowsingIsInitialized; // ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); superSafeWebView = new WebView(this); superSafeWebView.setWebViewClient(new MyWebViewClient()); safeBrowsingIsInitialized = false; superSafeWebView.startSafeBrowsing(this, new ValueCallback<Boolean>() { @Override public void onReceiveValue(Boolean success) { safeBrowsingIsInitialized = true; if (!success) { Log.e("MY_APP_TAG", "Unable to initialize Safe Browsing!"); } } }); }
Kotlin
class MyWebViewClient : WebViewClient() { // Automatically go "back to safety" when attempting to load a website that // Safe Browsing has identified as a known threat. An instance of WebView // calls this method only after Safe Browsing is initialized, so there's no // conditional logic needed here. override fun onSafeBrowsingHit( view: WebView, request: WebResourceRequest, threatType: Int, callback: SafeBrowsingResponse ) { // The "true" argument indicates that your app reports incidents like // this one to Safe Browsing. callback.backToSafety(true) Toast.makeText(view.context, "Unsafe web page blocked.", Toast.LENGTH_LONG).show() } }
Java
public class MyWebViewClient extends WebViewClient { // Automatically go "back to safety" when attempting to load a website that // Safe Browsing has identified as a known threat. An instance of WebView // calls this method only after Safe Browsing is initialized, so there's no // conditional logic needed here. @Override public void onSafeBrowsingHit(WebView view, WebResourceRequest request, int threatType, SafeBrowsingResponse callback) { // The "true" argument indicates that your app reports incidents like // this one to Safe Browsing. callback.backToSafety(true); Toast.makeText(view.getContext(), "Unsafe web page blocked.", Toast.LENGTH_LONG).show(); } }
חילוץ תמונות ממוזערות של סרטון
לכיתה MediaMetadataRetriever
יש שיטה חדשה, getScaledFrameAtTime()
,
מסגרת בקרבת מיקום נתון של זמן, ומחזירה מפת סיביות עם אותו היבט
יחס של מסגרת המקור, אך ניתן להתאים אותו למלבן ברוחב נתון
גובה. האפשרות הזו שימושית ליצירת תמונות ממוזערות מסרטון.
מומלץ להשתמש בשיטה הזו ולא בgetFrameAtTime()
, כי זה עלול לבזבז את הזיכרון
כי הוא מחזיר מפת סיביות של אותה רזולוציה כמו סרטון המקור. עבור
לדוגמה, פריים מסרטון באיכות 4K יהיה מפת סיביות של 16MB, הרבה יותר גדולה ממך
שיזדקקו לתמונה ממוזערת.
ממשק API לזיכרון משותף
Android 8.1 (רמת API 27) כולל
SharedMemory
API. בכיתה הזו אפשר ליצור, למפות ולנהל באופן אנונימי
SharedMemory
מכונה. אתם מגדירים את הגנת הזיכרון
על
SharedMemory
לקריאה ו/או כתיבה, ומכיוון
SharedMemory
האובייקט ניתן ל-Parcelable, ואפשר להעביר אותו בקלות לתהליך אחר באמצעות AIDL.
SharedMemory
ה-API פועל באופן הדדי עם
ASharedMemory
ב-NDK.
האפליקציה ASharedMemory
מספקת גישה
למתאר קובץ, שאפשר למפות אותו לקריאה ולכתיבה. זה מעולה
דרך לחלוק כמויות גדולות
של נתונים בין אפליקציות או בין מספר תהליכים בתוך אפליקציה אחת.
ממשק API של BackgroundColors
מערכת Android 8.1 (רמת API 27) מאפשרת לטפט הדינמי לספק צבע
לממשק המשתמש של המערכת. כדי לעשות את זה צריך ליצור WallpaperColors
מפת סיביות, פריט גרפי, או שימוש בשלושה צבעים שנבחרו באופן ידני.
אפשר גם לאחזר את נתוני הצבע האלה.
כדי ליצור WallpaperColors
אובייקט, מבצעים אחת מהפעולות הבאות:
- כדי ליצור
WallpaperColors
באמצעות שלושה צבעים, יוצרים מופע שלWallpaperColors
על ידי העברת הצבע הראשי, המשני והשלישי. המשחק הראשי הצבע לא יכול להיות ריק. - כדי ליצור
WallpaperColors
ממפת סיביות (bitmap), קוראים לפונקציהfromBitmap()
על ידי העברת המקור של מפת הסיביות כפרמטר. - כדי ליצור
WallpaperColors
של אובייקט שניתן להזזה, קוראים לפונקציהfromDrawable()
על ידי העברת המקור שניתן להזזה כפרמטר.
כדי לאחזר את פרטי הצבע הראשיים, המשניים או השלישיים מ טפט, קרא לשיטות הבאות:
getPrimaryColor()
מחזירה את הצבע הייצוגי ביותר של הטפט.getSecondaryColor()
מחזירה את הצבע השני הבולט ביותר של הטפט.getTertiaryColor()
מחזירה את הצבע השלישי החשוב ביותר של הטפט.
כדי להודיע למערכת על שינויים משמעותיים בצבעים של הטפט המונפש:
להתקשר אל notifyColorsChanged()
. השיטה הזו מפעילה מחזור חיים של onComputeColors()
אירוע שבו יש לך הזדמנות לספק WallpaperColors
חדש
לאובייקט.
כדי להוסיף אוזן לשינויי צבע, אפשר לקרוא ל-method addOnColorsChangedListener()
. אפשר
קוראים גם ל-method getWallpaperColors()
כדי לאחזר את הצבעים הראשיים של הטפט.
עדכונים של טביעת אצבע
בכיתה FingerprintManager
יש
את קודי השגיאה הבאים:
-
FINGERPRINT_ERROR_LOCKOUT_PERMANENT
– המשתמש ניסה יותר מדי פעמים כדי לבטל את נעילת המכשיר באמצעות קורא טביעות האצבע. -
FINGERPRINT_ERROR_VENDOR
– טביעת אצבע ספציפית של הספק אירעה שגיאה בקורא.
עדכונים לגבי קריפטוגרפיה
בוצעו כמה שינויים בתחום הקריפטוגרפיה ב-Android 8.1:
- אלגוריתמים חדשים הוטמעו ב-Conscrypt. הקריפטו
עדיף להשתמש בהטמעה על פני טירת בונסי הקיימת.
יישום בפועל. האלגוריתמים החדשים כוללים:
AlgorithmParameters:GCM
KeyGenerator:AES
KeyGenerator:DESEDE
KeyGenerator:HMACMD5
KeyGenerator:HMACSHA1
KeyGenerator:HMACSHA224
KeyGenerator:HMACSHA256
KeyGenerator:HMACSHA384
KeyGenerator:HMACSHA512
SecretKeyFactory:DESEDE
Signature:NONEWITHECDSA
Cipher.getParameters().getParameterSpec(IvParameterSpec.class)
לא פועל יותר עבור אלגוריתמים שמשתמשים ב-GCM. במקום זאת, השתמשוgetParameterSpec(GCMParameterSpec.class)
- הרבה מחלקות פנימיות של Conscrypt שמשויכות ל-TLS עברו ארגון מחדש. מאז
לפעמים מפתחים ניגשים אליהם באופן רפלקטיבי, הם נשארו במקומם
תמיכה בשימוש קודם, אבל חלק מהפרטים השתנו. לדוגמה: sockets
בעבר היו מסוג
OpenSSLSocketImpl
, אבל עכשיו הם מסוגConscryptFileDescriptorSocket
אוConscryptEngineSocket
, שתיהן מתמשכותOpenSSLSocketImpl
SSLSession
שיטות לזריקהIllegalArgumentException
כשהעבירו הפניה ריקה, עכשיו הם לזרוק אתNullPointerException
.- כבר אי אפשר ליצור מפתחות ב-RSA
KeyFactory
ממערכי בייטים שגדולים מהמפתח המקודד. שיחות אלgeneratePrivate()
והקבוצהgeneratePublic()
שמספקיםKeySpec
כאשר מבנה המפתח לא ממלא את מאגר הנתונים הזמני כולו יגרום להצגה שלInvalidKeySpecException
. - כאשר קריאת שקע נקטעת על ידי סגירת השקע, נעשה שימוש ב-Conscrypt
כדי להחזיר -1 מהקריאה. הקריאה עכשיו גורמת
SocketException
- קבוצת אישורי ה-CA ברמה הבסיסית השתנתה, כולל הסרה של מספר האישורים המיושנים, אך גם הסרת אישורי הבסיס עבור WoSign ו-StartCom. מידע נוסף על ההחלטה הזו זמין במאמר פוסט בבלוג האבטחה, סופית הסרת האמון באישורי WoSign ו-StartCom.