অ্যান্ড্রয়েড উত্স কোডটিতে @ লুকের অর্থ কী?


120

জন্য Activityসোর্স কোড , লাইন 3898 (নিচে পাসে):

/**
 * @hide
 */
public final boolean isResumed() {
    return mResumed;
}

কী @hideমানে?

আমি আমার public class ChildActivity extends Activity { ... }ব্যবহার / দেখতে পারছি না তা খুঁজে পেয়েছি Activity.isResumed()। এটা কি স্বাভাবিক? আমি কীভাবে এটি অ্যাক্সেস করতে পারি?

উত্তর:


182

অ্যান্ড্রয়েডে দুটি ধরণের এপিআই রয়েছে যা এসডিকে মাধ্যমে অ্যাক্সেসযোগ্য নয়।

প্রথমটি প্যাকেজে অবস্থিত com.android.internal। দ্বিতীয় এপিআই টাইপটি ক্লাস এবং পদ্ধতিগুলির সংকলন যা @ হাইড জাভাদোক অ্যাট্রিবিউট দিয়ে চিহ্নিত করা হয় ।

অ্যান্ড্রয়েড 9 (এপিআই স্তর 28) থেকে শুরু করে, গুগল নন-এসডিকে ইন্টারফেসগুলি ব্যবহারের ক্ষেত্রে নতুন প্রতিবন্ধকতা প্রবর্তন করে , সরাসরি, প্রতিচ্ছবি বা জেএনআইয়ের মাধ্যমে। যখনই কোনও অ্যাপ্লিকেশন কোনও নন-এসডিকে ইন্টারফেসের উল্লেখ করে বা প্রতিবিম্ব বা জেএনআই ব্যবহার করে এর হ্যান্ডেলটি পাওয়ার চেষ্টা করে তখনই এই বিধিনিষেধগুলি প্রয়োগ করা হয়।

তবে এপিআই স্তরের ২৮ এর আগে গোপন পদ্ধতিগুলি এখনও জাভা প্রতিবিম্বের মাধ্যমে অ্যাক্সেস করা যেতে পারে। @hideতাই গুণ, Javadoc (droiddoc এছাড়াও) মাত্র অংশ @hideসহজভাবে মানে পদ্ধতি / শ্রেণী / ক্ষেত্র এপিআই ডক্স থেকে বাদ দেওয়া হয়েছে।

উদাহরণস্বরূপ, checkUidPermission()পদ্ধতি ActivityManager.javaব্যবহার @hide:

/** @hide */
public static int checkUidPermission(String permission, int uid) {
    try {
        return AppGlobals.getPackageManager()
                .checkUidPermission(permission, uid);
    } catch (RemoteException e) {
        // Should never happen, but if it does... deny!
        Slog.e(TAG, "PackageManager is dead?!?", e);
    }
    return PackageManager.PERMISSION_DENIED;
}

তবে আমরা এটিকে প্রতিবিম্ব দ্বারা কল করতে পারি:

Class c;
c = Class.forName("android.app.ActivityManager");
Method m = c.getMethod("checkUidPermission", new Class[] {String.class, int.class});
Object o = m.invoke(null, new Object[]{"android.permission.READ_CONTACTS", 10010});

1
হ্যালো @ স্টারপিংকার কি আমি "android.permission.CHANGE_COMPONENT_ENABLED_STATE" লুকানো বা অভ্যন্তরীণ এপিআই ব্যবহার করে বা রিফ্লেকশন দ্বারা অনুমতি দিতে পারি?
হার্ডিক

