Rehber Treble Desteği Ekleme Kılavuzu

  • Konbuyu başlatan mbtt
  • Başlangıç tarihi
  • Cevaplar 0
  • Görüntüleme 730

mbtt

Deneyimli Üye
Deneyimli Üye
MIUI Sever
Adım
Lütfi
Cihazım
Le Pro3
Yaş
26
Konum
ankara
Katılım
22 Mayıs 2016
Konular
68
Mesajlar
102
Tepkime puanı
215
Puanları
43
DİPNOT
BU İŞLEMDEN DOĞABİLECEK SORUNLARDAN ŞAHSIM VE FORUM MIUITR SORUMLU TUTULAMAZ.


AÇIKLAMA
Bu kılavuz ile cihaz kaynaklarınıza treble desteği ekleyebilirsiniz.
Genel bir anlatımdır. Her cihaza göre ekstra işlemler, eklemeler ve çıkarmalar yapmak gerekebilir.

Ricam bu kılavuzdan yardım aldıysanız konunuzun teşekkürler kısmında benimde ismim geçsin.


ANLATIM

Bilgi
Bu kılavuzu okuyorsanız treble sisteminin nasıl çalıştığını biliyorsunuz demektir.

Bazı şartlar karşılanmalıdır.
  • Cihazın vendor partitionu'na sahip olması.
  • Açık kaynak bir kernelin olması. Aksi takdirde işlemde uygulayacağımız bir bölüm yapılamaz ve destek zora girer ve hatta imkansız hale gelir.
Yapacağımız işlemler sistem ve vendorun bağımsız şekilde oluşup farklı kombinasyonlarla çalışmasını sağlamaktır.

Bunun için öncelikli hedef: vendor dosyaları -> vendor bölümlendirmesinde toplanmalıdır.

Ayrıca cihaz kaynaklarında (device tree - kernel - vendor) kısımlarında makefile'larda düzenlemeler yapılacaktır.
Bazı treble aktif edici flaglar eklenip. system kısmı ile alakalı olan satırlar düzenlenecek/silinecektir.

Device Tree

1-) Android.mk
Bu dosya eğer tree sistemini biliyorsanız bazı kök dosya symlinkleri ve düzenlemeleri yapar.
Bu dosyada eğer system partitionu içine symlinkleriniz varsa vendor içerisine alın. Ayrıca symlink için gösterilen dosyayıda vendorda uygun yere aldığınızdan emin olun.

Örneğin:
Kod:
IMS_LIBS := libimscamera_jni.so libimsmedia_jni.so
IMS_SYMLINKS := $(addprefix $(TARGET_OUT_VENDOR_APPS)/ims/lib/arm64/,$(notdir $(IMS_LIBS)))
$(IMS_SYMLINKS): $(LOCAL_INSTALLED_MODULE)
    @echo "IMS lib link: $@"
    @mkdir -p $(dir $@)
    @rm -rf $@
    $(hide) ln -sf /system/vendor/lib64/$(notdir $@) $@

şeklindeyse; Aşağıdaki gibi olacaktır.

Kod:
IMS_LIBS := libimscamera_jni.so libimsmedia_jni.so
IMS_SYMLINKS := $(addprefix $(TARGET_OUT_VENDOR_APPS)/ims/lib/arm64/,$(notdir $(IMS_LIBS)))
$(IMS_SYMLINKS): $(LOCAL_INSTALLED_MODULE)
    @echo "IMS lib link: $@"
    @mkdir -p $(dir $@)
    @rm -rf $@
    $(hide) ln -sf /vendor/lib64/$(notdir $@) $@

Yani: "$(hide) ln -sf" ilen başlayan satırda system kısmını kesip direk vendor içerisinden symlink yapmasını sağlamanız gerekmektedir.

2-) device.mk
Bu dosya derleme paketlerinden derlenilmek istenenleri ve treede bulunan audio - wifi - keylayout - ramdisk dosyalarının kopyalama işlerini ve dizinlerini ayarlar.

