Cara DIY Port TWRP untuk Android

Tuan rumah Appual banyak cara men-root panduan Android, tetapi panduan root tidak ada untuk setiap perangkat di planet ini - ini biasanya karena sejumlah alasan; terutama, tidak tersedianya pemulihan kustom, seperti TWRP, untuk perangkat tertentu. Untungnya, porting pemulihan kustom seperti TWRP ke perangkat Anda tidak luar biasa sulit (meskipun masih cukup begitu).

Jika Anda memiliki perangkat yang ingin Anda rooting dan tidak dapat menemukan metode root apa pun yang tersedia, Anda harus benar-benar mempertimbangkan untuk mempelajari cara membuat port TWRP untuk Anda sendiri. Ini setidaknya akan memberi Anda pemulihan kustom untuk bekerja dari saat Anda mencoba untuk me-root perangkat Anda.

Jika Anda tertarik dengan proyek Android DIY semacam ini, pertimbangkan juga untuk membaca panduan berikut dari Appuals:

  • Cara Membangun Kernel Android Mediatek dari Sumber
  • Cara Membuat ROM Khusus dari Proyek Open Source Android | Pt. 2
  • Cara Manual Tema Sistem Android UI

Prasyarat:

Pengetahuan dasar tentang perintah Linux dan / atau kompilasi AOSP dari awal.

Jika Anda tidak akrab dengan perintah Linux dasar dan / atau membangun AOSP, panduan ini bukan untuk Anda - tidak ada cara ramah pemula untuk menulis panduan untuk proses ini. Saya sarankan untuk mencoba beberapa operasi yang lebih mudah terlebih dahulu, seperti membaca panduan Appual tentang cara membangun AOSP dari awal.

Sekarang, untuk membangun, Anda dapat menggunakan Omni versi 5.1 hingga 8.1, atau versi CM 12.1 hingga 15.1 - tetapi jika Anda menggunakan CM, Anda mungkin mengalami masalah kecil terkait dengan makefile. Jika Anda tidak berguna dalam memecahkan masalah makefile, Anda harus memilih untuk menggunakan Omni sebagai gantinya.

Tetapi jika Anda memutuskan untuk menggunakan CM, Anda harus menempatkan TWRP di folder CM / bootable / recovery-twrp, dan mengatur RECOVERY_VARIANT: = twrp di file BoardConfig.mk

Anda dapat menemukan kode sumber TWRP di sini, dan Anda harus memilih cabang terbaru yang tersedia. Anda tidak perlu melakukan ini dengan Omni, karena ini termasuk sumber TWRP secara default, kecuali Anda menggunakan versi lama Omni - dalam hal ini, Anda akan ingin menarik dari cabang terbaru.

Jika Anda hanya ingin membangun TWRP, Anda dapat mencoba bekerja dengan pohon yang lebih kecil, seperti TWRP Manifes Minimal ini. Namun, mungkin ada situasi di mana Anda akan membutuhkan lebih banyak repo daripada manifes ini.

Catatan utama sebelum kompilasi: Jika Anda menambahkan atau mengubah bendera apa pun, Anda perlu membuat bersih (atau membuat clobber) sebelum mengkompilasi ulang, jika tidak, perubahan bendera Anda tidak akan dimasukkan!

Setelah Anda memiliki kode sumber TWRP, kita perlu mengubah beberapa bendera build untuk perangkat spesifik Anda. Temukan BoardConfig.mk untuk perangkat Anda - biasanya ini akan ditemukan di perangkat / pabrikan / codename (misalnya, perangkat / lge / hammerhead / BoardConfig.mk)

Konfigurasi papan harus menyertakan pengaturan arsitektur dan platform - ini biasanya sudah disertakan jika Anda menggunakan konfigurasi perangkat orang lain. Tetapi jika Anda membuatnya sendiri, Anda harus menambahkannya. Hal ini karena tanpa mereka, boot pemulihan dapat segfault dan itu hanya akan mem-flash logo TeamWin di layar Anda berulang kali.

Bendera harus diletakkan di bagian bawah BoardConfig.mk, di bawah judul #twrp

Untuk semua perangkat, Anda perlu menginstruksikan TWRP tema mana yang akan digunakan. Flag TW_THEME digunakan sebagai pengganti flag DEVICE_RESOLUTION yang lebih tua, yang berarti TWRP sekarang menggunakan skala untuk meregangkan tema apa pun.

