আমি ব্যবহার করতে চান জাহির পরীক্ষা চলাকালে এমুলেটর, বা আমার ডিভাইসে কিছু ক্ষেত্রে আমার অ্যাপ্লিকেশানের ধ্বংস করতে আমার Android অ্যাপ্লিকেশানে শব্দ। এটা কি সম্ভব?
দেখে মনে হচ্ছে যে এমুলেটরটি কেবল আমার দাবী উপেক্ষা করে।
আমি ব্যবহার করতে চান জাহির পরীক্ষা চলাকালে এমুলেটর, বা আমার ডিভাইসে কিছু ক্ষেত্রে আমার অ্যাপ্লিকেশানের ধ্বংস করতে আমার Android অ্যাপ্লিকেশানে শব্দ। এটা কি সম্ভব?
দেখে মনে হচ্ছে যে এমুলেটরটি কেবল আমার দাবী উপেক্ষা করে।
উত্তর:
এপিআই JUnit সংস্থান সরবরাহ করে ।
আপনি করতে পারেন
import static junit.framework.Assert.*;
এখন আপনি অ্যাসেটট্রু, অ্যাসেটএকুয়ালস, অ্যাসেটনুল যা জুনিট ফ্রেমওয়ার্কে প্রদত্ত সমস্ত ফাংশন ব্যবহার করতে পারেন।
অ্যালিপসের মাধ্যমে জুনিট 4 কাঠামো আমদানি না করার বিষয়ে সতর্ক থাকুন, এটি org.junit প্যাকেজ হবে। এন্ড্রয়েড ডিভাইস বা এমুলেটরটিতে কাজ করার জন্য আপনাকে জুনিট.ফ্রেমওয়ার্ক প্যাকেজটি ব্যবহার করতে হবে।
এম্বেড করা ভিএম কন্ট্রোল ডকুমেন্টটি দেখুন ( উত্স ট্রি থেকে কাঁচা এইচটিএমএল বা একটি সুন্দর বিন্যাসিত অনুলিপি)।
মূলত, ডালভিক ভিএম পূর্বনির্ধারিত অনুসারে চেকগুলি অগ্রাহ্য করতে প্রস্তুত, যদিও .ডেক্স বাইট কোডটিতে চেকটি সম্পাদনের জন্য কোড অন্তর্ভুক্ত থাকে। জরিপগুলি চেক করা দুটি উপায়ের একটিতে চালু করা হয়েছে:
(1) এর মাধ্যমে সিস্টেমের সম্পত্তি "ডিবাগ.সেসার্ট" সেট করে:
adb shell setprop debug.assert 1
যা আমি যাচাই করেছি যতক্ষণ না আপনি এটি করার পরে আপনার অ্যাপ্লিকেশনটি পুনরায় ইনস্টল করবেন ততক্ষণ উদ্দেশ্য হিসাবে কাজ করে বা
(২) ডালভিক ভিএম-তে কমান্ড লাইন আর্গুমেন্ট "- সক্ষম-জোর" প্রেরণ করে যা অ্যাপ ডেভেলপাররা করতে সক্ষম হবেন সম্ভবত (কেউ যদি আমাকে এখানে ভুল হয় তবে আমাকে সংশোধন করে)।
মূলত, এমন একটি পতাকা রয়েছে যা বিশ্বব্যাপী, প্যাকেজ স্তরে বা একটি শ্রেণির স্তরে সেট করা যেতে পারে যা সংশ্লিষ্ট স্তরে দৃser়তা সক্ষম করে। পতাকাটি ডিফল্টরূপে বন্ধ থাকে যার ফলস্বরূপ দৃser় চেকগুলি এড়িয়ে যায়।
আমি আমার নমুনা ক্রিয়াকলাপে নিম্নলিখিত কোডটি লিখেছি:
public class AssertActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
int x = 2 + 3;
assert x == 4;
}
}
এই কোডের জন্য, ডালভিক বাইট কোড উত্পন্ন হয় যা হ'ল (অ্যান্ড্রয়েড 2.3.3 এর জন্য):
// Static constructor for the class
000318: |[000318] com.example.asserttest.AssertActivity.:()V
000328: 1c00 0300 |0000: const-class v0, Lcom/example/asserttest/AssertActivity; // class@0003
00032c: 6e10 0c00 0000 |0002: invoke-virtual {v0}, Ljava/lang/Class;.desiredAssertionStatus:()Z // method@000c
000332: 0a00 |0005: move-result v0
000334: 3900 0600 |0006: if-nez v0, 000c // +0006
000338: 1210 |0008: const/4 v0, #int 1 // #1
00033a: 6a00 0000 |0009: sput-boolean v0, Lcom/example/asserttest/AssertActivity;.$assertionsDisabled:Z // field@0000
00033e: 0e00 |000b: return-void
000340: 1200 |000c: const/4 v0, #int 0 // #0
000342: 28fc |000d: goto 0009 // -0004
:
:
// onCreate()
00035c: |[00035c] com.example.asserttest.AssertActivity.onCreate:(Landroid/os/Bundle;)V
00036c: 6f20 0100 3200 |0000: invoke-super {v2, v3}, Landroid/app/Activity;.onCreate:(Landroid/os/Bundle;)V // method@0001
000372: 1501 037f |0003: const/high16 v1, #int 2130903040 // #7f03
000376: 6e20 0500 1200 |0005: invoke-virtual {v2, v1}, Lcom/example/asserttest/AssertActivity;.setContentView:(I)V // method@0005
00037c: 1250 |0008: const/4 v0, #int 5 // #5
00037e: 6301 0000 |0009: sget-boolean v1, Lcom/example/asserttest/AssertActivity;.$assertionsDisabled:Z // field@0000
000382: 3901 0b00 |000b: if-nez v1, 0016 // +000b
000386: 1251 |000d: const/4 v1, #int 5 // #5
000388: 3210 0800 |000e: if-eq v0, v1, 0016 // +0008
00038c: 2201 0c00 |0010: new-instance v1, Ljava/lang/AssertionError; // class@000c
000390: 7010 0b00 0100 |0012: invoke-direct {v1}, Ljava/lang/AssertionError;.:()V // method@000b
000396: 2701 |0015: throw v1
000398: 0e00 |0016: return-void
লক্ষ্য করুন কীভাবে স্থিতিশীল কন্সট্রাক্টর ক্লাস অবজেক্টে পছন্দসই অ্যাসারশনস্ট্যাটাস পদ্ধতিটি আহ্বান করে এবং ক্লাস-ওয়াইড ভেরিয়েবল সেট করে; অ্যাসারেন্সডিজবল; এছাড়াও লক্ষ্য করুন যে অনক্রিট ()-তে, java.lang.AssertionError নিক্ষেপের সমস্ত কোডই সংকলিত আছে, তবে এটি কার্যকর করা স্ট্যাটিক কনস্ট্রাক্টরের ক্লাস অবজেক্টের জন্য নির্ধারিত $ assertionsDable এর মান অনুসারে কাজ করে।
এটি প্রদর্শিত হয় যে JUnit এর দৃsert় ক্লাসটি প্রধানত ব্যবহৃত হয়, সুতরাং এটি সম্ভবত এটির জন্য নিরাপদ বাজি। আসর্ট কীওয়ার্ডের নমনীয়তা হ'ল বিকাশের সময়ে দৃser়তাগুলি চালু করা এবং শিপিং বিটের জন্য এগুলি বন্ধ করে দেওয়া এবং পরিবর্তে কৌতুকপূর্ণভাবে ব্যর্থ হওয়া।
আশাকরি এটা সাহায্য করবে.
import static junit.framework.Assert.*
এবং তারপরে আমি এর একটি পদ্ধতি ব্যবহার করি, যেমন assertNotNull("It's null!", someObject);
, শিপিং বিটে এই দাবিটি বন্ধ করা আছে?
adb shell setprop debug.assert 1
গ্রহন করার কোনও উপায় আছে কি ?
su
, তারপর setprop debug.assert 1
। দ্রষ্টব্য যে আপনি যে কোডটি ডিসেমাম্বলড দেখিয়েছেন তা একটি রিলিজ বিল্ডে থাকবে ( স্ট্যাকওভারফ্লো . com/ a/ 5590378 / 506073 )। আমি বিশ্বাস করি না যে জাভাক সংকলককে দৃ e়তা ছাড়তে না বলা যেতে পারে তাই তাদের কোনওভাবে বাইরে বেরিয়ে আসা দরকার। এটির একটি সহজ সমাধান হ'ল কীওয়ার্ডটি আপনার নিজের ফাংশনে দৃsert়ভাবে মোড়ানো যা আপনার জন্য অগ্রসর হতে পারে।
যখন দাবিগুলি সক্ষম থাকে, বুলিয়ান এক্সপ্রেশন থাকে assert
কীওয়ার্ডটি কেবল একটি নিক্ষেপ করে ।AssertionError
false
সুতরাং আইএমও, সেরা বিকল্প, esp। আপনি জুনিটের উপর নির্ভর করতে যদি বিরক্ত AssertionError
হন তবে নীচের মত প্রকাশিতভাবে স্পষ্টভাবে ছোঁড়াতে হবে :
assert x == 0 : "x = " + x;
উপরোক্ত বিবৃতিটির বিকল্প হ'ল:
Utils._assert(x == 0, "x = " + x);
পদ্ধতিটি যেখানে সংজ্ঞায়িত হয়েছে:
public static void _assert(boolean condition, String message) {
if (!condition) {
throw new AssertionError(message);
}
}
ওরাকল জাভা ডক্স একটি গ্রহণযোগ্য বিকল্প হিসাবে নিক্ষেপ করার পরামর্শ দেয়AssertionError
।
আমার ধারণা আপনি উত্পাদন কোডের জন্য এই কলগুলি সরাতে প্রিগার্ডটি কনফিগার করতে পারেন।
"অনুশীলনে অ্যান্ড্রয়েড" এ এটি ব্যবহার করার পরামর্শ দেওয়া হয়েছে:
$adb shell setprop dalvik.vm.enableassertions all
যদি এই সেটিংসটি আপনার ফোনে অব্যাহত না থাকে তবে আপনি /data/local.prop ফাইল তৈরি করতে পারেন এর মতো বৈশিষ্ট্য সহ:
dalvik.vm.enableassertions=all
chmod 644
)।
গুগল এ বিষয়টি যাচাই করা না হওয়া পযর্ন্ত আমার বক্তব্য কার্যকর হয়নি, আমার বক্তব্য কার্যকর হয়নি ... আমি সাধারণ বক্তব্য ছেড়ে দিয়েছি এবং জুনিয়টস স্টোরেশন পদ্ধতিতে যাব।
সুবিধার্থে আমি ব্যবহার করছি:
স্ট্যাটিক জুনিট.ফ্রেমে ওয়ার্ক.আসর্ট আমদানি করুন *
স্থির আমদানির কারণে আমি পরে লিখতে পারি:
assertTrue (...); পরিবর্তে Assert.assertTrue (...);
আপনি যদি ইউনাইট (বা অন্য কোনও শ্রেণীর পাথ) তে জোর দিয়ে শপিং কোড সম্পর্কে উদ্বিগ্ন হন তবে আপনি প্রোগুয়ার্ড কনফিগারেশন বিকল্পটি 'এসুওমেনোসাইডেফেক্টস' ব্যবহার করতে পারেন, যা এই ধারণাটি বর্ধিত করে যে এটি মুছে ফেলা কোডের কিছুই করে না a ।
যেমন
-assumenosideeffects junit.framework.Assert {
*;
}
আমার একটি সাধারণ ডিবাগ লাইব্রেরি রয়েছে যা আমি আমার সমস্ত পরীক্ষার পদ্ধতিতে রেখেছি এবং তারপরে আমার প্রকাশিত অ্যাপ্লিকেশনগুলি থেকে এটিকে ছাঁটাই করতে এই বিকল্পটি ব্যবহার করি।
এটি রিলিজ কোডে কখনও ব্যবহৃত হয় না এমন ম্যানিপুলেট করা স্ট্রিংগুলির হার্ড টু স্পট সমস্যাটিকে সরিয়ে দেয়। উদাহরণস্বরূপ, আপনি যদি ডিবাগ লগ পদ্ধতি লিখেন এবং সেই পদ্ধতিতে আপনি স্ট্রিংটি লগ করার আগে ডিবাগ মোডের জন্য পরীক্ষা করেন, আপনি এখনও স্ট্রিংটি নির্মাণ করছেন, মেমরি বরাদ্দ করছেন, পদ্ধতিটি কল করছেন, কিন্তু তারপরে কিছুই করবেন না। ক্লাসটি ছড়িয়ে দেওয়া তারপরে কলগুলি পুরোপুরি সরিয়ে দেয়, এর অর্থ যতক্ষণ আপনার স্ট্রিংটি মেথড কলের অভ্যন্তরে নির্মিত হয় ততক্ষণ তা চলে যায়।
প্রোগুয়ার্ডের কোনও অংশ যাচাই না করেই সম্পন্ন করা হয়েছে, তবে লাইনগুলি সরিয়ে ফেলা সত্যই নিরাপদ কিনা তা নিশ্চিত করুন। কোনও অকার্যকর রিটার্নিং পদ্ধতি সরিয়ে ফেলা ঠিক হবে, তবে আপনি যা অপসারণ করছেন তা থেকে যদি কোনও রিটার্ন মান নিচ্ছেন তবে নিশ্চিত হয়ে নিন যে আপনি সেগুলি প্রকৃত অপারেশনাল যুক্তির জন্য ব্যবহার করছেন না।
-assumenosideeffects class junit.framework.Assert { *; }
আপনি দৃser়তাগুলি ব্যবহার করতে পারেন তবে এগুলি নির্ভরযোগ্যভাবে ব্যবহার করতে কিছু কাজ লাগে। সিস্টেমের সম্পত্তি debug.assert
অবিশ্বস্ত; সমস্যাগুলি দেখুন 175697 , 65183 , 36786 এবং 17324 ।
একটি পদ্ধতি হ'ল যে assert
কোনও রানটাইম মোকাবেলা করতে পারে এমন প্রতিটি বাক্যে অনুবাদ করা। জাভা সংকলকটির সামনে উত্স প্রিপ্রোসেসর দিয়ে এটি করুন। উদাহরণস্বরূপ, এই বিবৃতি নিন:
assert x == 0: "Failure message";
একটি ডিবাগ বিল্ডের জন্য, আপনার প্রিপ্রেসেসর উপরেরটি একটি if
বিবৃতিতে অনুবাদ করবে :
{ if( !(x == 0) ) throw new AssertionError( "Failure message" ); }
একটি উত্পাদনের জন্য, একটি খালি বিবৃতিতে:
;
নোট করুন যে এটি রান টাইম (স্বাভাবিক অনুশীলন) এর বিপরীতে বিল্ডটাইম সময়ে দৃ .়তাগুলিকে নিয়ন্ত্রণ করবে।
আমি কোনও রেডিমেড প্রিপ্রোসেসর খুঁজে পাইনি, সুতরাং আমি একটি স্ক্রিপ্ট করেছি । অংশ হিসাবে দাবী সঙ্গে ডিল দেখুন। অনুলিপি করার জন্য লাইসেন্স এখানে ।
জুনিটকে বের করে দেওয়ার বিষয়ে জুলাক্সিয়ার জবাব যোগ করতে - প্রগার্ড ইতিমধ্যে অ্যান্ড্রয়েড এসডিকে /গ্রহণের অংশ এবং নীচের পৃষ্ঠাটি কীভাবে এটি সক্ষম করতে হবে তা আপনাকে জানিয়েছে।
http://developer.android.com/guide/developing/tools/proguard.html
উপরের ওস্তাদটি সর্বশেষতম ডিফল্ট অগ্রগতি কনফিগারেশনের সাথে কাজ করে না কারণ এটি -ডোনোপটিমাইজ পতাকা ব্যবহার করে যা অবশ্যই বের করা উচিত এবং কিছু অপ্টিমাইজেশন চালু রয়েছে।
স্ট্যান্ডার্ড জাভা অ্যাসেট কীওয়ার্ড ব্যবহার করুন , উদাহরণস্বরূপ:
assert a==b;
এটি কাজ করার জন্য, আপনাকে একটি লাইন / সিস্টেমে / বিল্ড.প্রপতে যুক্ত করতে হবে এবং ফোনটি রিবুট করতে হবে:
debug.assert=1
এটি রুট ফোনে কাজ করবে। বিল্ড.প্রপ (যেমন এক্স-প্লোর) সম্পাদনা করতে সক্ষম কিছু ফাইল ম্যানেজার ব্যবহার করুন।
প্লাসস: সর্বাধিক (সমস্ত?) অ্যান্ড্রয়েড ফোনগুলি জাহাজগুলি অ্যাসেসরেন্স অক্ষম করে। এমনকি যদি আপনার কোডটি ঘটনাক্রমে ভুল হিসাবে জোর দেয়, অ্যাপ্লিকেশন বাধাগ্রস্ত হবে না বা ক্রাশ হবে না। তবে, আপনার বিকাশের ডিভাইসে আপনি দৃ exception় ব্যতিক্রম পাবেন।