Android 8.1 বৈশিষ্ট্য এবং API

অ্যান্ড্রয়েড 8.1 (এপিআই লেভেল 27) ব্যবহারকারী এবং ডেভেলপারদের জন্য বিভিন্ন ধরনের নতুন বৈশিষ্ট্য এবং ক্ষমতা প্রবর্তন করে। এই নথিটি ডেভেলপারদের জন্য নতুন কী তা হাইলাইট করে৷

অ্যান্ড্রয়েড ওরিও (গো সংস্করণ)

বিশ্বজুড়ে অনলাইনে আসা কোটি কোটি লোকের জন্য Android অভিজ্ঞতা অপ্টিমাইজ করার জন্য Android Go হল আমাদের উদ্যোগ। Android 8.1 দিয়ে শুরু করে, আমরা Android-কে এন্ট্রি-লেভেল ডিভাইসগুলির জন্য একটি দুর্দান্ত প্ল্যাটফর্ম তৈরি করছি। অ্যান্ড্রয়েড ওরিও (গো সংস্করণ) কনফিগারেশনের বৈশিষ্ট্যগুলির মধ্যে রয়েছে:

Android Oreo (Go সংস্করণ) চালিত ডিভাইসগুলির জন্য কীভাবে আপনার অ্যাপটি অপ্টিমাইজ করবেন সে সম্পর্কে অতিরিক্ত নির্দেশিকা সহ আমরা বিলিয়ন নির্দেশিকাগুলির জন্য বিল্ডিং আপডেট করেছি। বেশিরভাগ ডেভেলপারদের জন্য, আপনার বিদ্যমান APK অপ্টিমাইজ করা বা Google Play-এর একাধিক APK বৈশিষ্ট্য ব্যবহার করে আপনার APK-এর একটি সংস্করণকে কম র‍্যাম ডিভাইসে টার্গেট করা Android Oreo (Go সংস্করণ) চালিত ডিভাইসগুলির জন্য প্রস্তুত করার সর্বোত্তম উপায়। মনে রাখবেন যে ডিভাইস নির্বিশেষে আপনার অ্যাপটিকে হালকা এবং আরও দক্ষ করে তোলা আপনার সমগ্র দর্শকদের উপকার করে৷

নিউরাল নেটওয়ার্ক API

নিউরাল নেটওয়ার্ক এপিআই টেনসরফ্লো লাইট —মোবাইলের জন্য Google-এর ক্রস-প্ল্যাটফর্ম এমএল লাইব্রেরি—এর পাশাপাশি Caffe2 এবং অন্যান্যের মতো অন-ডিভাইস মেশিন লার্নিং ফ্রেমওয়ার্কগুলির জন্য ত্বরিত গণনা এবং অনুমান সরবরাহ করে। ডাউনলোড এবং ডক্সের জন্য TensorFlow Lite ওপেন সোর্স রেপোতে যান। TensorFlow Lite আপনার মোবাইল ডিভাইসে MobileNets , Inception v3 , এবং Smart Reply- এর মতো মডেলগুলি চালানোর জন্য নিউরাল নেটওয়ার্ক API এর সাথে কাজ করে৷

অটোফিল ফ্রেমওয়ার্ক আপডেট

Android 8.1 (API লেভেল 27) অটোফিল ফ্রেমওয়ার্কের বেশ কিছু উন্নতি প্রদান করে যা আপনি আপনার অ্যাপে অন্তর্ভুক্ত করতে পারেন।

BaseAdapter ক্লাসে এখন setAutofillOptions() পদ্ধতি রয়েছে, যা আপনাকে অ্যাডাপ্টারের মানগুলির স্ট্রিং উপস্থাপনা প্রদান করতে দেয়। এটি স্পিনার নিয়ন্ত্রণের জন্য দরকারী যা গতিশীলভাবে তাদের অ্যাডাপ্টারের মানগুলি তৈরি করে। উদাহরণস্বরূপ, আপনি setAutofillOptions() পদ্ধতিটি ব্যবহার করতে পারেন বছরের তালিকার একটি স্ট্রিং উপস্থাপনা প্রদান করতে যা ব্যবহারকারীরা ক্রেডিট কার্ডের মেয়াদ শেষ হওয়ার তারিখের অংশ হিসাবে বেছে নিতে পারেন। অটোফিল পরিষেবাগুলি স্ট্রিং উপস্থাপনা ব্যবহার করে ডেটার প্রয়োজন হয় এমন ভিউগুলি যথাযথভাবে পূরণ করতে পারে৷