Pilihan Anda adalah: portrait_hdpi, portrait_mdpi, landscape_hdpi, landscape_mdpi, dan watch_mdpi. Untuk mode potret Anda kemungkinan besar ingin tema hdpi 720 × 1280 dan lebih tinggi, tetapi untuk perangkat lansekap pergi dengan 1280 × 720 dan ke atas.

Jadi bagian bendera bangunan + bendera tema Anda akan terlihat seperti ini:

#twrp

TW_THEME: = portrait_hdpi

Beberapa bendera build tambahan yang ingin Anda sertakan dalam bagian ini (kredit untuk forum XDA):

  • RECOVERY_SDCARD_ON_DATA: = true (ini memungkinkan penanganan / data / media yang tepat pada perangkat yang memiliki folder ini untuk penyimpanan (sebagian besar Honeycomb dan perangkat yang awalnya dikirim dengan ICS seperti Galaxy Nexus). Bendera ini tidak diperlukan untuk jenis perangkat ini. jangan tentukan tanda ini dan juga tidak menyertakan referensi apa pun ke / sdcard, / internal_sd, / internal_sdcard, atau / emmc di fstab Anda, maka secara otomatis kami akan mengasumsikan bahwa perangkat menggunakan penyimpanan teremulasi.)
  • BOARD_HAS_NO_REAL_SDCARD: = true - menonaktifkan hal-hal seperti partisi kartu SD dan dapat menghemat ruang jika TWRP tidak sesuai dengan pemulihan Anda
  • TW_NO_BATT_PERCENT: = true - menonaktifkan tampilan persentase baterai untuk perangkat yang tidak mendukungnya dengan benar
  • TW_CUSTOM_POWER_BUTTON: = 107 - peta khusus tombol daya untuk layar kunci
  • TW_NO_REBOOT_BOOTLOADER: = true - menghapus tombol bootloader booting ulang dari menu reboot
  • TW_NO_REBOOT_RECOVERY: = true - menghapus tombol pemulihan reboot dari menu reboot
  • RECOVERY_TOUCHSCREEN_SWAP_XY: = true - menukar pemetaan sentuhan antara sumbu X dan Y
  • RECOVERY_TOUCHSCREEN_FLIP_Y: = true - membalik nilai-nilai layar sumbu y
  • RECOVERY_TOUCHSCREEN_FLIP_X: = true - membalik nilai-nilai layar sentuh sumbu x
  • TWRP_EVENT_LOGGING: = true - memungkinkan pencatatan kejadian sentuhan untuk membantu men-debug masalah layar sentuh (jangan tinggalkan ini untuk rilis - ini akan mengisi logfile Anda dengan sangat cepat)
  • BOARD_HAS_FLIPPED_SCREEN: = true - membalik layar secara terbalik untuk layar yang dipasang terbalik

Flag build tambahan dapat ditemukan dengan membaca sekilas melalui file Android.mk di sumber pemulihan, tetapi mereka biasanya tidak digunakan sehingga tidak ada gunanya mendokumentasikannya.

Menggunakan Recovery.Fstab

TWRP 2.5 dan lebih tinggi memiliki dukungan untuk fitur pemulihan baru.fstab - terutama kemampuan untuk memperpanjang fungsi pencadangan / pemulihan TWRP. Anda tidak perlu menambahkan bendera fstab, karena sebagian besar partisi akan ditangani secara otomatis.

TWRP hanya mendukung v2 fstabs di versi 3.2.0 dan lebih tinggi - dalam versi TWRP yang lebih lama, Anda harus menggunakan format fstab yang lama. Berikut ini contoh TWRP fstab untuk Galaxy S4:

Untuk memaksimalkan kompatibilitas dengan pohon build khusus Anda, Anda dapat membuat twrp.fstab dan menggunakan PRODUCT_COPY_FILES untuk ditempatkan di> etc> twrp.fstab.

Ketika TWRP meluncurkan dan menemukan twrp.fstab di ramdisk, ia akan mengganti namanya menjadi> etc> recovery.fstab.bak - pada dasarnya ia menggantikan fstab dari perangkat Anda dengan TWRP fstab, yang memperluas kompatibilitas.

Kode contoh:

PRODUCT_COPY_FILES + = device / lge / hammerhead / twrp.fstab: recovery> root> etc> twrp.fstab

The fstab di TWRP dapat berisi beberapa bendera untuk setiap partisi yang terdaftar di fstab.

Bendera ini ditambahkan ke akhir daftar partisi di fstab, dipisahkan oleh spasi / spasi / tab putih. Bendera hanya akan mempengaruhi partisi itu, tetapi tidak ada yang lain. Bendera dipisahkan oleh titik koma. Berikut beberapa contoh kode:

Jadi mari kita periksa sedikit demi sedikit. Bendera di sini akan memberikan nama tampilan Micro SDcard. Flag wipeingui akan membuat partisi ini tersedia untuk mengelap dalam menu Penghapusan Canggih. Bendera yang dapat dilepas menunjukkan bahwa partisi ini tidak selalu ada, yang akan mencegah kesalahan pemasangan ditampilkan.

Daftar lengkap bendera (kredit untuk TeamWin) :

  • removable - menunjukkan bahwa partisi mungkin tidak hadir mencegah kesalahan pemasangan ditampilkan selama boot
  • penyimpanan - menunjukkan bahwa partisi dapat digunakan sebagai penyimpanan yang menjadikan partisi tersedia sebagai penyimpanan untuk pencadangan, pemulihan, pemasangan zip, dll.
  • settingsstorage - hanya satu partisi yang harus ditetapkan sebagai pengaturan penyimpanan, partisi ini digunakan sebagai lokasi untuk menyimpan file pengaturan TWRP
  • canbewiped - menunjukkan bahwa partisi dapat dihapus oleh sistem back-end, tetapi mungkin tidak terdaftar di GUI untuk dihapus oleh pengguna
  • userrmrf - menimpa jenis format normal dari penghapusan dan hanya memungkinkan partisi dihapus menggunakan perintah rm -rf
  • backup = - harus digantikan oleh tanda yang sama, jadi backup = 1 atau backup = 0, 1 menunjukkan bahwa partisi dapat terdaftar dalam daftar backup / restore sementara 0 memastikan bahwa partisi ini tidak akan muncul dalam daftar cadangan.
  • wipeingui - membuat partisi muncul di GUI untuk memungkinkan pengguna untuk memilihnya untuk mengelap dalam menu penghapusan lanjutan
  • wipeduringfactoryreset - partisi akan dihapus saat reset pabrik
  • ignoreblkid - blkid digunakan untuk menentukan sistem file apa yang digunakan oleh TWRP, flag ini akan menyebabkan TWRP untuk melewati / mengabaikan hasil blkid dan menggunakan sistem file yang ditentukan dalam fstab saja
  • retainlayoutversion - menyebabkan TWRP mempertahankan file .layoutversion di / data pada perangkat seperti Sony Xperia S yang menggunakan / data / media tetapi masih memiliki partisi terpisah / sdcard
  • symlink = - menyebabkan TWRP menjalankan perintah mount tambahan ketika memasang partisi, umumnya digunakan dengan / data / media untuk membuat / sdcard
  • display = - menetapkan nama tampilan untuk partisi untuk daftar di GUI
  • storagename = - menetapkan nama penyimpanan untuk partisi untuk dicantumkan dalam daftar penyimpanan GUI
  • backupname = - menetapkan nama cadangan untuk partisi untuk daftar di daftar cadangan / pemulihan GUI
    length = - biasanya digunakan untuk memesan ruang kosong di akhir partisi / data untuk menyimpan kunci dekripsi ketika enkripsi perangkat lengkap Android hadir, bukan pengaturan ini dapat menyebabkan ketidakmampuan untuk mengenkripsi perangkat
  • canencryptbackup = - 1 atau 0 untuk mengaktifkan / menonaktifkan, membuat TWRP mengenkripsi cadangan partisi ini jika pengguna memilih enkripsi (hanya berlaku untuk cadangan tar, bukan gambar)
  • userdataencryptbackup = - 1 atau 0 untuk mengaktifkan / menonaktifkan, membuat TWRP mengenkripsi hanya bagian userdata dari partisi ini, subfuldes tertentu seperti / data / aplikasi tidak akan dienkripsi untuk menghemat waktu
  • subpartitionof = - harus digantikan oleh tanda yang sama dan path dari partisi itu adalah sub-partisi. Subpartisi diperlakukan sebagai bagian dari partisi utama jadi misalnya, TWRP secara otomatis membuat / datadata menjadi sub-bagian dari / data. Ini berarti bahwa / datadata tidak akan muncul dalam daftar GUI, tetapi / datadata akan dihapus, dicadangkan, dipulihkan, dipasang, dan dilepas kapan saja operasi tersebut dilakukan pada / data.

