অ্যান্ড্রয়েড 8.1 (এপিআই লেভেল 27) ব্যবহারকারী এবং ডেভেলপারদের জন্য বিভিন্ন ধরনের নতুন বৈশিষ্ট্য এবং ক্ষমতা প্রবর্তন করে। এই নথিটি ডেভেলপারদের জন্য নতুন কী তা হাইলাইট করে৷
অ্যান্ড্রয়েড ওরিও (গো সংস্করণ)
বিশ্বজুড়ে অনলাইনে আসা কোটি কোটি লোকের জন্য Android অভিজ্ঞতা অপ্টিমাইজ করার জন্য Android Go হল আমাদের উদ্যোগ। Android 8.1 দিয়ে শুরু করে, আমরা Android-কে এন্ট্রি-লেভেল ডিভাইসগুলির জন্য একটি দুর্দান্ত প্ল্যাটফর্ম তৈরি করছি। অ্যান্ড্রয়েড ওরিও (গো সংস্করণ) কনফিগারেশনের বৈশিষ্ট্যগুলির মধ্যে রয়েছে:
- মেমরি অপ্টিমাইজেশান। প্ল্যাটফর্ম জুড়ে উন্নত মেমরি ব্যবহার নিশ্চিত করতে যে অ্যাপগুলি 1GB বা কম RAM সহ ডিভাইসগুলিতে দক্ষতার সাথে চলতে পারে।
- নমনীয় টার্গেটিং বিকল্প। নতুন হার্ডওয়্যার বৈশিষ্ট্য ধ্রুবক আপনাকে Google Play-এর মাধ্যমে আপনার অ্যাপগুলির বিতরণকে সাধারণ বা কম RAM ডিভাইসগুলিতে লক্ষ্য করতে দেয়৷
- গুগল প্লে। যদিও সমস্ত অ্যাপ অ্যান্ড্রয়েড ওরিও (গো সংস্করণ) চালিত ডিভাইসগুলিতে উপলব্ধ থাকবে, গুগল প্লে বিশেষভাবে বিকাশকারীদের দ্বারা অপ্টিমাইজ করা অ্যাপগুলিকে দৃশ্যমানতা দেবে যাতে বিলিয়ন নির্দেশিকাগুলির জন্য বিল্ডিং সহ কোটি কোটি লোকেদের জন্য একটি দুর্দান্ত অভিজ্ঞতা প্রদান করা যায়।
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
-এর দৃষ্টান্তগুলিকে একটি পরিচিত হুমকির সম্মুখীন হওয়ার পরে সর্বদা নিরাপদে ফিরে যেতে নির্দেশ দিতে পারেন:
<manifest> <application> ... <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing" android:value="true" /> </application> </manifest>
কোটলিন
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!"); } } }); }
কোটলিন
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 সার্টিফিকেটে বিশ্বাসের চূড়ান্ত অপসারণ দেখুন।