অতিরিক্তভাবে, AutofillManager ক্লাসে notifyViewVisibilityChanged(View, int, boolean) পদ্ধতি রয়েছে যা আপনি একটি ভার্চুয়াল কাঠামোর দৃশ্যের দৃশ্যমানতার পরিবর্তন সম্পর্কে ফ্রেমওয়ার্ককে অবহিত করতে কল করতে পারেন। অ ভার্চুয়াল কাঠামোর জন্য পদ্ধতির একটি ওভারলোডও রয়েছে। যাইহোক, নন ভার্চুয়াল স্ট্রাকচারের জন্য সাধারণত আপনাকে ফ্রেমওয়ার্কটি স্পষ্টভাবে অবহিত করার প্রয়োজন হয় না কারণ পদ্ধতিটি ইতিমধ্যে View ক্লাস দ্বারা কল করা হয়েছে।

Android 8.1 অটোফিল পরিষেবাগুলিকে SaveInfo এর মধ্যে CustomDescription and Validator জন্য সমর্থন যোগ করে সেভ UI সামর্থ্য কাস্টমাইজ করার আরও ক্ষমতা দেয়৷

স্বয়ংক্রিয়ভাবে পূরণ করা পরিষেবাকে কী সংরক্ষিত করা হচ্ছে তা স্পষ্ট করতে সাহায্য করার জন্য কাস্টম বিবরণ দরকারী; উদাহরণস্বরূপ, যখন স্ক্রিনে একটি ক্রেডিট কার্ড থাকে, তখন এটি ক্রেডিট কার্ড ব্যাঙ্কের একটি লোগো, ক্রেডিট কার্ড নম্বরের শেষ চারটি সংখ্যা এবং এর মেয়াদ শেষ হওয়ার নম্বর প্রদর্শন করতে পারে। আরও জানতে, CustomDescription ক্লাস দেখুন।

যাচাইকারীর শর্ত সন্তুষ্ট না হলে অটোফিল সেভ UI প্রদর্শন এড়াতে Validator অবজেক্ট ব্যবহার করা হয়। আরও জানতে, এর সাবক্লাস, LuhnChecksumValidator এবং RegexValidator সহ ভ্যালিডেটর ক্লাস দেখুন।

বিজ্ঞপ্তি

Android 8.1-এ বিজ্ঞপ্তিতে নিম্নলিখিত পরিবর্তনগুলি অন্তর্ভুক্ত রয়েছে:

  • অ্যাপগুলি এখন শুধুমাত্র প্রতি সেকেন্ডে একবার একটি বিজ্ঞপ্তি সতর্কতা শব্দ করতে পারে। এই হারের বেশি সতর্কতামূলক শব্দগুলি সারিবদ্ধ হয় না এবং হারিয়ে যায়। এই পরিবর্তনটি বিজ্ঞপ্তি আচরণের অন্যান্য দিকগুলিকে প্রভাবিত করে না এবং বিজ্ঞপ্তি বার্তাগুলি এখনও প্রত্যাশিত হিসাবে পোস্ট করে৷
  • NotificationListenerService এবং ConditionProviderService কম-র‍্যাম অ্যান্ড্রয়েড-চালিত ডিভাইসগুলিতে সমর্থিত নয় যেগুলি ActivityManager.isLowRamDevice() কল করা হলে true ফিরে আসে৷

এডিট টেক্সট আপডেট

API স্তর 27 থেকে শুরু করে, EditText.getText() পদ্ধতি একটি Editable প্রদান করে; পূর্বে এটি একটি CharSequence ফেরত দিয়েছিল। এই পরিবর্তনটি পশ্চাদমুখী-সামঞ্জস্যপূর্ণ, কারণ Editable CharSequence প্রয়োগ করে।

Editable ইন্টারফেস মূল্যবান অতিরিক্ত কার্যকারিতা প্রদান করে। উদাহরণস্বরূপ, যেহেতু Editable Spannable ইন্টারফেসও প্রয়োগ করে, আপনি EditText এর একটি উদাহরণের মধ্যে সামগ্রীতে মার্কআপ প্রয়োগ করতে পারেন।

প্রোগ্রাম্যাটিক সেফ ব্রাউজিং অ্যাকশন

নিরাপদ ব্রাউজিং API-এর WebView বাস্তবায়ন ব্যবহার করে, আপনার অ্যাপ শনাক্ত করতে পারে যখন WebView এর একটি উদাহরণ এমন একটি URL-এ নেভিগেট করার চেষ্টা করে যা Google একটি পরিচিত হুমকি হিসেবে শ্রেণীবদ্ধ করেছে। ডিফল্টরূপে, WebView একটি ইন্টারস্টিশিয়াল দেখায় যা ব্যবহারকারীদের পরিচিত হুমকি সম্পর্কে সতর্ক করে। এই স্ক্রীন ব্যবহারকারীদের যেভাবেই হোক URL লোড করার বা নিরাপদ আগের পৃষ্ঠায় ফিরে যাওয়ার বিকল্প দেয়৷

