Droid Hub✨
چرا این کار مفید است؟ فرض کنید تو پردازش بدون سشن: CPU ↓ 1.8GHz ↓ 2.0GHz ↓ 1.6GHz ↓ 2.2GHz سیستم نمیداند پردازش چقدر مهم است. ولی با این Session: CPU ↓ 2.8GHz ↓ 2.9GHz ↓ 2.8GHz اگر دستگاه اجازه بدهد. در نتیجه پردازش سریعتر تمام میشود. البته…
و بستن جلسه (closeSession)
وقتی کار سنگین تمام شد، باید حتماً این جلسه بسته شود. اگر بسته نشود، پردازنده در حالت آمادهباش و فرکانس بالا باقی میماند و باتری کاربر مثل بنزین مصرف میشود!
hintSession?.close
وقتی کار سنگین تمام شد، باید حتماً این جلسه بسته شود. اگر بسته نشود، پردازنده در حالت آمادهباش و فرکانس بالا باقی میماند و باتری کاربر مثل بنزین مصرف میشود!
🔥3🌭1
رادار حرارتی و جلوگیری از داغ شدن (shouldSlowDown)
وقتی پردازنده با تمام سرعت کار کند، گوشی داغ میشود. اگر گوشی بیش از حد داغ شود، خود اندروید به صورت ناگهانی و بیرحمانه فرکانس پردازنده را به شدت پایین میآورد (Thermal Throttling) که باعث قفل کردن اپلیکیشن میشود. این متد از این اتفاق جلوگیری میکنند.
این متد بررسی میکند که آیا وضعیت دمای گوشی به حالت MODERATE متوسط/رو به داغ رسیده است یا خیر.
کاربرد عملی: برنامهنویس در جریان پردازش مثلا در یک حلقه for بزرگ مرتباً متد shouldSlowDown() را چک میکند. اگر خروجی true شد، برنامه به جای ادامه دادن با حداکثر سرعت، کمی مکث میکند (مثلاً کارها را با تاخیر یا کیفیت پایینتر انجام میدهد) تا گوشی خنک شود، قبل از اینکه اندروید مجبور شود کل سیستم را کند کند.
این جاست که وقتی این متد بهمون true برمیگردونه بین پردازش ها یه delay دو تا سه ثانیه ایجاد میکنیم این جوری هیچ وقت cpu رو به حد آستانه نمیرسونیم
وقتی پردازنده با تمام سرعت کار کند، گوشی داغ میشود. اگر گوشی بیش از حد داغ شود، خود اندروید به صورت ناگهانی و بیرحمانه فرکانس پردازنده را به شدت پایین میآورد (Thermal Throttling) که باعث قفل کردن اپلیکیشن میشود. این متد از این اتفاق جلوگیری میکنند.
return status >= PowerManager.THERMAL_STATUS_MODERATE
این متد بررسی میکند که آیا وضعیت دمای گوشی به حالت MODERATE متوسط/رو به داغ رسیده است یا خیر.
کاربرد عملی: برنامهنویس در جریان پردازش مثلا در یک حلقه for بزرگ مرتباً متد shouldSlowDown() را چک میکند. اگر خروجی true شد، برنامه به جای ادامه دادن با حداکثر سرعت، کمی مکث میکند (مثلاً کارها را با تاخیر یا کیفیت پایینتر انجام میدهد) تا گوشی خنک شود، قبل از اینکه اندروید مجبور شود کل سیستم را کند کند.
این جاست که وقتی این متد بهمون true برمیگردونه بین پردازش ها یه delay دو تا سه ثانیه ایجاد میکنیم این جوری هیچ وقت cpu رو به حد آستانه نمیرسونیم
👍5🔥1🌭1
خب ما تا این جا تونستیم یه ارتباط دو طرفه با سیستم عامل برقرار کنیم تا بتونیم از پردازنده مطابق نیازمون بهینه استفاده کنیم.
اما همه چیز به cpu ختم نمیشه پردازش های ما داره مموری رو هم تحت استرس میگذاره پس باید با مموری هم جوری رفتار کنیم تا سیستم عامل اپمون رو بلاک نکنه (Out Of Memory)
پس من یه کلاس طراحی کردم با نام MemoryGovernor
اما همه چیز به cpu ختم نمیشه پردازش های ما داره مموری رو هم تحت استرس میگذاره پس باید با مموری هم جوری رفتار کنیم تا سیستم عامل اپمون رو بلاک نکنه (Out Of Memory)
پس من یه کلاس طراحی کردم با نام MemoryGovernor
🔥2🌭1
Droid Hub✨
خب ما تا این جا تونستیم یه ارتباط دو طرفه با سیستم عامل برقرار کنیم تا بتونیم از پردازنده مطابق نیازمون بهینه استفاده کنیم. اما همه چیز به cpu ختم نمیشه پردازش های ما داره مموری رو هم تحت استرس میگذاره پس باید با مموری هم جوری رفتار کنیم تا سیستم عامل اپمون…
اگر رام (RAM) گوشی کاربر پر باشد، اندروید بدون تعارف اپلیکیشن را میبندد (Crash). این کد وظیفهاش این است که قبل از انجام کارهای سنگین، وضعیت جیبِ حافظهٔ گوشی را بسنجد و بر اساس آن تصمیم بگیرد.
}
اActivityManager: این ابزارِ خودِ اندروید است که به تو اجازه میدهد با سیستمعامل تعامل داشته باشی و آمار بگیری که در پسزمینه چه خبر است.
اMemoryInfo: یک جعبهٔ خالی است که وقتی آن را به سیستمعامل میدهی، اطلاعات لحظهایِ رم (RAM) گوشی را داخلش پر میکند و به تو برمیگرداند.
. متد اول: تشخیص وضعیت قرمز سیستم (isSystemStressed)
وظیفه این تابع این است که ببیند آیا گوشی در خفقان حافظه قرار دارد یا خیر.
این تابع چطور تصمیم میگیرد؟
این متد به دو چیز حساس است و اگر هرکدام درست باشد، خروجی را true (یعنی سیستم تحت فشار است) برمیگرداند:
اmemoryInfo.lowMemory: خودِ سیستمعامل اندروید یک فلگ دارد که وقتی رم به شدت بحرانی میشود، آن را روشن میکند.
اavailablePercent < 0.15: اگر کمتر از ۱۵٪ از کل رم گوشی خالی باشد، این کد آن را وضعیت قرمز اعلام میکند.
ما از این متد میتونیم برای ایجاد وقفه در پردازش ها استفاده کنیم
class MemoryGovernor(private val context: Context) {
private val activityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
private val memoryInfo = ActivityManager.MemoryInfo()
}
اActivityManager: این ابزارِ خودِ اندروید است که به تو اجازه میدهد با سیستمعامل تعامل داشته باشی و آمار بگیری که در پسزمینه چه خبر است.
اMemoryInfo: یک جعبهٔ خالی است که وقتی آن را به سیستمعامل میدهی، اطلاعات لحظهایِ رم (RAM) گوشی را داخلش پر میکند و به تو برمیگرداند.
. متد اول: تشخیص وضعیت قرمز سیستم (isSystemStressed)
وظیفه این تابع این است که ببیند آیا گوشی در خفقان حافظه قرار دارد یا خیر.
fun isSystemStressed(): Boolean {
activityManager.getMemoryInfo(memoryInfo) // ۱. اطلاعات لحظهای رم را بریز داخل memoryInfo
val availablePercent = memoryInfo.availMem.toDouble() / memoryInfo.totalMem.toDouble() // ۲. محاسبه درصد رم خالی
Log.d("MemoryGovernor", "Available RAM: ...") // ۳. لاگ انداختن برای دباگ
return memoryInfo.lowMemory || availablePercent < 0.15 // ۴. شرط نهایی وضعیت قرمز
}این تابع چطور تصمیم میگیرد؟
این متد به دو چیز حساس است و اگر هرکدام درست باشد، خروجی را true (یعنی سیستم تحت فشار است) برمیگرداند:
اmemoryInfo.lowMemory: خودِ سیستمعامل اندروید یک فلگ دارد که وقتی رم به شدت بحرانی میشود، آن را روشن میکند.
اavailablePercent < 0.15: اگر کمتر از ۱۵٪ از کل رم گوشی خالی باشد، این کد آن را وضعیت قرمز اعلام میکند.
ما از این متد میتونیم برای ایجاد وقفه در پردازش ها استفاده کنیم
👍1🌭1
Droid Hub✨
اگر رام (RAM) گوشی کاربر پر باشد، اندروید بدون تعارف اپلیکیشن را میبندد (Crash). این کد وظیفهاش این است که قبل از انجام کارهای سنگین، وضعیت جیبِ حافظهٔ گوشی را بسنجد و بر اساس آن تصمیم بگیرد. class MemoryGovernor(private val context: Context) { private…
متد دوم: نجات اپلیکیشن
این متد هوشمندانهترین بخش کد است این جا باید کارمون رو متناسب با وضعیت مموری بهینه کنیم
مثلا در مورد پردازش عکس : یک عکس با کیفیت 4K در رم، فضای بینظیری میگیرد. این تابع میگوید: «بر اساس رمِ خالی، عرضِ عکس (Width) را چقدر کوچک کنم که نه سیخ بسوزد نه کباب؟»
ما از این دو متد و ترکیبش میتونیم برای بهبود وضعیت برناممون استفاده کنیم.
این جوری ما کارمون رو هوشمندانه بر اساس وضعیت سخت افزار مدیریت میکنیم
در واقع هدف همه ی کد هایی که تا این جا داشتیم این بود که اپمون روی سیستم عامل زامبی نشه و وقتی سخت افزار در حد آستانه قرار میگیره خودمون پردازش و کارهامون رو مدیریت کنیم.
این کد ها در برنامه های پردازشی یا گیم ها در نهایت معجزه میکنه.
این متد هوشمندانهترین بخش کد است این جا باید کارمون رو متناسب با وضعیت مموری بهینه کنیم
مثلا در مورد پردازش عکس : یک عکس با کیفیت 4K در رم، فضای بینظیری میگیرد. این تابع میگوید: «بر اساس رمِ خالی، عرضِ عکس (Width) را چقدر کوچک کنم که نه سیخ بسوزد نه کباب؟»
fun getSafeResolution(targetWidth: Int): Int {
activityManager.getMemoryInfo(memoryInfo)
return when {
memoryInfo.lowMemory -> (targetWidth * 0.5).toInt() // حالت فوق بحرانی
memoryInfo.availMem < 512 * 1024 * 1024 -> (targetWidth * 0.7).toInt() // حالت هشدار
else -> targetWidth // حالت امن
}
}ما از این دو متد و ترکیبش میتونیم برای بهبود وضعیت برناممون استفاده کنیم.
این جوری ما کارمون رو هوشمندانه بر اساس وضعیت سخت افزار مدیریت میکنیم
در واقع هدف همه ی کد هایی که تا این جا داشتیم این بود که اپمون روی سیستم عامل زامبی نشه و وقتی سخت افزار در حد آستانه قرار میگیره خودمون پردازش و کارهامون رو مدیریت کنیم.
این کد ها در برنامه های پردازشی یا گیم ها در نهایت معجزه میکنه.
🔥8🌭1
پیشنهاد میکنم اگر android adk رو تست نکردید یه نگاهی بهش بندازید. فوق العاده است .
تو اپتون یه ایجنت تعریف میکنید و با یه پرامپت اهدافش رو براش مشخص میکنید مثلا
You are a helpful assistant that tells the current time in a city
اون وقت خواسته کاربرتون رو مثلا پرامپتی که داده رو ارسال میکنید به این agent ایجنت هم با توجه به هویتی که قبلا براش تعیین کردید شروع میکنه به تعامل کردن با یوزر
تو اپتون یه ایجنت تعریف میکنید و با یه پرامپت اهدافش رو براش مشخص میکنید مثلا
You are a helpful assistant that tells the current time in a city
اون وقت خواسته کاربرتون رو مثلا پرامپتی که داده رو ارسال میکنید به این agent ایجنت هم با توجه به هویتی که قبلا براش تعیین کردید شروع میکنه به تعامل کردن با یوزر
🔥4🌭1
حالا نکته اعجاب انگیزش اینه شما میتونید برای agent یه سری تولز تعریف کنید تولز ها یه سری فانکشن هستن که ما داخلشون یه کاری رو تعریف میکینم و خود ایجنت بر اساس خواسته کاربر میدونه که کدوم فانکشن رو الان باید کال کنه
مثلا توی عکس من یه تولز ایجاد کردم برای گرفتن live price طلا از ای پی ای (البته من ماکش کردم که فعلا واضح باشه و همیشه قیمت 4,550,000 بده )
حالا کاربر هر وقت که از ایجنت من قیمت طلا رو بخواد خود ایجنت بر اساس توضیح هر تولز میفهمه که باید بره کدوم فانکشن رو کال کنه و نتیجه اش رو به کاربر برگدونه
یا مثلا شما میتونید یه تولز دیگه تعریف کنید که بره یه سایت رو بخونه و داخلش مثلا فیلد قیمت رو استخراج کنه و به کاربر ارایه کنه و ...
مثلا توی عکس من یه تولز ایجاد کردم برای گرفتن live price طلا از ای پی ای (البته من ماکش کردم که فعلا واضح باشه و همیشه قیمت 4,550,000 بده )
حالا کاربر هر وقت که از ایجنت من قیمت طلا رو بخواد خود ایجنت بر اساس توضیح هر تولز میفهمه که باید بره کدوم فانکشن رو کال کنه و نتیجه اش رو به کاربر برگدونه
یا مثلا شما میتونید یه تولز دیگه تعریف کنید که بره یه سایت رو بخونه و داخلش مثلا فیلد قیمت رو استخراج کنه و به کاربر ارایه کنه و ...
🌭1
طبق گفته داکش میتونید از مدل gemini-nano هم به صورت on-device و بدون اینترنت هم استفاده کنید (من تستش نکردم هنوز)
https://developer.android.com/ai/adk
حتما سمپل هاشو هم چک کنید از داکش بیش تر کمک میکنه
https://github.com/google/adk-kotlin/tree/main/examples
https://developer.android.com/ai/adk
حتما سمپل هاشو هم چک کنید از داکش بیش تر کمک میکنه
https://github.com/google/adk-kotlin/tree/main/examples
Android Developers
Build ADK agents for Android | AI | Android Developers
ADK for Android lets you build and run AI agents as part of your Android apps.
❤2🌭1
من دارم اپ iOS مون رو که با cmp نوشته شده رو توی اپ استور منتشر میکنم.
به مرور تجربههایی که باهاش دارم مواجه میشم رو براتون میگم
حالا امروز درگیر یه تسک جالب شدم
همونطور که میدونید اپ استور قبل از اینکه اپ رو اصلا بخواد دست عامل انسانی برای تست برسونه یه سری ربات دارن که دو تا تست رو انجام میده static-analyze و dynamic-analyze
تو استاتیک، ربات توی میزان سورس کدی که از اپتون در دسترسشه میگرده و یه سری موارد رو که برخلاف قوانینش هست پیدا میکنه.
مثلاً اینکه تو کدتون اگر داشته باشه Persian یا Iran (برای نام توابع. متغیر ها و ...) ربات حساس میشه.
توی داینامیک یه سری تست های دیگه انجام میشه مثل اینکه وقتی اپ ران هست داره به کجاها ریکوست میزنه چه چیزهایی میفرسته و چه چیزهایی لود میکنه
خب این جا هم مثلا اگر ریکوست بره به سمت .ir ریجکت میشین.
اما حالا تسک جالبم امروز این بود که حتی متادیتای فونتهای اپ رو هم از هر چیزی که مرتبط با ایران بود پاک کردم چون رباتشون این موارد رو هم ممکنه چک کنه.😕
هر چی فونت تو اپ داشتم رو با نرمافزار FontFrog باز کردم و دیدم که بلللله پر از موارد مربوط به ایرانه و اون جا دیدم که یه فونت چه قدر متادیتا داره (چون پاک کردن تکتکشون واقعا حوصله سربر بود😁)
از اسم سازنده فونت تا لایسنس و سایتی که توش فونت اپلود شده بود و ...
به مرور تجربههایی که باهاش دارم مواجه میشم رو براتون میگم
حالا امروز درگیر یه تسک جالب شدم
همونطور که میدونید اپ استور قبل از اینکه اپ رو اصلا بخواد دست عامل انسانی برای تست برسونه یه سری ربات دارن که دو تا تست رو انجام میده static-analyze و dynamic-analyze
تو استاتیک، ربات توی میزان سورس کدی که از اپتون در دسترسشه میگرده و یه سری موارد رو که برخلاف قوانینش هست پیدا میکنه.
مثلاً اینکه تو کدتون اگر داشته باشه Persian یا Iran (برای نام توابع. متغیر ها و ...) ربات حساس میشه.
توی داینامیک یه سری تست های دیگه انجام میشه مثل اینکه وقتی اپ ران هست داره به کجاها ریکوست میزنه چه چیزهایی میفرسته و چه چیزهایی لود میکنه
خب این جا هم مثلا اگر ریکوست بره به سمت .ir ریجکت میشین.
اما حالا تسک جالبم امروز این بود که حتی متادیتای فونتهای اپ رو هم از هر چیزی که مرتبط با ایران بود پاک کردم چون رباتشون این موارد رو هم ممکنه چک کنه.😕
هر چی فونت تو اپ داشتم رو با نرمافزار FontFrog باز کردم و دیدم که بلللله پر از موارد مربوط به ایرانه و اون جا دیدم که یه فونت چه قدر متادیتا داره (چون پاک کردن تکتکشون واقعا حوصله سربر بود😁)
از اسم سازنده فونت تا لایسنس و سایتی که توش فونت اپلود شده بود و ...
🤯8🕊1
یکی از رو مخ ترین قوانین گوگل پلی برای اکانت های شخصی (نه سازمانی)
اینه که باید ۱۲ تا تستر معرفی کنید و تستر ها ۱۴ روز اپ رو روی گوشیشون نصب داشته باشن تا گوگل مجوز پابلیش رو بهتون بده.
من خودم چون ۱۲ نفر نتونستم پیدا کنم (چون ماشالا اکثرا آیفون دارن) از یه راه حل دیگه استفاده کردم.
اپ swap-test تو گوگل پلی رو نصب کردم و داخلش اپم رو تعریف کردم
https://play.google.com/store/apps/details?id=com.swaptest.swaptest_app&hl=en-US&v3=true
مدل کارش اینه که با ۱۲ نفر دیگه پارتنر میشید و اون ها اپ شما رو به عنوان تستر نصب میکنن و شما هم اپ اون هارو
بعد برای اثبات کار هر روز یه اسکرین شات از گوشیتون میگیرید و برای هم دیگه میفرستید تا اثبات کنید اپ رو پاک نکردید.(خود اپ اینو به عنوان daily task بهتون نشون میده)
اینه که باید ۱۲ تا تستر معرفی کنید و تستر ها ۱۴ روز اپ رو روی گوشیشون نصب داشته باشن تا گوگل مجوز پابلیش رو بهتون بده.
من خودم چون ۱۲ نفر نتونستم پیدا کنم (چون ماشالا اکثرا آیفون دارن) از یه راه حل دیگه استفاده کردم.
اپ swap-test تو گوگل پلی رو نصب کردم و داخلش اپم رو تعریف کردم
https://play.google.com/store/apps/details?id=com.swaptest.swaptest_app&hl=en-US&v3=true
مدل کارش اینه که با ۱۲ نفر دیگه پارتنر میشید و اون ها اپ شما رو به عنوان تستر نصب میکنن و شما هم اپ اون هارو
بعد برای اثبات کار هر روز یه اسکرین شات از گوشیتون میگیرید و برای هم دیگه میفرستید تا اثبات کنید اپ رو پاک نکردید.(خود اپ اینو به عنوان daily task بهتون نشون میده)
👍9❤2💯2
Droid Hub✨
ایده من در زمینه image-processing روی گوشی کاربر هست که در موردش بیش تر صحبت میکنم اما نکته جالب این جا این بود که با این که فکر میکردم و هنوز فکر میکنم ایده جذاب بود اما انگار از یه جایی به سقف پردازش روی گوشی رسیدم و به دیوار خوردم فرض کنید 1000تا عکس…
من همیشه از خیلی از چیز ها تو گوشیم اسکرین شات میگیرم مثل رسیدها قبض ها و ... (تقریبا ۲۰۰۰ تا اسکرین شات دارم)
اما یه مشکل بزرگ داشتم. همیشه موقعی ای که به اون اسکرین شات خاص احتیاج پیدا میکردم تو انبوه تصاویر گم میشدم و دیگه پیداش نمیکردم
بنابراین روی این ایده کار کردم که چی میشد اگر یه چیزی مثل مرورگر برای این تصاویر داشتم یعنی میرفتم سرچ میکردم رسید فلان قبض و اون ابزار میگشت تو اسکرین شات ها و تصویر مرتبط باهاش رو پیدا میکرد.
بنابراین با ai شروع کردم به پیاده سازیش و سعی کردم که تقریبا کم ترین تغییر و تاثیر رو روی کد ها داشته باشم و اجازه دادم ai اکثر کار هارو پیش ببره
توی این مسیر هم مشکلات زیادی پیدا کردم که بعضا دیگه از توان ai خارج بود و نیاز بود که خودم بهش راهنمایی کنم که باید چه کار کنه
به طور مثال مشکلات مربوط به پردازش هزاران تصویر دربارش قبلا صحبت کردیم همش مرتبط با این اپ بود.
بهبود ocr برای متن های فارسی هم یکی دیگه از چالش هایی بود که ai نمیتونست دربارش کمکی کنه
به هر حال اپ الان توی کافه بازار و مایکت در دسترسه . دوست داشتید نصبش کنید.
اما یه مشکل بزرگ داشتم. همیشه موقعی ای که به اون اسکرین شات خاص احتیاج پیدا میکردم تو انبوه تصاویر گم میشدم و دیگه پیداش نمیکردم
بنابراین روی این ایده کار کردم که چی میشد اگر یه چیزی مثل مرورگر برای این تصاویر داشتم یعنی میرفتم سرچ میکردم رسید فلان قبض و اون ابزار میگشت تو اسکرین شات ها و تصویر مرتبط باهاش رو پیدا میکرد.
بنابراین با ai شروع کردم به پیاده سازیش و سعی کردم که تقریبا کم ترین تغییر و تاثیر رو روی کد ها داشته باشم و اجازه دادم ai اکثر کار هارو پیش ببره
توی این مسیر هم مشکلات زیادی پیدا کردم که بعضا دیگه از توان ai خارج بود و نیاز بود که خودم بهش راهنمایی کنم که باید چه کار کنه
به طور مثال مشکلات مربوط به پردازش هزاران تصویر دربارش قبلا صحبت کردیم همش مرتبط با این اپ بود.
بهبود ocr برای متن های فارسی هم یکی دیگه از چالش هایی بود که ai نمیتونست دربارش کمکی کنه
به هر حال اپ الان توی کافه بازار و مایکت در دسترسه . دوست داشتید نصبش کنید.
🔥5❤1