Örneğin:
Kod:
# Keylayouts
PRODUCT_COPY_FILES += \
    $(LOCAL_PATH)/keylayout/atmel_ts_key.kl:system/usr/keylayout/atmel_ts_key.kl \
    $(LOCAL_PATH)/keylayout/gpio-keys.kl:system/usr/keylayout/gpio-keys.kl \
    $(LOCAL_PATH)/keylayout/qpnp_pon.kl:system/usr/keylayout/qpnp_pon.kl

şeklindeyse; Aşağıdaki gibi olacaktır.

Kod:
# Keylayouts
PRODUCT_COPY_FILES += \
    $(LOCAL_PATH)/keylayout/atmel_ts_key.kl:$(TARGET_COPY_OUT_VENDOR)/usr/keylayout/atmel_ts_key.kl \
    $(LOCAL_PATH)/keylayout/gpio-keys.kl:$(TARGET_COPY_OUT_VENDOR)/usr/keylayout/gpio-keys.kl \
    $(LOCAL_PATH)/keylayout/qpnp_pon.kl:$(TARGET_COPY_OUT_VENDOR)/usr/keylayout/qpnp_pon.kl

Yani: "system" kısımları yerine "$(TARGET_COPY_OUT_VENDOR)" yazılacak ve bu sayede bu keylayout dosyaları vendor partına atılacaktır.

3-) BoardConfig.mk
Bu dosyaya ise aşağıdaki flagları ekleyerek trebleyi aktif edebilirsiniz.

Kod:
# Treble
PRODUCT_FULL_TREBLE_OVERRIDE := true
PRODUCT_VENDOR_MOVE_ENABLED := true
TARGET_COPY_OUT_VENDOR := vendor
PRODUCT_SHIPPING_API_LEVEL :=
PRODUCT_COMPATIBILITY_MATRIX_LEVEL_OVERRIDE :=
BOARD_PROPERTY_OVERRIDES_SPLIT_ENABLED := true
TARGET_VENDOR_PROP += $(LOCAL_PATH)/vendor.prop

"PRODUCT_SHIPPING_API_LEVEL :=" -> Karşısına cihazın ilk çıktığında içerdiği romun SDK sürümünü yazın. Yani 23 (marshmallow) - 25 (nougat) gibi.

Örneğin:
PRODUCT_SHIPPING_API_LEVEL := 23


"PRODUCT_COMPATIBILITY_MATRIX_LEVEL_OVERRIDE :=" -> Karşısına cihazın desteklediği treble romun SDK sürümünü yazın. Yani 27 (oreo) - 28 (pie) gibi.

Örneğin:
PRODUCT_COMPATIBILITY_MATRIX_LEVEL_OVERRIDE :=27

4-) Rootdir
Bu dosyalar cihazın boot.img ile arasındaki köprüdür. Bu dosyalar oreo güncellemesi ile boot.img içinden vendor/etc'ye ve vendor partında muhtelif yerlere taşınmıştır.

Örneğin:
-fstab.qcom artık vendor/etc içerisinde
-init.qcom.rc vendor/etc/init/hw içerisindedir.
-ueventd.qcom.rc'nin adı artık ueventd.rc olup vendor'un ana dizinine alınmıştır.

Öncelikle bu dosyaların uygun dizinlere taşınması için rootdir klasörüne içerisindeki Android.mk'da bazı taşımaların düzenlemesini yapmamız gerekmektedir.

Örnek1:
Kod:
include $(CLEAR_VARS)
LOCAL_MODULE        := fstab.qcom
LOCAL_MODULE_TAGS    := optional eng
LOCAL_MODULE_CLASS    := ETC
LOCAL_SRC_FILES        := etc/fstab.qcom
LOCAL_MODULE_PATH    := $(TARGET_ROOT_OUT)
include $(BUILD_PREBUILT)

şeklindeyse; Aşağıdaki gibi olacaktır.