অ্যান্ড্রয়েড 8.1-এ, আপনি প্রোগ্রাম্যাটিকভাবে সংজ্ঞায়িত করতে পারেন যে কীভাবে আপনার অ্যাপ একটি পরিচিত হুমকিতে সাড়া দেয়:

  • আপনার অ্যাপ নিরাপদ ব্রাউজিং-এর জন্য পরিচিত হুমকির রিপোর্ট করে কিনা তা আপনি নিয়ন্ত্রণ করতে পারেন।
  • আপনি আপনার অ্যাপকে স্বয়ংক্রিয়ভাবে একটি নির্দিষ্ট ক্রিয়া সম্পাদন করতে পারেন—যেমন নিরাপত্তায় ফিরে যাওয়া—প্রতিবার যখন এটি একটি URL এর মুখোমুখি হয় যা নিরাপদ ব্রাউজিং একটি পরিচিত হুমকি হিসাবে শ্রেণীবদ্ধ করে।

দ্রষ্টব্য: পরিচিত হুমকির বিরুদ্ধে সর্বোত্তম সুরক্ষার জন্য, আপনি একটি WebView অবজেক্টের loadUrl() পদ্ধতি চালু করার আগে নিরাপদ ব্রাউজিং শুরু করা পর্যন্ত অপেক্ষা করুন৷

নিম্নলিখিত কোড স্নিপেটগুলি দেখায় যে আপনি কীভাবে আপনার অ্যাপের WebView -এর দৃষ্টান্তগুলিকে একটি পরিচিত হুমকির সম্মুখীন হওয়ার পরে সর্বদা নিরাপদে ফিরে যেতে নির্দেশ দিতে পারেন:

AndroidManifest.xml

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

MyWebActivity.java

কোটলিন

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

জাভা

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

কোটলিন

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()
    }
}

জাভা

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 অবজেক্টটি পার্সেলেবল, আপনি সহজেই এটিকে AIDL এর মাধ্যমে অন্য প্রক্রিয়ায় প্রেরণ করতে পারেন।

SharedMemory API NDK-এ ASharedMemory সুবিধার সাথে ইন্টারঅপারেটিং করে। ASharedMemory একটি ফাইল বর্ণনাকারীতে অ্যাক্সেস দেয়, যা পরে পড়তে এবং লিখতে ম্যাপ করা যেতে পারে। অ্যাপের মধ্যে বা একটি অ্যাপের মধ্যে একাধিক প্রক্রিয়ার মধ্যে প্রচুর পরিমাণে ডেটা ভাগ করার এটি একটি দুর্দান্ত উপায়।

WallpaperColors API

Android 8.1 (API স্তর 27) আপনার লাইভ ওয়ালপেপারকে সিস্টেম UI-তে রঙের তথ্য প্রদান করতে দেয়। আপনি একটি বিটম্যাপ থেকে একটি WallpaperColors অবজেক্ট তৈরি করে, একটি অঙ্কনযোগ্য, বা তিনটি ম্যানুয়ালি-নির্বাচিত রং ব্যবহার করে এটি করতে পারেন। আপনি এই রঙ তথ্য পুনরুদ্ধার করতে পারেন.

একটি WallpaperColors অবজেক্ট তৈরি করতে, নিম্নলিখিত যে কোনও একটি করুন:

  • তিনটি রং ব্যবহার করে একটি WallpaperColors অবজেক্ট তৈরি করতে, প্রাইমারি, সেকেন্ডারি এবং টারশিয়ারি কালার পাস করে WallpaperColors ক্লাসের একটি উদাহরণ তৈরি করুন। প্রাথমিক রঙ শূন্য হতে হবে না .
  • একটি বিটম্যাপ থেকে একটি WallpaperColors অবজেক্ট তৈরি করতে, বিটম্যাপ উত্সকে প্যারামিটার হিসাবে পাস করে fromBitmap() পদ্ধতিতে কল করুন।
  • অঙ্কনযোগ্য থেকে একটি WallpaperColors অবজেক্ট তৈরি করতে, অঙ্কনযোগ্য উত্সটিকে প্যারামিটার হিসাবে পাস করে fromDrawable() পদ্ধতিতে কল করুন।

ওয়ালপেপার থেকে প্রাথমিক, মাধ্যমিক বা তৃতীয় রঙের বিবরণ পুনরুদ্ধার করতে, নিম্নলিখিত পদ্ধতিগুলিকে কল করুন:

  • getPrimaryColor() ওয়ালপেপারের সবচেয়ে দৃশ্যমান প্রতিনিধিত্বমূলক রঙ প্রদান করে।
  • getSecondaryColor() ওয়ালপেপারের দ্বিতীয় সর্বাধিক বিশিষ্ট রঙ প্রদান করে।
  • getTertiaryColor() পদ্ধতিটি ওয়ালপেপারের তৃতীয় সর্বাধিক বিশিষ্ট রঙ প্রদান করে।

