Android 8.1 ফিচার ও API

Android 8.1 (API লেভেল 27) ব্যবহারকারী ও ডেভেলপারদের জন্য বিভিন্ন নতুন ফিচার ও কার্যকারিতা নিয়ে এসেছে। এই ডকুমেন্টে ডেভেলপারদের জন্য নতুন কী কী আছে তা হাইলাইট করা হয়েছে।

Android Oreo (Go এডিশন)

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

  • মেমরি অপ্টিমাইজেশন। ১ জিবি বা তার কম RAM থাকা ডিভাইসে অ্যাপ যাতে ভালোভাবে চলতে পারে তা নিশ্চিত করতে পুরো প্ল্যাটফর্ম জুড়ে মেমরি ব্যবহার উন্নত করা হয়েছে।
  • টার্গেটিংয়ের একাধিক বিকল্প। নতুন হার্ডওয়্যার ফিচার কনস্ট্যান্ট যা আপনাকে Google Play-এর মাধ্যমে সাধারণ বা কম RAM ডিভাইসে আপনার অ্যাপের ডিস্ট্রিবিউশন টার্গেট করতে দেয়।
  • Google Play.Android Oreo (Go edition) ভার্সনে চলে এমন ডিভাইসে সব অ্যাপ উপলভ্য থাকলেও, Google Play সেইসব অ্যাপকে দৃশ্যমানতা দেবে যেগুলি ডেভেলপাররা বিশেষভাবে অপ্টিমাইজ করেছেন যাতে কোটি কোটি মানুষের জন্য কোটি কোটি নির্দেশিকা মেনে তৈরি করা অ্যাপের মাধ্যমে দুর্দান্ত অভিজ্ঞতা প্রদান করা যায়।

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

Neural Networks API

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

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

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

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

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

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

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

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

বিজ্ঞপ্তি

Android 8.1-এ বিজ্ঞপ্তি সংক্রান্ত নিম্নলিখিত পরিবর্তনগুলি অন্তর্ভুক্ত:

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

EditText আপডেট

API লেভেল 27 থেকে শুরু করে, EditText.getText() পদ্ধতি একটি Editable রিটার্ন করে; এর আগে এটি একটি CharSequence রিটার্ন করত। এই পরিবর্তন ব্যাকওয়ার্ড-কম্প্যাটিবল, কারণ Editable, CharSequence ইমপ্লিমেন্ট করে।

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

প্রোগ্রাম্যাটিক Safe Browsing অ্যাকশন

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

Android 8.1-এ, আপনার অ্যাপ কীভাবে পরিচিত হুমকির উত্তর দেবে তা আপনি প্রোগ্রাম্যাটিকভাবে নির্ধারণ করতে পারবেন:

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

মনে রাখবেন: পরিচিত হুমকির বিরুদ্ধে সর্বোত্তম সুরক্ষার জন্য, Safe Browsing ইনিশিয়ালাইজ না করা পর্যন্ত অপেক্ষা করুন, তারপরেই কোনও WebView অবজেক্টের loadUrl() মেথড ইনভোক করুন।

নিচের কোড স্নিপেট থেকে আপনি জানতে পারবেন যে কীভাবে আপনার অ্যাপের ইনস্ট্যান্সকে 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!")
            }
        })
    }
}

জাভা

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

জাভা

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 ভিডিওর একটি ফ্রেম ১৬ এমবি বিটম্যাপ হতে পারে, যা থাম্বনেল ছবির জন্য প্রয়োজনের তুলনায় অনেক বেশি।

Shared memory 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 – ভেন্ডর-নির্দিষ্ট ফিঙ্গারপ্রিন্ট রিডার সংক্রান্ত সমস্যা হয়েছে।

ক্রিপ্টোগ্রাফি সংক্রান্ত আপডেট

Android 8.1-এ ক্রিপ্টোগ্রাফি সংক্রান্ত বেশ কিছু পরিবর্তন করা হয়েছে:

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