Kod:
include $(CLEAR_VARS)
LOCAL_MODULE       := fstab.qcom
LOCAL_MODULE_TAGS  := optional eng
LOCAL_MODULE_CLASS := ETC
LOCAL_SRC_FILES    := etc/fstab.qcom
LOCAL_MODULE_PATH  := $(TARGET_OUT_VENDOR_ETC)
include $(BUILD_PREBUILT)

Yani "$(TARGET_ROOT_OUT)" kısmını "$(TARGET_OUT_VENDOR_ETC)" yaparak fstab.qcom dosyasının root dizinine değil vendor/etc'ye atılmasını sağladık.

Örnek2:
Kod:
include $(CLEAR_VARS)
LOCAL_MODULE        := init.qcom.rc
LOCAL_MODULE_TAGS    := optional eng
LOCAL_MODULE_CLASS    := ETC
LOCAL_SRC_FILES        := etc/init.qcom.rc
LOCAL_MODULE_PATH    := $(TARGET_ROOT_OUT)
include $(BUILD_PREBUILT)

şeklindeyse; Aşağıdaki gibi olacaktır.

Kod:
include $(CLEAR_VARS)
LOCAL_MODULE       := init.qcom.rc
LOCAL_MODULE_TAGS  := optional eng
LOCAL_MODULE_CLASS := ETC
LOCAL_SRC_FILES    := etc/init.qcom.rc
LOCAL_MODULE_PATH  := $(TARGET_OUT_VENDOR_ETC)/init/hw
include $(BUILD_PREBUILT)

Yani "$(TARGET_ROOT_OUT)" kısmını "$(TARGET_OUT_VENDOR_ETC)/init/hw" yaparak init.qcom.rc dosyasının root dizinine değil vendor/etc/init/hw'ye atılmasını sağladık.

Örnek3:
Kod:
include $(CLEAR_VARS)
LOCAL_MODULE        := init.qcom.sh
LOCAL_MODULE_TAGS    := optional eng
LOCAL_MODULE_CLASS    := ETC
LOCAL_SRC_FILES        := etc/init.qcom.sh
LOCAL_MODULE_PATH    := $(TARGET_ROOT_OUT)
include $(BUILD_PREBUILT)

şeklindeyse; Aşağıdaki gibi olacaktır.

Kod:
include $(CLEAR_VARS)
LOCAL_MODULE       := init.qcom.sh
LOCAL_MODULE_TAGS  := optional eng
LOCAL_MODULE_CLASS := ETC
LOCAL_SRC_FILES    := etc/init.qcom.sh
LOCAL_MODULE_PATH  := $(TARGET_OUT_VENDOR_EXECUTABLES)
include $(BUILD_PREBUILT)

Yani "$(TARGET_ROOT_OUT)" kısmını "$(TARGET_OUT_VENDOR_EXECUTABLES)" yaparak init.qcom.sh dosyasının root dizinine değil vendor/bin'e atılmasını sağladık.

Tüm dosyaların dizinlerini bu şekilde düzenleyerek derlemede atılacakları yerleri doğru belirtmemiz gerekiyor.


init.qcom.rc :
Bu dosya diğer .rc uzantılı dosyaların da dahil edilmesini sağlar bunun için import komutları kullanır.

Kod:
import init.qcom.power.rc
import init.qcom.usb.rc
import init.device.rc

Örneğin yukarıdaki importları artık aşağıdaki gibi vendor içerisinden yapacağız.

Kod:
import /vendor/etc/init/hw/init.qcom.power.rc
import /vendor/etc/init/hw/init.qcom.usb.rc
import /vendor/etc/init/hw/init.target.rc

Ayrıca bir alt kısımda anlattığım üzere bu dosyada da servislerin çalışma dizinlerini ayarlayacaksınız.


Diğer ".rc" dosyaları :

Bu dosyalar sistem içerisindeki bin ve diğer türevdeki servis dosyalarının çalışması için komutlar içerir.
Bunun için servis çalışma dizinlerini düzenlememiz gerekiyor

