Sayangnya MyApp telah berhenti. Bagaimana saya bisa memecahkan masalah ini?


787

Saya mengembangkan aplikasi, dan setiap kali saya menjalankannya, saya menerima pesan:

Sayangnya, MyApp telah berhenti.

Apa yang bisa saya lakukan untuk menyelesaikan ini?


Tentang pertanyaan ini - jelas terinspirasi oleh Apa itu tumpukan jejak, dan bagaimana saya bisa menggunakannya untuk men-debug kesalahan aplikasi saya? , ada banyak pertanyaan yang menyatakan bahwa aplikasi mereka mogok, tanpa rincian lebih lanjut. Pertanyaan ini bertujuan untuk menginstruksikan programmer Android pemula tentang cara mencoba dan memperbaiki masalah mereka sendiri, atau mengajukan pertanyaan yang tepat.


22
Saya telah melihat banyak pertanyaan ditutup sebagai penipuan dengan ini. Ini adalah referensi yang bagus untuk membantu orang mengirim data yang relevan dalam pertanyaan mereka. Namun, ini bukan duplikat dari masalah root di sana, tetapi hanya metodologi untuk menggali masalah root. Saya pikir akan lebih baik hanya dengan memberikan tautan ke pertanyaan ini sebagai referensi dan tidak sedekat duplikat.
laalto

33
Saya pikir fungsi dekat sangat cocok untuk ini. Sebagian besar dari pertanyaan ini menunjukkan sedikit pengetahuan tentang keterampilan debugging dasar. Menunda mereka memberikan peluang bagi mereka untuk mengklarifikasi masalah mereka, menggunakan metode seperti yang dinyatakan dalam jawaban. Lebih baik lagi, mereka mungkin bisa menyelesaikan masalah sendiri. Diskusi ini mungkin lebih cocok untuk meta.stackoverflow.com.
nhaarman

Pertanyaan ini terlalu kabur. Pertanyaan yang lebih baik adalah 'menggunakan [myIDE] bagaimana cara men-debug' aplikasi Android yang menampilkan kesalahan 'Sayangnya, MyApp telah berhenti'
Chris Halcrow

7
@ ChrisHalcrow Tanya Jawab ini bukan tentang debugging sama sekali. Ini tentang membimbing pemula di Android cara menangani crash aplikasi.
nhaarman

stackoverflow.com/questions/26609734/… .. aktifkan kesalahan multidex becoz dalam konversi ke apk
RejoylinLokeshwaran

Jawaban:


719

Jawaban ini menjelaskan proses pengambilan jejak tumpukan. Sudah memiliki jejak stack? Baca di tumpukan jejak di " Apa itu jejak tumpukan, dan bagaimana saya bisa menggunakannya untuk men-debug kesalahan aplikasi saya? "

Masalah

Aplikasi Anda berhenti karena tidak RuntimeExceptionada yang terlempar.
Yang paling umum dari ini adalah NullPointerException.

Bagaimana cara mengatasinya?

Setiap kali aplikasi Android mogok (atau aplikasi Java apa pun dalam hal ini), a Stack traceditulis ke konsol (dalam hal ini, logcat). Jejak tumpukan ini berisi informasi penting untuk menyelesaikan masalah Anda.

Android Studio

Menemukan jejak tumpukan di Android Studio

Di bilah bawah jendela, klik Logcattombol. Atau, Anda dapat menekan alt+ 6. Pastikan emulator atau perangkat Anda dipilih di Devicespanel. Selanjutnya, cobalah untuk menemukan jejak tumpukan, yang ditunjukkan dengan warna merah. Mungkin ada banyak hal yang masuk ke logcat, jadi Anda mungkin perlu sedikit gulir. Cara mudah untuk menemukan jejak stack adalah dengan menghapus logcat (menggunakan recycle bin di sebelah kanan), dan membiarkan aplikasi crash lagi.

Saya telah menemukan jejak stack, sekarang apa?

Yay! Anda setengah jalan untuk menyelesaikan masalah Anda.
Anda hanya perlu mencari tahu apa yang sebenarnya membuat aplikasi Anda crash, dengan menganalisis jejak stack.

