תכונות וממשקי API ב-Android 8.1

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 כדי לחזור למצב בטוח לאחר שנתקלים איום ידוע:

AndroidManifest.xml

<manifest>
    <application>
        ...
        <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
                   android:value="true" />
    </application>
</manifest>

MyWebActivity.Java

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!");
            }
        }
    });
}

MyWebViewClient.Java

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.