আপনার লাইভ ওয়ালপেপারে কোনো উল্লেখযোগ্য রঙ পরিবর্তন সম্পর্কে সিস্টেমকে অবহিত করতে, notifyColorsChanged() পদ্ধতিতে কল করুন। এই পদ্ধতিটি একটি onComputeColors() লাইফসাইকেল ইভেন্ট ট্রিগার করে যেখানে আপনার কাছে একটি নতুন WallpaperColors অবজেক্ট প্রদান করার সুযোগ রয়েছে।

রঙ পরিবর্তনের জন্য একজন শ্রোতা যোগ করতে, আপনি addOnColorsChangedListener() পদ্ধতিতে কল করতে পারেন। আপনি একটি ওয়ালপেপারের প্রাথমিক রং পুনরুদ্ধার করতে getWallpaperColors() পদ্ধতিতেও কল করতে পারেন।

ফিঙ্গারপ্রিন্ট আপডেট

FingerprintManager ক্লাস নিম্নলিখিত ত্রুটি কোড চালু করেছে:

  • FINGERPRINT_ERROR_LOCKOUT_PERMANENT – ব্যবহারকারী ফিঙ্গারপ্রিন্ট রিডার ব্যবহার করে তাদের ডিভাইস আনলক করার জন্য অনেকবার চেষ্টা করেছেন৷
  • FINGERPRINT_ERROR_VENDOR - একটি বিক্রেতা-নির্দিষ্ট ফিঙ্গারপ্রিন্ট রিডার ত্রুটি ঘটেছে৷

ক্রিপ্টোগ্রাফি আপডেট

অ্যান্ড্রয়েড 8.1 এর সাথে বেশ কয়েকটি ক্রিপ্টোগ্রাফি পরিবর্তন করা হয়েছে:

  • কনস্ক্রিপ্টে নতুন অ্যালগরিদম প্রয়োগ করা হয়েছে। বিদ্যমান বাউন্সি ক্যাসল বাস্তবায়নের তুলনায় কনস্ক্রিপ্ট বাস্তবায়ন অগ্রাধিকারমূলকভাবে ব্যবহৃত হয়। নতুন অ্যালগরিদম অন্তর্ভুক্ত:
    • 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) ব্যবহার করুন।
  • TLS এর সাথে যুক্ত অনেক অভ্যন্তরীণ কনক্রিপ্ট ক্লাস রিফ্যাক্টর করা হয়েছিল। যেহেতু বিকাশকারীরা কখনও কখনও এইগুলি প্রতিফলিতভাবে অ্যাক্সেস করে, তাই পূর্বের ব্যবহারকে সমর্থন করার জন্য শিমগুলি জায়গায় রেখে দেওয়া হয়েছে, তবে কিছু বিবরণ পরিবর্তিত হয়েছে। উদাহরণস্বরূপ, সকেটগুলি আগে OpenSSLSocketImpl টাইপের ছিল, কিন্তু এখন সেগুলি ConscryptFileDescriptorSocket বা ConscryptEngineSocket টাইপের, উভয়ই OpenSSLSocketImpl প্রসারিত করে।
  • একটি নাল রেফারেন্স পাস করার সময় IllegalArgumentException নিক্ষেপ করার জন্য ব্যবহৃত SSLSession পদ্ধতি, তারা এখন NullPointerException নিক্ষেপ করে।
  • আরএসএ KeyFactory এনকোড করা কী থেকে বড় বাইট অ্যারে থেকে কী তৈরি করার অনুমতি দেয় না। generatePrivate() এবং generatePublic() করার কল যা একটি KeySpec প্রদান করে যেখানে কী স্ট্রাকচার পুরো বাফারটি পূরণ করে না একটি InvalidKeySpecException হবে।
  • যখন সকেট বন্ধ হয়ে যাওয়ার কারণে একটি সকেট রিড বাধাগ্রস্ত হয়, তখন Conscrypt রিড থেকে -1 ফিরে আসে। রিড এখন SocketException নিক্ষেপ করে।
  • রুট CA শংসাপত্রের সেট পরিবর্তন করা হয়েছে, বেশিরভাগ অপ্রচলিত শংসাপত্রের একটি বড় সংখ্যক অপসারণ করা হয়েছে, কিন্তু WoSign এবং StartCom-এর জন্য মূল শংসাপত্রগুলিও মুছে ফেলা হয়েছে৷ এই সিদ্ধান্তের বিষয়ে আরও তথ্যের জন্য, Google সিকিউরিটি ব্লগ পোস্ট, WoSign এবং StartCom সার্টিফিকেটে বিশ্বাসের চূড়ান্ত অপসারণ দেখুন।