Örneğin:
Kod:
service cnss_diag /system/vendor/bin/cnss_diag -q -f
    class main
    user root
    group root

şeklindeyse; Aşağıdaki gibi olacaktır.

Kod:
service cnss_diag /vendor/bin/cnss_diag -q -f
    class main
    user root
    group root

Ayrıca bu çalıştırdığımız bin dosyasının artık system/bin'den vendor/bin dizinine alındığından emin oluyoruz.


".sh" dosyaları :

Bu dosyalar bash scripti olup sistemde bazı işlevleri üstlenirler. Ve treble sistemi ile birlikte boot.img yahut system/etc'den vendor/bin dizinine alınmışlardır.
Bunun için yine yukarıda anlatıldığı üzere önce Android.mk ya da device.mk'da bu dosyaların dizinlerini doğru ayarlayıp

Ardından ise bu .sh dosyalarının içeriğinde eğer dizin belirtiliyorsa ve dizinler system içinde bir yeri gösteriyorsa bu satırları vendoru gösterecek şekilde ayarlayıp işaret ettiği dosyanında vendora alındığından emin oluyoruz.

Örneğin:
Kod:
if [ -f /system/bin/msm_irqbalance ]; then
    start msm_irqbalance
fi

şeklindeyse; Aşağıdaki gibi olacaktır.

Kod:
if [ -f /vendor/bin/msm_irqbalance ]; then
    start vendor.msm_irqbalance
fi

Yani, system/bin klasöründe bulunan msm_irqbalance dosyasının vendor/bin'e alınıp ordan çalıştırılmasını sağladık.

6-) Alt Klasörler
Alt klasörlerde özellikle açık kaynakla derlenen dosyaların Android.mk dosyalarına, artık;

"LOCAL_VENDOR_MODULE := true" satırı eklenmelidir.

Bu satır derlenen dosyanın artık system içerisine değil vendor içerisinde uygun yere atılmasını sağlar.

7-) system.prop
Bu dosyanın adı artık "system.prop" değil "vendor.prop"dur.

Dosyanızın ismini değiştirdikten sonra içerisinden eğer dizinler belirten satırlar varsa uygun şekilde düzenleyin.

Örneğin:
Kod:
ro.qcom.ad.calib.data=/system/etc/ad_calib_le_zl1.cfg

şeklindeyse; Aşağıdaki gibi olacaktır.

Kod:
ro.qcom.ad.calib.data=/vendor/etc/ad_calib_le_zl1.cfg

yani system/etc'den vendor/etc'ye alınmıştır. Ayrıca bu dosyanın system/etc klasöründen vendor/etc'ye alındığına emin olun.

Ayrıca aşağıdaki satırı BoardConfig.mk dosyasına ekleyin.

Kod:
TARGET_VENDOR_PROP += $(LOCAL_PATH)/vendor.prop

8-) Blob Listeleri Ve Extractorlar
A-) setup-makefiles.sh

Kod:
INITIAL_COPYRIGHT_YEAR=
export DEVICE_BRINGUP_YEAR=

"INITIAL_COPYRIGHT_YEAR=" -> Bu kısmın karşısına cihazın çıkış tarihini yazacaksınız
"export DEVICE_BRINGUP_YEAR=" -> Yukarıdaki gibi bu kısmın karşısına da cihazın çıkış tarihini yazacaksınız


8=)proprietary-files.txt

Bu dosya tree hazırlama kılavuzumda belirttiğim üzere cihazdan çekilecek blobların listesini belirtir.
Bütün dosyaların vendora taşınması ile birlikte bizde dosyaları çektikten sonra vendora atacağız.

Bunun için dosyaların karşısına muadil kısmı ile birlikte vendor ibaresini ekleyeceğiz

Örnek 1:
Kod:
etc/drc/drc_cfg_AZ.txt
etc/dts/dts-m6m8-lic.key

şeklindeyse; Aşağıdaki gibi olacaktır.