Contoh penggunaan sub-partisi yang baik adalah partisi 3x efs pada LG Optimus G:

Ini menyatukan semua 3 partisi ke dalam satu entri EFS di TWRP GUI yang memungkinkan ketiganya di-backup dan dipulihkan bersama di bawah satu entri.

Dengan TWRP 3.2.0 dan yang lebih baru yang menggunakan V2 Fstab, Anda tidak perlu menambahkan flag build apa pun . Dukungan Fstab V2 otomatis. V2 Fstab juga mendukung wildcard (simbol *) yang dapat berguna untuk USB OTG dan kartu micro-SD dengan beberapa partisi. Anda juga dapat terus menggunakan format V1 Fstab, dan sangat mungkin untuk menggunakan kedua jenis V1 dan V2 dalam Fstab yang sama.

Sebagai contoh, berikut adalah baris V1 Fstab dengan wildcard yang dimaksudkan untuk USB OTG:

TIP PRO: Jika masalahnya ada pada komputer Anda atau laptop / notebook, Anda harus mencoba menggunakan Perangkat Lunak Reimage Plus yang dapat memindai repositori dan mengganti file yang rusak dan hilang. Ini berfungsi dalam banyak kasus, di mana masalah ini berasal karena sistem yang rusak. Anda dapat mengunduh Reimage Plus dengan Mengklik di Sini

Berikut ini adalah baris V2 Fstab untuk perangkat yang sama yang mencapai hasil yang sama:

Selain itu Anda dapat menyertakan twrp.flags yang menggunakan format V1 Fstab, dan mereka dapat digunakan untuk melengkapi V2 Fstab dengan flag TWRP, partisi tambahan yang tidak termasuk dalam Fstab V2, atau pengaturan override di V2 Fstab.

Sebagai contoh, perangkat Huawei mungkin memiliki fstab V2 ini dalam proses pemulihan .fstab:

Mungkin juga bendera-bendera ini termasuk:

Jadi di sini, dua baris pertama di TWRP.Flags akan menambahkan partisi Boot dan Pemulihan, yang tidak ada dalam Fstab V2. Kemudian, baris / cust di TWRP.flags akan menginstruksikan TWRP untuk memungkinkan pengguna akhir untuk membuat cadangan partisi (cust), dan memberikannya nama tampilan.

Partisi / misc hadir dalam twrp.flags, dan partisi / oeminfo menginstruksikan TWRP untuk juga memungkinkan mencadangkan dan memberinya nama tampilan.

Kami memerlukan baris / data karena banyak perangkat Huawei yang dienkripsi, tetapi menggunakan binari Huawei khusus - dengan demikian, kami menggunakan binari Huawei untuk mendekripsi perangkat secara otomatis di Mode Pemulihan. Jadi di sini baris / data akan menginstruksikan TWRP untuk menggunakan / dev / block / dm -0, dan bukan / dev / block / bootdevice / by-name / userdata, yang biasanya digunakan untuk pemasangan yang tepat.

Akhirnya ada / system_image, sehingga TWRP akan menyertakan opsi untuk membuat gambar sistem di menu Backup dan Pulihkan.

Github resmi TeamWin juga harus berisi pohon perangkat contoh terbaru untuk perangkat yang memiliki port TWRP resmi. Github TeamWin dapat ditemukan di SINI.

Setelah Omni atau CM telah disinkronkan, dan Anda telah menyiapkan bendera TWRP, Anda harus membuat sumber ./build/envsetup.sh

Dan Anda akan ingin makan siang perangkat, sehingga Anda dapat melakukan sesuatu seperti makan siang omni_hammerhead.eng.

Setelah makan siang yang sukses, sebagian besar perangkat akan menggunakan perintah ini:

Anda harus mengganti # dalam –j # dengan jumlah inti +1. Jadi jika Anda memiliki dual-core -j3, quadcore akan -j5, dll. Ganti # dengan jumlah inti +1, jadi jika Anda memiliki inti ganda itu -j3 dan quad core menjadi -j5, dll.