1
প্রথমে এই উত্তরটি পরীক্ষা করে দেখুন । এই অনুমতিটি স্বাক্ষর / সিস্টেম অনুমতি। বেশিরভাগ ক্ষেত্রে, এটি সিস্টেম অ্যাপ্লিকেশন না থাকলে আপনি এই অনুমতি পেতে পারবেন না। তার অর্থ আপনার অ্যাপ্লিকেশনটি গ্রহণ করতে বা আপনার অ্যাপ্লিকেশনটিকে একটি সিস্টেম-অ্যাপ্লিকেশন করতে এবং এটিতে স্বাক্ষর করতে আপনার অ্যান্ড্রয়েড উত্সটি পরিবর্তন করতে হবে। তবে আপনি নিজের অ্যান্ড্রয়েড সিস্টেম না তৈরি করাতে আপনি এটি করতে সক্ষম হবেন না। প্রতিচ্ছবি "লুকিয়ে থাকা" পরিচালনা করতে পারে তবে এটি অ্যান্ড্রয়েড সুরক্ষা সিস্টেমের যুক্তিকে পরিবর্তন করতে পারে না। আপনি যদি আপনি এটি করতে সক্ষম হন তবে আমরা কীভাবে সহজেই অ্যান্ড্রয়েড ডিভাইসে আক্রমণ করতে পারি তা আপনি কল্পনা করতে পারেন। @ হার্ডিক
স্টারপিংক

