এখানে সম্পূর্ণ সমাধানটি (প্রায়: আমি ইউআই লেআউট এবং বোতাম হ্যান্ডলিং বাদ দিয়েছি) - প্রচুর পরীক্ষা-নিরীক্ষা এবং সমস্যাগুলি সম্পর্কিত যেগুলি নিয়ে আসা অন্যান্য সম্পর্কিত বিভিন্ন পোস্ট থেকে প্রাপ্ত।
আপনার অনেকগুলি কাজ করতে হবে:
- আপনার অ্যাপ্লিকেশন সাবক্লাসে অনুচ্চারিত ধারণা গ্রহণ করুন।
- একটি ব্যতিক্রম ধরা পরে, ব্যবহারকারীকে লগ পাঠাতে বলার জন্য একটি নতুন ক্রিয়াকলাপ শুরু করুন।
- লগক্যাটের ফাইলগুলি থেকে লগ তথ্যটি বের করুন এবং নিজের ফাইলটিতে লিখুন।
- সংযুক্তি হিসাবে আপনার ফাইল সরবরাহ করে একটি ইমেল অ্যাপ্লিকেশন শুরু করুন।
- ম্যানিফেস্ট: আপনার ব্যতিক্রম হ্যান্ডলার দ্বারা স্বীকৃত হতে আপনার কার্যকলাপ ফিল্টার করুন filter
- Allyচ্ছিকভাবে, লগ.ডি () এবং লগ.ভি () কে সরিয়ে ফেলার জন্য প্রগার্ড সেটআপ করুন।
এখন, বিশদটি এখানে:
(1 এবং 2) অবিচ্ছিন্ন ধারণা গ্রহণ করুন, লগ কার্যকলাপ প্রেরণ শুরু করুন:
public class MyApplication extends Application
{
public void onCreate ()
{
// Setup handler for uncaught exceptions.
Thread.setDefaultUncaughtExceptionHandler (new Thread.UncaughtExceptionHandler()
{
@Override
public void uncaughtException (Thread thread, Throwable e)
{
handleUncaughtException (thread, e);
}
});
}
public void handleUncaughtException (Thread thread, Throwable e)
{
e.printStackTrace(); // not all Android versions will print the stack trace automatically
Intent intent = new Intent ();
intent.setAction ("com.mydomain.SEND_LOG"); // see step 5.
intent.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK); // required when starting from Application
startActivity (intent);
System.exit(1); // kill off the crashed app
}
}
(3) লগ এক্সট্রাক্ট করুন (আমি এটি আমার সেন্ডলগ ক্রিয়াকলাপটি রেখেছি):
private String extractLogToFile()
{
PackageManager manager = this.getPackageManager();
PackageInfo info = null;
try {
info = manager.getPackageInfo (this.getPackageName(), 0);
} catch (NameNotFoundException e2) {
}
String model = Build.MODEL;
if (!model.startsWith(Build.MANUFACTURER))
model = Build.MANUFACTURER + " " + model;
// Make file name - file must be saved to external storage or it wont be readable by
// the email app.
String path = Environment.getExternalStorageDirectory() + "/" + "MyApp/";
String fullName = path + <some name>;
// Extract to file.
File file = new File (fullName);
InputStreamReader reader = null;
FileWriter writer = null;
try
{
// For Android 4.0 and earlier, you will get all app's log output, so filter it to
// mostly limit it to your app's output. In later versions, the filtering isn't needed.
String cmd = (Build.VERSION.SDK_INT <= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) ?
"logcat -d -v time MyApp:v dalvikvm:v System.err:v *:s" :
"logcat -d -v time";
// get input stream
Process process = Runtime.getRuntime().exec(cmd);
reader = new InputStreamReader (process.getInputStream());
// write output stream
writer = new FileWriter (file);
writer.write ("Android version: " + Build.VERSION.SDK_INT + "\n");
writer.write ("Device: " + model + "\n");
writer.write ("App version: " + (info == null ? "(null)" : info.versionCode) + "\n");
char[] buffer = new char[10000];
do
{
int n = reader.read (buffer, 0, buffer.length);
if (n == -1)
break;
writer.write (buffer, 0, n);
} while (true);
reader.close();
writer.close();
}
catch (IOException e)
{
if (writer != null)
try {
writer.close();
} catch (IOException e1) {
}
if (reader != null)
try {
reader.close();
} catch (IOException e1) {
}
// You might want to write a failure message to the log here.
return null;
}
return fullName;
}
(4) একটি ইমেল অ্যাপ্লিকেশন শুরু করুন (আমার সেন্ডলগ ক্রিয়াকলাপেও):
private void sendLogFile ()
{
String fullName = extractLogToFile();
if (fullName == null)
return;
Intent intent = new Intent (Intent.ACTION_SEND);
intent.setType ("plain/text");
intent.putExtra (Intent.EXTRA_EMAIL, new String[] {"log@mydomain.com"});
intent.putExtra (Intent.EXTRA_SUBJECT, "MyApp log file");
intent.putExtra (Intent.EXTRA_STREAM, Uri.parse ("file://" + fullName));
intent.putExtra (Intent.EXTRA_TEXT, "Log file attached."); // do this so some email clients don't complain about empty body.
startActivity (intent);
}
(3 এবং 4) এখানে সেন্ডলগ দেখতে কেমন দেখাচ্ছে (যদিও আপনাকে ইউআই যোগ করতে হবে):
public class SendLog extends Activity implements OnClickListener
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
requestWindowFeature (Window.FEATURE_NO_TITLE); // make a dialog without a titlebar
setFinishOnTouchOutside (false); // prevent users from dismissing the dialog by tapping outside
setContentView (R.layout.send_log);
}
@Override
public void onClick (View v)
{
// respond to button clicks in your UI
}
private void sendLogFile ()
{
// method as shown above
}
private String extractLogToFile()
{
// method as shown above
}
}
(5) প্রকাশ:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" ... >
<!-- needed for Android 4.0.x and eariler -->
<uses-permission android:name="android.permission.READ_LOGS" />
<application ... >
<activity
android:name="com.mydomain.SendLog"
android:theme="@android:style/Theme.Dialog"
android:textAppearance="@android:style/TextAppearance.Large"
android:windowSoftInputMode="stateHidden">
<intent-filter>
<action android:name="com.mydomain.SEND_LOG" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
</manifest>
()) সেটআপ প্রগার্ড:
প্রজেক্ট.প্রোপার্টিগুলিতে কনফিগার লাইনটি পরিবর্তন করুন। আপনাকে অবশ্যই "অনুকূলিতকরণ" নির্দিষ্ট করতে হবে বা প্রোগার্ড লগ.ভ () এবং লগ.ড () কলগুলি সরিয়ে ফেলবে না ।
proguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt
প্রগুয়ার্ড-প্রজেক্ট.টেক্সটে নিম্নলিখিতটি যুক্ত করুন। এটি প্রোগ্রার্ডকে ধরে নিতে বলুন লগ.ভি এবং লগ.ডের কোনও পার্শ্ব প্রতিক্রিয়া নেই (যদিও তারা লগগুলিতে লেখার পরে তা করে) এবং এটি অপ্টিমাইজেশনের সময় অপসারণ করা যেতে পারে:
-assumenosideeffects class android.util.Log {
public static int v(...);
public static int d(...);
}
এটাই! আপনার যদি এর উন্নতির জন্য কোনও পরামর্শ থাকে তবে দয়া করে আমাকে জানান এবং আমি এটি আপডেট করতে পারি।