Selain itu, perangkat Samsung yang khas akan memerlukan ini:

Ini karena sebagian besar perangkat Samsung menyertakan pemulihan sebagai ramdisk tambahan di boot, bukan pada partisi pemulihan terpisah (yang digunakan sebagian besar perangkat lain).

Sekarang, Anda harus memiliki TWRP yang dikompilasi untuk perangkat Anda dan semoga ini bekerja di lingkungan emulator. Anda harus selalu menguji port TWRP Anda di lingkungan emulator terlebih dahulu, jadi Anda tidak berisiko membongkar perangkat Anda.
Unduh kumpulan file konfigurasi perangkat ini.

Kompilasi file pemulihan menggunakan file-file perangkat tersebut. Di SDK Android, klik Alat -> Kelola AVD. Klik Baru. Atur sebagai berikut:

Kemudian klik OK.

Setelah Anda memiliki AVD dan gambar pemulihan Anda, Anda dapat mem-boot TWRP di emulator dengan browsing ke folder android-sdk / tools Anda dan menjalankan perintah ini:

Perhatikan bahwa ADB tidak langsung berfungsi. Sekitar 10 hingga 15 detik setelah TWRP selesai booting, ADB akan online. Kami memulai ADB melalui init.rc sehingga meskipun TWRP gagal melakukan boot karena ada semacam kesalahan kode yang mungkin telah Anda buat, ADB tetap harus bekerja. Nikmati!

Perangkat TWRP dan A / B (kredit untuk TeamWin):

Dari sudut pandang TWRP, perangkat A / B tidak jauh berbeda dari perangkat biasa, tetapi pengembang tampaknya malu bekerja pada perangkat ini. Saya akan mencoba menjelaskan beberapa hal tentang hal ini dan semoga ini akan berfungsi sebagai panduan untuk memindahkan perangkat TWRP ke A / B.

Pertama, mari kita pahami apa itu perangkat A / B dan bagaimana itu berbeda. Perangkat A / B memiliki duplikat dari banyak partisi pada perangkat. Perangkat A / B memiliki 2x systempartitions, 2x partisi boot, 2x partisi vendor, 2x partisi modem / firmware, dll. Hanya satu slot yang digunakan dalam satu waktu. Selama boot awal, tahap pertama dari bootloader membaca sejumlah kecil data yang disebut BCB atau Bootloader Control Block dan memutuskan apakah akan mem-boot partisi A atau partisi B. Ketika pembaruan OTA tersedia, data dari slot aktif disalin dari slot yang tidak aktif dan ditambal / diperbarui. Misalnya, jika Anda saat ini berada di slot A, perangkat Anda akan mengunduh pembaruan dan menyalin partisi sistem yang ada dari slot A dan menambal / memperbaruinya dengan pembaruan baru ke dalam slot B. Setelah penyalinan dan pemutakhiran selesai, BCB diperbarui dan perangkat melakukan boot ulang menggunakan slot B. Waktu berikutnya pembaruan tersedia, partisi sistem di slot B disalin ke slot A dan diperbarui, BCB mendapat pembaruan, dan kami reboot ke slot A. Saat melihat partisi pada perangkat, Anda akan melihat sesuatu seperti ini:

Perhatikan partisi dual boot, sistem dan vendor dalam daftar di atas, tetapi hanya satu partisi userdata.

Meskipun secara teknis tidak ada persyaratan yang saya ketahui, semua perangkat A / B yang dikirimkan sejauh ini tidak memiliki partisi pemulihan terpisah. Sebaliknya, gambar boot berisi pemulihan di ramdisk-nya. Yang penting adalah mengetahui bahwa gambar boot sekarang juga mengandung pemulihan. Untuk kelengkapan, partisi sistem adalah sistem file root penuh. Selama boot, jika kernel diberitahu untuk boot ke pemulihan, kernel akan mengekstrak ramdisk di partisi boot. Jika kernel tidak diberitahu oleh bootloader untuk boot ke pemulihan, maka kernel akan me-mount partisi sistem yang sesuai (A atau B) karena partisi sistem adalah sistem file root penuh. Ini berarti bahwa partisi sistem pada perangkat ini dipasang ke / bukannya ke / sistem dan partisi sistem berisi semua file yang biasanya ada di ramdisk image boot dan subfolder / sistem.