2
উত্তরের জন্য ধন্যবাদ, তবে আমি মনে করি উত্তরে দুটি সমস্যা আছে, আমি ভুল হলে আমাকে সংশোধন করুন। আমি "অ্যান্ড্রয়েড.অ্যাপ.অ্যাক্টিভিটি ম্যানেজার" এবং "এম.ইন.ভোকে (সি,") এর পরিবর্তে স্থিতিশীল পদ্ধতিগুলির জন্য "এম.invoke (নাল,") হওয়া উচিত বলে মনে করে ক্লাসনফাউন্ড ত্রুটি পাই। ডাকা (O, "হে ধরণ গ একটি বস্তু, ডায়নামিক পদ্ধতি জন্য যেখানে দুঃখিত আমার পোলিশ ব্যাকরণ :) জন্য।
lindenrovio

3
প্রতিবিম্ব সম্পর্কিত কেবল একটি নোট: সেই পদ্ধতিগুলি / ক্ষেত্রগুলি অফিসিয়াল এসডিকে-র অংশ না হওয়ায় ভবিষ্যতে যে কোনও অ্যান্ড্রয়েড সংশোধনীতে সেগুলি উপস্থিত থাকার কোনও গ্যারান্টি নেই।
sstn

2
যদি টীকাটি ডকুমেন্টেশন থেকে কেবল পদ্ধতিটি সরিয়ে দেয়, কেন আমি এখনও কোডটিতে এটি ব্যবহার করতে পারি না?
জাভিয়ের দেলগাদো

25
  1. @hideবিভিন্ন কারণে দৃশ্যমান হওয়া দরকার তবে প্রকাশিত এপিআইয়ের অংশ নয় এমন জিনিসগুলির জন্য ব্যবহৃত হয় । যখন এটি স্বয়ংক্রিয়ভাবে উত্স থেকে API টি বের করে তখন এগুলিকে ডকুমেন্টেশনে অন্তর্ভুক্ত করা হবে না।

  2. আপনি ঠিক বলেছেন, আপনি এটিকে ওভাররাইড করতে পারবেন না। এটি সাধারণ, এটি নকশার ভিত্তিতে, যেহেতু এটি চিহ্নিত রয়েছে final। আপনার এটি ব্যবহার করতে সক্ষম হওয়া উচিত , যদিও কোনও সম্পাদক এটি যে কোনও ইন্টিলিজেন্স ব্যবহার করে তার মধ্যে একটি পছন্দ হিসাবে এটি আপনাকে এটি না দেখায় কারণ এটি চিহ্নিত হয়েছে @hide, এবং আপনার নীচের পয়েন্ট 3 নোটটি নেওয়া উচিত।

  3. আপনার এটিকে একেবারেই ব্যবহার করা উচিত নয় কারণ এটি এপিআই-র অংশ নয় এবং বিকাশকারীরা যখনই চান তারা এটিকে সরাতে পারবেন। এমনকি তারা তাদের অধিকারের মধ্যে থাকবে, যদি তারা দুঃখের সাথে ঝোঁক থাকে তবে এটি কোনও ফাংশন দিয়ে এটি প্রতিস্থাপন করার জন্য যে ডিভাইসটি চালিত হয়েছিল সেটিকে ঘুষিয়েছে (যদিও এটি কোনও কঠোর আইনী অর্থে নয়)।


ওহ হ্যাঁ ... এটা finalঅবশ্যই আমি এটিকে ওভাররাইড করতে পারি না। দুঃখিত এটি আমার ভুল: x
মিডনাইট

আপনার অর্থ কি, এটি publicউন্নয়ন পর্যায়ে সমস্ত শ্রেণি জুড়ে। তবে এটি আমাদের মতো ব্যবহারকারীদের মতো privateবা /*package*/তাদের মতো কাজ করে?
মিডনাইট

হুম ... এটি একটি মন্তব্য মাত্র। আমি এর অর্থ বুঝতে পারি তবে কোড এবং স্তরে এই আচরণটি কী এবং কোথায় প্রয়োগ করা যায়?
মিডনাইট

1
এটি কেন প্রকাশ্য, আমি আসলে মন্তব্য করতে পারি না। হতে পারে কোড বাস্তবায়ন Activityকরা অনেকগুলি ক্লাসে ছড়িয়ে পড়ে এবং তাদের সকলকে এই সদস্যটির অ্যাক্সেস করা দরকার। বটম লাইন, এটা হল প্রকাশ্য অর্থ আপনি আপনার নিজের ঝুঁকিতে এটি ব্যবহার API- এর অংশ নয় কিন্তু।
paxdiablo

1
@ মিডনাইট, ইক্লিপসের নিজস্ব জাভা সংকলক রয়েছে যা কোনও সন্দেহ নেই যে ইন্টেলিসেন্স স্টাফের সাথে সংহত করা যায়। আমি পরামর্শ দিচ্ছি যদি আপনি এটি জাভা এসডিকে দিয়ে সংকলন করেন তবে এটি ঠিকঠাক সংকলন করবে। আমি অবশ্যই এটি প্রস্তাব করছি না, পয়েন্ট 3 দেখুন
প্যাক্সিডিয়াবল

4

@hideটীকা এর অর্থ হল এই ইন্টারফেস পাবলিক API- এর অংশ নয় এবং আপনার কোডে না ব্যবহার করা উচিত। পদ্ধতিগুলি কেবল এওএসপি-র অভ্যন্তরীণ ব্যবহারের জন্য।

গুগল আসলে নন-এসডিকে ইন্টারফেসের ব্যবহার সীমাবদ্ধ করতে শুরু করেছে । এর সাথে চিহ্নিত ইন্টারফেস অন্তর্ভুক্ত@hide

পদ্ধতিগুলি চারটি তালিকায় শ্রেণিবদ্ধ করা হয়েছে:

  • শ্বেত তালিকা: এসডিকে
  • হালকা-গ্রিলিস্ট: নন এসডিকে পদ্ধতি / ক্ষেত্রগুলি যা এখনও অ্যাক্সেসযোগ্য।
  • গাঢ় greylist:
    • অ্যাপ্লিকেশনগুলির জন্য যাদের টার্গেট এসডিকে এপিআই স্তরের 28 এর নীচে রয়েছে: একটি গা dark় গ্রিলিস্ট ইন্টারফেসের প্রতিটি ব্যবহারের অনুমতি রয়েছে।
    • এমন অ্যাপ্লিকেশনগুলির জন্য যাদের লক্ষ্য এসডিকে এপিআই স্তর 28 বা ততোধিক: কালো তালিকাভুক্ত হিসাবে একই আচরণ
  • ব্ল্যাকলিস্ট: লক্ষ্য এসডিকে নির্বিশেষে সীমাবদ্ধ। প্ল্যাটফর্মটি এমন আচরণ করবে যেন ইন্টারফেসটি অনুপস্থিত। উদাহরণস্বরূপ, অ্যাপটি যখনই এটি ব্যবহার করার চেষ্টা করছে তখন এটি NoSuchMethodError / NoSuchFieldException নিক্ষেপ করবে এবং অ্যাপটি কোনও নির্দিষ্ট শ্রেণীর ক্ষেত্রগুলি / পদ্ধতির তালিকা জানতে চাইলে এটি অন্তর্ভুক্ত করবে না।

তালিকাগুলি এখানে পাওয়া যাবে: https://android.googlesource.com/platform/prebuilts/runtime/+/master/appcompat

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.