Kod:
etc/drc/drc_cfg_AZ.txt:vendor/etc/drc/drc_cfg_AZ.txt
etc/dts/dts-m6m8-lic.key:vendor/etc/dts/dts-m6m8-lic.key

Buranın açıklaması:
drc_cfg_AZ.txt
dosyası etc/drc/ klasöründen çekilip bloblar ayarlanırken vendor/etc/drc/ dizinine atacaktır.


Örnek 2:
Kod:
etc/firmware/nvm_tlv.bin
etc/firmware/nvm_tlv_1.3.bin
etc/firmware/nvm_tlv_2.1.bin
etc/firmware/rampatch_tlv.img
etc/firmware/rampatch_tlv_1.3.tlv
etc/firmware/rampatch_tlv_2.1.tlv

şeklindeyse; Aşağıdaki gibi olacaktır.

Kod:
etc/firmware/nvm_tlv.bin:vendor/firmware/nvm_tlv.bin
etc/firmware/nvm_tlv_1.3.bin:vendor/firmware/nvm_tlv_1.3.bin
etc/firmware/nvm_tlv_2.1.bin:vendor/firmware/nvm_tlv_2.1.bin
etc/firmware/rampatch_tlv.img:vendor/firmware/rampatch_tlv.img
etc/firmware/rampatch_tlv_1.3.tlv:vendor/firmware/rampatch_tlv_1.3.tlv
etc/firmware/rampatch_tlv_2.1.tlv:vendor/firmware/rampatch_tlv_2.1.tlv

- Kernel ve Vendor Düzenlemeleri -

Kernel
Kernel kısmında ise yapmamız gereken ana değişiklik vendor partını mount etmektir.

Bunun için firmware bilgisini içeren dtsi dosyamızdan firmware kısmını bulup ardından android bölümü altına aşağıdaki satırları ekleyin.
Kod:
vendor {
    compatible = "android,vendor";
    dev = "/dev/block/platform/soc/blockismi/by-name/vendor";
    type = "ext4";
    mnt_flags = "ro,barrier=1,discard";
    fsmgr_flags = "wait";
    status = "ok";
}

Bu satırlar vendor partitionunu kernele tanıtır ve onu mount edip onun içeriğini okuma imkanı verir.

Burada "blockismi" kısmından kastım part numarasıdır.

Örneğin:
Bu partın numarası leecoda "624000.ufshc" şeklindedir sizde kendi cihazınızın vendor part numarasını öğrenip oraya yazmalısınız.

Vendor
1-) Dosyaları uygun klasörlere system/ kısmından system/vendor/ kısmına taşıyın.

Örneğin:
ftmdaemon dosyasının yerini bin klasöründen vendor/bin klasörüne alın.



2-) Android.mk ve cihazadı-vendor.mk dosyalarında taşınan dosyaların yerini vendor olarak belirtin.

cihazadı kısmından kastım lineage extractorleri cihaz adına göre makefile çıkarır bu zl1'de zl1-vendor.mk - oneplus3'te oneplus3-vendor.mk'dır.

Örneğin:
Kod:
vendor/oneplus/oneplus3/proprietary/vendor/lib/libfeedbackhandler.so:system/vendor/lib/libfeedbackhandler.so

şeklindeyse; Aşağıdaki gibi olacaktır.

Kod:
vendor/oneplus/oneplus3/proprietary/vendor/lib/libfeedbackhandler.so:$(TARGET_COPY_OUT_VENDOR)/lib/libfeedbackhandler.so

Tüm bu işlemleri tamamladıktan ve dizin satırları ile dosya dizinlerini kontrol ettikten sonra;
Bir derleme alıp vendor.img dosyanızı vendor partına - boot.img dosyasını ise boot.img partına flaşlayıp üstüne bir GSI kurun.

GSI Derleme Kılavuzu'na ise buradan ulaşabilirsiniz: [GSI] Android Generic System Image Derleme Kılavuzu
 
Üst Alt