Baca di tumpukan jejak di " Apa itu jejak tumpukan, dan bagaimana saya bisa menggunakannya untuk men-debug kesalahan aplikasi saya? "

Saya masih tidak bisa menyelesaikan masalah saya!

Jika Anda telah menemukan Anda Exceptiondan baris di mana itu terjadi, dan masih tidak tahu bagaimana cara memperbaikinya, jangan ragu untuk mengajukan pertanyaan di StackOverflow.

Cobalah untuk sesingkat mungkin: memposting jejak tumpukan, dan kode yang relevan (misalnya beberapa baris hingga baris yang melempar Exception).


33
Saya tahu posting ini sudah lama: tetapi jika Anda menggunakan IntelliJ IDEA Anda dapat masuk ke dalam Android > Devices|Logcatdan menambahkan filter baru ( i.imgur.com/145dtkx.png ), dan memfilternya untuk di by Log Messagesini Anda dapat meletakkan FATAL EXCEPTION( i.imgur.com/HpELhaU .png ) jadi dalam Kotak ini Anda dapat membaca semua Exceptionsyang dilemparkan oleh aplikasi Anda. Dengan ini, Anda tidak perlu menghapus logcat dan melakukan crash lagi. Saya pikir Android Studio juga memiliki opsi ini.
Marco Acierno

1
Memfilter logcat di Eclipse dapat dilakukan dengan mengetikkan nama paket java di bidang nama aplikasi filter.
Stephane

Saya pikir intinya adalah memahami jejak yang didapat seseorang ketika pengecualian terjadi. FC sedikit buruk ketika tidak ada jejak kembali atau tidak dapat digunakan, yang mana itu menjadi berbulu. tapi saya pikir penjelasan ini adalah intro pertama yang bagus dalam menemukan / mengidentifikasi bug tersebut.
DooMMasteR

4
Hal-hal mudah ketika logcat Anda memiliki beberapa kesalahan, tetapi apa yang tidak ada pada logcat? stackoverflow.com/questions/32455645/…
Marian Paździoch

4
Masalahnya adalah baris tidak mengandung kesalahan yang ditulis dan diarahkan oleh jejak stack.
Hilal

117

Anda dapat menggunakan alat ADB Google untuk mendapatkan Logcat fileuntuk menganalisis masalah.

adb logcat > logcat.txt

buka logcat.txtfile dan cari nama aplikasi Anda. Harus ada informasi mengapa gagal, nomor baris, nama kelas, dll.


Ini bagus, itu akan menunjukkan kepada Anda dengan cepat apa pun yang terjadi pada perangkat bahkan jika debugger Anda gagal menangkapnya, yang dapat terjadi untuk Xamarin jika runtime gagal dimuat.
jvenema

1
Saya tidak bisa melihat mengapa aplikasi saya mogok di logcat studio android, tidak ada kesalahan sama sekali. Jawaban ini memberi saya apa yang saya butuhkan. Namun kemudian saya menyadari bahwa saya memiliki beberapa filter di logcat studio yang mencegah saya melihat kesalahan. Saya beralih kembali ke "Tampilkan hanya aplikasi yang dipilih" dan saya kembali dan berjalan.
Yannick

Anda harus menambahkan -d, jika tidak Anda harus ctrl-C untuk keluar dari logcat. I doadb logcat -v time -d > filename.txt
Karakuri

37

Pertama, Anda memeriksa titik aplikasi Anda mengalami gangguan ( Unfortunately, MyApp has stopped.). Untuk ini, Anda dapat menggunakan Log.e("TAG", "Message");, menggunakan baris ini Anda dapat melihat aplikasi Anda masuk logcat.

Setelah itu, Anda menemukan titik mana aplikasi Anda berhenti itu sangat mudah untuk diselesaikan di sisi Anda.


28

Periksa saja kesalahan di log kucing.

Anda mendapatkan opsi log cat dari dalam gerhana:

window-> show view-> others-> Android-> Logcat

Log kucing mengandung kesalahan.

Selain itu, Anda juga dapat memeriksa kesalahan dengan menjalankan aplikasi dalam mode debug. Pertama-tama atur breakpoint setelah itu dengan melakukan:

klik kanan pada project-> debug as-> aplikasi Android


27