Dari sudut pandang TWRP, ada 3 hal yang harus Anda lakukan untuk perangkat A / B. Pertama, Anda perlu mengatur

Kode:

Terakhir, setelah Anda masuk ke TWRP, Anda mungkin ingin memastikan bahwa informasi hal-hal bootctl merespon dengan benar tanpa kesalahan. Biasanya binary bootctl membutuhkan perpustakaan proprietary atau bahkan beberapa layanan untuk bekerja dengan benar. Jika bootctl tidak bekerja dengan benar, maka Anda tidak akan dapat mengganti slot dalam TWRP dengan benar.

Selain pengaturan

Kode:

AB_OTA_UPDATER: = true

Anda mungkin juga ingin mengatur:

Kode:

BOARD_USES_RECOVERY_AS_BOOT: = true

BOARD_BUILD_SYSTEM_ROOT_IMAGE: = true

Jika Anda mengatur

Kode:

BOARD_USES_RECOVERY_AS_BOOT: = true

kemudian membuat recoveryimage tidak akan berfungsi lagi dan sebagai gantinya Anda harus membuat bootimage. Saya tidak menyarankan pengaturan bendera ini untuk pohon build TWRP saja. Bendera ini mungkin akan diperlukan untuk pengembang membangun ROM penuh untuk perangkat A / B.

Instalasi / Flashing TWRP pada perangkat A / B:

Karena semua perangkat A / B yang dikenal tidak memiliki partisi pemulihan terpisah, Anda akhirnya harus meng-flash TWRP ke partisi boot. Pada Pixel 1 dan 2, kami menggunakan boot fastboot untuk sementara mem-boot TWRP tanpa mem-flash TWRP. Kami kemudian menyediakan zip untuk memungkinkan pengguna mem-flash TWRP ke kedua slot. Anda dapat mengunduh salah satu dari ritsleting ini dari situs web kami dan memperbarui ritsleting sesuai kebutuhan untuk mendukung perangkat Anda. Akhirnya kami akan menambahkan alat ke TWRP untuk memungkinkan pengguna mem-flash pemulihan pada perangkat ini tanpa perlu menggunakan ritsleting.

Baru-baru ini, saya bekerja di Telepon Razer. Telepon Razer sayangnya tidak mendukung boot fastboot. Sebaliknya, pengguna harus menentukan slot boot yang sedang aktif digunakan

Kode:

untuk masuk ke TWRP. Setelah berada di TWRP, mereka dapat pergi ke halaman reboot dan kembali ke slot awalnya yang aktif, membuat cadangan, lalu menginstal TWRP. Menggunakan slot yang tidak aktif memungkinkan pengguna untuk mendapatkan cadangan perangkat yang baik dan tidak dimodifikasi sebelum menginstal TWRP.

Catatan tambahan:

Jika Anda ingin TWRP secara resmi didukung untuk perangkat Anda sehingga dapat diinstal secara otomatis dengan aplikasi TWRP, dan Anda benar-benar ingin melakukan ini sehingga pemilik lain dari perangkat yang sama dapat menikmati dukungan TWRP resmi dan itu hal yang menyenangkan untuk melakukannya, Anda harus mengirimkan informasi berikut ke TeamWin:

  1. File konfigurasi perangkat untuk mengkompilasi TWRP dari sumber untuk perangkat Anda - jangan mengemas kembali recovery.img dengan tangan, mereka perlu mengkompilasinya dari sumber.
  2. Setelah TeamWin membuat salinan TWRP, mereka akan mengirimkannya kepada Anda untuk validasi - setelah Anda memvalidasi, TeamWin akan membangun citra yang berfungsi untuk perangkat Anda, dan menambahkannya ke aplikasi TWRP resmi.

TIP PRO: Jika masalahnya ada pada komputer Anda atau laptop / notebook, Anda harus mencoba menggunakan Perangkat Lunak Reimage Plus yang dapat memindai repositori dan mengganti file yang rusak dan hilang. Ini berfungsi dalam banyak kasus, di mana masalah ini berasal karena sistem yang rusak. Anda dapat mengunduh Reimage Plus dengan Mengklik di Sini

Facebook Twitter Google Plus Pinterest