Catatan: Jawaban ini menggunakan Android Studio 2.2.2

Catatan 2: Saya mempertimbangkan bahwa perangkat Anda berhasil terhubung.


Hal pertama yang Anda lakukan ketika aplikasi Anda mogok adalah melihat ke dalam LogCat, di bagian bawah Android Studio ada bilah alat dengan daftar menu:

gambar

Klik pada "Android Monitor" (Yang saya garis bawahi pada gambar di atas. ^)

Sekarang, Anda akan mendapatkan sesuatu seperti ini:

gambar

Ubah " Verbose" menjadi " Error" Sekarang hanya akan menunjukkan kepada Anda kesalahan yang dicatat. Jangan khawatir tentang semua kesalahan ini (jika Anda mendapatkannya) sekarang.

gambar

Baik. Sekarang, lakukan apa yang Anda lakukan untuk merusak aplikasi Anda. Setelah aplikasi Anda mogok, buka logcat Anda. Anda harus menemukan crash log baru yang memiliki banyak at:x.x.x: dan Caused by: TrumpIsPresidentExceptionmisalnya. Buka Caused by:pernyataan itu di logcat Anda.

gambar

Selain itu Caused By:, harus ada Pengecualian yang terjadi. Dalam kasus saya, ini adalah RuntimeExceptiondan di bawahnya harus ada garis yang berisi tautan biru seperti:

gambar

Jika ituCaused by: TIDAK memiliki garis dengan teks biru di suatu tempat di bawahnya, maka cari yang lain Caused by:.

Klik tautan biru itu . Ini akan membawa Anda ke tempat masalah terjadi. Dalam kasus saya, itu karena baris ini:

throw new RuntimeException();

Jadi, sekarang saya tahu mengapa itu menabrak. Itu karena aku melempar pengecualian sendiri. Ini adalah kesalahan yang jelas .


Namun, katakanlah saya mendapat kesalahan lain:

java.lang.NullPointerException

Saya memeriksa logcat saya, saya mengklik tautan biru yang diberikannya kepada saya, dan itu membawa saya ke sini:

mTextView.setText(myString);

Jadi, sekarang saya ingin men-debug. Menurut pertanyaan StackOverflow ini , NullPointerException mengatakan bahwa ada sesuatu null.

Jadi, mari kita cari tahu apa itu null . Ada dua kemungkinan. Baik mTextViewitu nol, atau myStringnol. Untuk mengetahuinya, sebelum mTextView.setText(mString)baris, saya menambahkan dua baris ini:

Log.d("AppDebug","mTextView is null: " + String.valueOf(mTextView == null);
Log.d("AppDebug","myString is null: " + String.valueOf(myString== null);

Sekarang, seperti yang kami lakukan sebelumnya (Kami mengubah Verose ke Error), kami ingin mengubah "Error" menjadi "Debug". Karena kita masuk dengan men-debug. Inilah semua metode Log:

Log.
  d means Debug
  e means error
  w means warning
  v means verbose
  i means information
  wtf means "What a terrible failure". This is similar to Log.e

Jadi, karena kami menggunakan Log.d, kami memeriksa di Debug. Itu sebabnya kami mengubahnya menjadi debug.

Pemberitahuan Log.dmemiliki parameter pertama, dalam kasus kami "AppDebug". Klik menu tarik-turun "No Filters" di kanan atas logcat. Pilih "Edit Konfigurasi Filter", berikan nama pada filter Anda, dan di "Log Tag" masukkan "App Debug". Klik "OK". Sekarang, Anda akan melihat dua baris di logcat:

yourPackageNameAndApp: mTextView is null: true
yourPackageNameAndApp: myString is null: false

Jadi sekarang kita tahu bahwa mTextView adalah nol.

Saya mengamati kode saya, sekarang saya perhatikan sesuatu.

Saya telah private TextView mTextViewmenyatakan di bagian atas kelas saya. Tapi, saya tidak mendefinisikannya.

Pada dasarnya saya lupa melakukan ini di onCreate () saya:

mTextView = (TextView) findViewById(R.id.textview_id_in_xml);

Jadi ITULAH mTextViewitu batal, karena saya lupa memberi tahu aplikasi saya apa itu. Jadi saya tambahkan baris itu, jalankan aplikasi saya, dan sekarang aplikasi tidak macet.



1
Ini adalah informasi yang baik, tetapi menggunakan gambar Stack Trace mengurangi manfaatnya - gambar tidak dapat dicari, tidak dapat disalin dan ditempelkan, tidak dapat diambil oleh pembaca layar, dan lebih sulit untuk dibaca. (Ngomong-ngomong, aku tidak downvote, hanya menunjukkan itu).
EJoshuaS

1
@ EJoshuaS saya tidak mengatakan untuk memberikan gambar tho.
Ab

19

Munculan ini hanya muncul ketika Anda mendapatkan pengecualian fatal dalam kode Anda yang menghentikan eksekusi aplikasi. Bisa jadi pengecualian NullPointerException, OutOfMemoryExceptiondll.

Cara terbaik untuk memeriksa adalah melalui Logcat jika Anda masih mengembangkan aplikasi di Android studio yang merupakan cara cepat untuk membaca jejak stack dan memeriksa penyebab aplikasi.

Jika aplikasi Anda sudah aktif, maka Anda tidak dapat menggunakan logcat . Jadi, untuk itu Anda dapat menerapkan Crashlyticsuntuk memberikan laporan bug tentang pengecualian yang terjadi.


17

Periksa Logcatpesan Anda dan lihat Manifestfile Anda . Seharusnya ada sesuatu yang hilang seperti mendefinisikan Activity,izin Pengguna`, dll.


14

Anda dapat menggunakan salah satu alat ini:

  1. adb logcat

  2. adb logcat> logs.txt (Anda dapat menggunakan editor untuk membuka dan mencari kesalahan.)

  3. eclipse logcat (Jika tidak terlihat dalam eclipse, Pergi ke Windows-> Show View-> Others-> Android-> LogCat)

  4. Android Debug Monitor atau Android Device Monitor (ketik perintah monitor atau buka melalui UI)

masukkan deskripsi gambar di sini

  1. Android Studio

Saya sarankan untuk menggunakan Android Debug Monitor , itu bagus. Karena eclipse hang ketika terlalu banyak log ada di sana, dan melalui adb logcat filter dan semuanya sulit.


12

Anda harus memeriksa Stack trace

Bagaimana cara melakukannya?

pada IDE Anda Periksa bentuk windows LOGCAT

Jika Anda tidak dapat melihat jendela logcat pergi ke jalan ini dan buka

window->show view->others->Android->Logcat

jika Anda menggunakan Google-Api pergi ke jalur ini

adb logcat> logcat.txt


10

Dalam metode showToast () di bawah ini Anda harus melewati parameter lain untuk konteks atau konteks aplikasi dengan melakukannya Anda dapat mencobanya.

  public void showToast(String error, Context applicationContext){
        LayoutInflater inflater = getLayoutInflater();
        View view = inflater.inflate(R.layout.custom_toast, (ViewGroup)      
        findViewById(R.id.toast_root));
        TextView text = (TextView) findViewById(R.id.toast_error);
        text.setText(error);
        Toast toast = new Toast(applicationContext);
        toast.setGravity(Gravity.TOP | Gravity.FILL_HORIZONTAL, 0, 0);
        toast.setDuration(Toast.LENGTH_SHORT);
        toast.setView(view);
        toast.show();
}

9

Biarkan saya berbagi analisis Logcat dasar untuk ketika Anda bertemu Angkatan Tutup (ketika aplikasi berhenti bekerja).

DOCS

Alat dasar dari Android untuk mengumpulkan / menganalisis log adalah logcat.

HERE adalah halaman Android tentang logcat

Jika Anda menggunakan Android Studio, Anda juga dapat memeriksa LINK ini .

Menangkap

Pada dasarnya, Anda dapat menangkap logcat secara MANUAL dengan perintah berikut (atau cukup periksa jendela AndroidMonitor di AndroidStudio):

adb logcat

Ada banyak parameter yang dapat Anda tambahkan ke perintah yang membantu Anda memfilter dan menampilkan pesan yang Anda inginkan ... Ini pribadi ... Saya selalu menggunakan perintah di bawah ini untuk mendapatkan stempel waktu pesan:

adb logcat -v time

Anda dapat mengarahkan output ke file dan menganalisisnya di Text Editor.

Menganalisa

Jika aplikasi Anda Menghancurkan, Anda akan mendapatkan sesuatu seperti:

07-09 08:29:13.474 21144-21144/com.example.khan.abc D/AndroidRuntime: Shutting down VM
07-09 08:29:13.475 21144-21144/com.example.khan.abc E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.khan.abc, PID: 21144
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference
     at com.example.khan.abc.AudioFragment$1.onClick(AudioFragment.java:125)
     at android.view.View.performClick(View.java:4848)
     at android.view.View$PerformClick.run(View.java:20262)
     at android.os.Handler.handleCallback(Handler.java:815)
     at android.os.Handler.dispatchMessage(Handler.java:104)
     at android.os.Looper.loop(Looper.java:194)
     at android.app.ActivityThread.main(ActivityThread.java:5631)
     at java.lang.reflect.Method.invoke(Native Method)
     at java.lang.reflect.Method.invoke(Method.java:372)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)
07-09 08:29:15.195 21144-21144/com.example.khan.abc I/Process: Sending signal. PID: 21144 SIG: 9

Bagian log ini menunjukkan banyak informasi kepada Anda:

  • Ketika masalah terjadi: 07-09 08:29:13.475

Penting untuk memeriksa ketika masalah terjadi ... Anda mungkin menemukan beberapa kesalahan dalam log ... Anda harus yakin bahwa Anda memeriksa pesan yang tepat :)

  • Aplikasi mana yang mogok: com.example.khan.abc

Dengan cara ini, Anda tahu aplikasi mana yang macet (untuk memastikan bahwa Anda memeriksa log tentang pesan Anda)

  • ERROR yang mana: java.lang.NullPointerException

Kesalahan Pengecualian Pointer NULL

  • Info terperinci tentang kesalahan: Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference

Anda mencoba memanggil metode onBackPressed()dari FragmentActivityobjek. Namun, objek itu adalah nullketika Anda melakukannya.

  • Stack Trace: Stack Trace menunjukkan kepada Anda urutan permohonan metode ... Kadang-kadang, kesalahan terjadi pada metode panggilan (dan bukan dalam metode yang dipanggil).

    di com.example.khan.abc.AudioFragment $ 1.onClick (AudioFragment.java:125)

Kesalahan terjadi pada file com.example.khan.abc.AudioFragment.java, onClick()metode di dalam pada baris: 125(stacktrace menunjukkan baris bahwa kesalahan terjadi)

Itu disebut oleh:

at android.view.View.performClick(View.java:4848)

Yang disebut oleh:

at android.view.View$PerformClick.run(View.java:20262)

yang dipanggil oleh:

at android.os.Handler.handleCallback(Handler.java:815)

dll ....

Gambaran

Ini hanya gambaran umum ... Tidak semua log sederhana, dll ... Hanya untuk membagikan gagasan dan memberikan informasi tingkat awal kepada Anda ...

Saya harap saya bisa membantu Anda ... Salam


8

Gunakan LogCat dan coba temukan apa yang menyebabkan aplikasi mogok.

Untuk melihat Logcat jika Anda menggunakan Android Studio lalu Tekan ALT + 6 atau

jika Anda menggunakan Eclipse maka Window -> Open Perspective -> Other - LogCat

Pergi ke LogCat, dari kesalahan pilih menu drop down. Ini akan berisi semua informasi yang diperlukan untuk membantu Anda melakukan debug. Jika itu tidak membantu, poskan LogCat sebagai hasil edit untuk pertanyaan Anda dan seseorang akan membantu Anda.


7

Jika aplikasi Anda karena suatu alasan crash tanpa stacktrace yang baik. Coba debug dari baris pertama, dan pergi baris demi baris hingga macet. Maka Anda akan memiliki jawaban, baris mana yang menyebabkan Anda kesulitan. Mungkin Anda kemudian dapat membungkusnya menjadi try catch block dan mencetak output kesalahan.


5

Anda juga bisa mendapatkan pesan kesalahan ini sendiri, tanpa jejak tumpukan atau pesan kesalahan lebih lanjut.

Dalam hal ini, Anda perlu memastikan manifes Android Anda dikonfigurasi dengan benar (termasuk penggabungan manifes yang terjadi dari perpustakaan dan aktivitas apa pun yang akan datang dari perpustakaan), dan memberi perhatian khusus pada aktivitas pertama yang ditampilkan dalam aplikasi Anda dalam file manifes Anda. .


3
Saya akan tertarik jika Anda dapat mengunggah proyek yang menunjukkan fenomena ini.
CommonsWare

5

Kecelakaan selama pengembangan

Coba logview alat favorit saya untuk mendapatkan log dan menganalisisnya selama pengembangan.
Pastikan untuk menandai ./logviewdan ./lib/logview.jarsebagai executable ketika berjalan di Linux.

Jika Anda tidak menyukainya, ada banyak alternatif pemantau log desktop untuk Android .

Kecelakaan di alam liar

Integrasikan alat pelaporan kerusakan waktu-nyata seperti Firebase Crashlytics untuk mendapatkan stacktrace dari pengecualian yang tidak tertangani yang terjadi pada perangkat pengguna.

Baca Cara Melepaskan Aplikasi Buggy (Dan Langsung untuk Mengisahkannya) untuk mengetahui lebih lanjut tentang cara menangani bug di lapangan.


4

Orang membuat kesalahan, dan juga coding.

Ketika pernah errorterjadi, selalu periksa dengan logcat dengan teks dalam warna merah namun Anda dapat menemukan masalah nyata dalam teks warna biru dengan garis bawah pada teks warna merah tersebut.

Pastikan jika Anda membuat yang baru activity, selalu menyatakan activitydalamAndroidManifest file.

Jika menambahkan Izin, nyatakan juga dalam AndroidMainifestfile.


4

Logcat - Untuk memeriksa log dalam fase pengembangan Android Studio

Awalnya kosongkan Logcat dan biarkan aplikasi macet lagi sehingga Anda hanya bisa mendapatkan detail log macet. Anda harus memeriksa jejak Stack

Sementara, Sayangnya, MyApp telah berhenti. Ada banyak alasan untuk itu. Anda dapat memeriksa log yang sama. Untuk ini, Anda dapat menggunakan Log.e ("TAG", "Message");

Kesalahan umum selama crash aplikasi seperti:

  1. Kesalahan pengkodean (Penggunaan kata kunci salah).
  2. Nama properti tidak cocok.
  3. Plugin yang tidak didukung (mungkin).
  4. Versi tidak cocok (mungkin).
  5. Aktivitas hilang dalam file AndroidManifest.
  6. Izin tidak ada dalam file AndroidManifest.
  7. NullPointerException paling umum.
  8. Dinyatakan tetapi tidak didefinisikan.

Untuk mengatasi kesalahan aplikasi crash:

  • Ingat poin-poin di atas dan lalui.
  • Dengan kesalahan, Anda akan mendapatkan nama file juga dalam warna biru (klik pada mereka dan lompat ke kode dari kesalahan yang terjadi).

3

Pertama, Anda perlu memeriksa di mana dan mengapa aplikasi Anda macet (Unfortunately, MyApp has stopped.).dengan bantuanLOG , Anda dapat mencari tahu apa yang salah.

Setelah itu, Anda menemukan titik mana aplikasi Anda berhenti memperbaikinya dari titik Anda.


3

Jika Anda tidak memiliki jenis log yang menarik di terminal Anda (atau mereka tidak terkait langsung dengan aplikasi Anda), mungkin masalah Anda disebabkan oleh pustaka asli. Dalam hal ini, Anda harus memeriksa file "batu nisan" di dalam terminal Anda.

Lokasi default untuk file batu nisan tergantung pada setiap perangkat, tetapi jika itu yang terjadi, Anda akan memiliki catatan log: Tombstone written to: /data/tombstones/tombstone_06

Untuk informasi lebih lanjut, periksa di https://source.android.com/devices/tech/debug .


0

Juga menjalankan perintah ini di terminal dapat membantu menemukan masalah:

gradlew build > log.txt 2>details.txt

maka Anda harus pergi ke lokasi file gradlew di baca dua file log di atas.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.