CERCA
PER MODELLO
FullScreen Chatbox! :)

Utente del giorno: carotix con ben 2 Thanks ricevuti nelle ultime 24 ore
Utente della settimana: 9mm con ben 7 Thanks ricevuti negli ultimi sette giorni
Utente del mese: 9mm con ben 31 Thanks ricevuti nell'ultimo mese

Pagina 1 di 4 123 ... ultimoultimo
Ultima pagina
Visualizzazione dei risultati da 1 a 10 su 34
Discussione:

[guide] appunti di modding

Se questa discussione ti è stata utile, ti preghiamo di lasciare un messaggio di feedback in modo che possa essere preziosa in futuro anche per altri utenti come te!
  1. #1
    Androidiano VIP L'avatar di giuros77


    Registrato dal
    Feb 2012
    Località
    http://goo.gl/jhH3w
    Messaggi
    2,152
    Smartphone
    SGN2

    Ringraziamenti
    1,206
    Ringraziato 2,200 volte in 987 Posts
    Predefinito

    [guide] appunti di modding

    BREVE PREMESSA

    Ho pensato che potrebbe tornare utile raccogliere le esperienze di modding di ognuno, in modo da non trovarsi ogni volta ad affrontare i soliti problemi affidandosi semplicemente a google o al proprio intuito, sbattendo la testa al muro per trovare soluzioni ad "inghippi" magari già risolti da altri.
    Insomma, una sorta di block notes di "appunti di modding", un promemoria collettivo (un pò come l'angolo dei cuochi di altre sezioni).
    E' chiaro che il thread non è mio, è di tutti coloro che vorranno e potrannio dare il proprio contributo (mi riservo un pò di post che cederò volentieri in seguito).


    INDICE


    HEX TO SMALI

    KEYBOARD SHORT DELAY

    AUMENTARE LUMINOSITA' E NITIDEZZA DELLA STATUS BAR

    ELIMINARE I MARGINI DEL DIALER

    AGGIUNGERE UN PNG COME SFONDO DELLE NOTIFICHE DELLA TENDINA

    COME CREARE E COMPILARE UN CUSTOM KERNEL

    TASTI SOFT KEY

    COME METTERE IL CLOCK AL CENTRO

    TEMARE LA BATTERIA

    DISABILITARE SMS, MMS E EMAIL NEL REGISTRO DELLE CHIAMATE

    INSERIRE APPLICAZIONI NELLE IMPOSTAZIONI

    Per prima cosa riporto una guida che avevo scritto tempo fa nella sezione Note 1. Molti sanno già come si decompila un'apk, ma per chi si approccia ora al modding potrebbe essere utile

    DECOMPILARE E RICOMPILARE

    Per semplificare la decompilazione/ricompilazione degli apk, ho messo insieme, adattandoli, vari tool.
    Ecco una breve guida su come usarli.

    Per prima cosa installiamo Java Development Kit (Link) e settiamo la path "C:\Programmi\Java\jdk1.7.0_XX\bin" (XX sta per il vostro update) in "Risorse del computer/Proprietà/Avanzate/Variabili d'ambiente/Variabili di sistema".

    Quindi assicuriamoci che sul nostro dispositivo sia attivata la spunta su Impostazioni/Opzioni sviluppatore/Debug USB, colleghiamo il telefono al pc tramite cavo usb e clicchiamo prima sul file pull_framework.bat e poi su pull_twframework.bat:




    Non si sta facendo altro che estrarre il framework-res.apk e il twframework-res.apk dal nostro telefono per copiarli nella cartella tools/framework.
    Non preoccupatevi se vi dovesse comparire la scritta “remount failed: Operation non permitted”, vuol dire che adb.exe è già attivo. Aspettiamo che si chiuda la finestra dos e proseguiamo.




    Cliccando su set_framework-res e su set_twframework-res andiamo ad impostare i files necessari ad apktool sotto C:\Documents and Settings\UTENTE\apktool.




    Fatto questo associamo l’estensione .apk al tool di decompilazione attraverso il bat shell-add (ovviamente shell-remove serve a tornare indietro). Noterete che l’icona degli apk verrà modificata: per decompilare vi basterà cliccarci sopra o selezionare “Decompile APK” dal menu contestuale.


    Finita la decompilazione vi verrà aperto automaticamente il tool Java Decompiler, che vi aiuterà a muovervi più agevolmente tra gli java dell’apk decompilata (nel caso vogliate metterci mano :o). Se non vi interessa chiudete pure.




    Nella stessa cartella dell’apk troverete la cartella NOMEAPK_decompiled. Fate le vostre modifiche e ricompilate tramite il comando “Recompile APK from source”.




    Per signare il nostro apk modificato, clicchiamo su sign.bat per lanciare il programma Sign+.
    Andiamo su “file/change keys” e andiamo a caricare publickey.x509.pem e privatekey.pk8 presenti nella cartella tools/sign e clicchiamo su ok.




    A questo punto siamo pronti per signare: trasciniamo l’apk all’interno della finestra del programma e clicchiamo su “sign files”. Alla fine ci troveremo un nuovo file VOSTROAPK_signed.

    N.B.: nel caso di apk di sistema, anziché signare, il mio consiglio è quello di trascinare l'xml modificato dal vostro apk ricompilato dentro l'apk originario, sovrascrivendo il precedente.


    Ecco come si presenterà l'apk decompilato:



    Una volta ricompilato, le modifiche apportate agli smali anDranno a finire nel file classes.dex, mentre quelle apportate alla cartella res/values in resources.arsc.



    DOWNLOAD: https://app.box.com/s/5l2i8apgcjjzbxnoor9a
    Ultima modifica di giuros77; 09-08-13 alle 07:04

  2. I seguenti 12 Utenti hanno ringraziato giuros77 per il post:

    8thphloor (01-08-13),bn1540 (31-07-13),crisgen (31-07-13),darboc (31-07-13),irlanda3 (11-08-13),Janobifronte (31-07-13),japoco_poz14 (31-07-13),Paolone46 (31-07-13),Picciotto (31-07-13),sodocacai (22-08-13),umberto1978 (01-08-13),unname (31-07-13)

  3.  
  4. #2
    Androidiano VIP L'avatar di giuros77


    Registrato dal
    Feb 2012
    Località
    http://goo.gl/jhH3w
    Messaggi
    2,152
    Smartphone
    SGN2

    Ringraziamenti
    1,206
    Ringraziato 2,200 volte in 987 Posts
    Predefinito

    HEX TO SMALI

    Molti di voi che si divertono a cambiare i colori del proprio terminale sanno dove andare a mettere le mani(mi riferisco a colors.xml, drawables.xml e styles.xml nella cartella values).
    Ma non sempre è così semplice: a volte, quando si tratta di "immagini animate", bisogna andare a modificare i codici dei colori sui files .smali.
    Vi riporto l'esempio pratico del tasto circolare del SecPhone.apk (io ho voluto cambiare il colore di quello di risposta da verde a blu).

    Ci servono:

    Notepad++: Notepad++ v6.4.3 - Current Version
    Smali syntax highlighting per Notepad: https://app.box.com/s/f0di3w2hef48u4fg4d28 (va importato da view/user-defined dialog/import/save as e poi scelto dal menu language)
    Android Color Converter: https://app.box.com/s/3tkavyf3s2vnxeoqquii
    ColorPix free: ColorSchemer | Download ColorSchemer software


    Una volta decompilata l'apk, andiamo in smali\com\android\phone e apriamo con Notepad++ i file CallReminderWidget$Handle.smali e IncomingCallWidget$Handle.smali
    Qui dobbiamo andare a modificare mCircleColor.


    CallReminderWidget$Handle.smali:
    codice:
        .line 434
        const v4, -0x9e5eeb
    
        iput v4, p0, Lcom/android/phone/CallReminderWidget$Handle;->mCircleColor:I
    
        goto :goto_0

    IncomingCallWidget$Handle.smali :
    codice:
    	
        .line 430
        :goto_0
        const v5, -0x9e5eeb
    
        iput v5, p0, Lcom/android/phone/IncomingCallWidget$Handle;->mCircleColor:I

    Potete verificare il colore con Android Color Converter:




    A questo punto non vi rimane altro da fare che cambiare il codice da -0x9e5eeb a -0xcc4a1a.

    CallReminderWidget$Handle.smali:
    codice:
        .line 434
        const v4, -0xcc4a1a
    
        iput v4, p0, Lcom/android/phone/CallReminderWidget$Handle;->mCircleColor:I
    
        goto :goto_0

    IncomingCallWidget$Handle.smali :
    codice:
    	
        .line 430
        :goto_0
        const v5, -0xcc4a1a
    
        iput v5, p0, Lcom/android/phone/IncomingCallWidget$Handle;->mCircleColor:I



    Nel mio caso sapevo già il codice esadecimale del colore che mi interessava mettere. Se non lo sapete e volete mettere lo stesso colore che avete dato alla cornetta telefonica, vi viene in aiuto colorPix.
    Basta trascinare il mouse sul colore che volete ottenere, cliccare un qualsiasi tasto della tastiera, poi CTRL+C per copiarlo e CTRL+V per incollarlo su Android converter.




    Una volta ricompilata l'apk, utilizzate il nuovo classe.dex sul vostro SecPhone.apk
    Ultima modifica di giuros77; 31-07-13 alle 13:05

  5. I seguenti 11 Utenti hanno ringraziato giuros77 per il post:

    8thphloor (01-08-13),bn1540 (31-07-13),Brrmatteo (14-11-13),crisgen (31-07-13),irlanda3 (11-08-13),Janobifronte (31-07-13),japoco_poz14 (31-07-13),Paolone46 (31-07-13),Picciotto (31-07-13),umberto1978 (01-08-13),unname (31-07-13)

  6. #3
    Androidiano VIP L'avatar di giuros77


    Registrato dal
    Feb 2012
    Località
    http://goo.gl/jhH3w
    Messaggi
    2,152
    Smartphone
    SGN2

    Ringraziamenti
    1,206
    Ringraziato 2,200 volte in 987 Posts
    Predefinito

    KEYBOARD SHORT DELAY

    Per diminuire la pressione lunga sulla tastiera samsung (da 500ms a 200ms) decompiliamo SamsungIME.apk e andiamo ad aprire PointerTracker.smali in smali\com\diotek\ime\framework\view\tracker.
    Qui andrà modificato il parametro di getLongpressTimoutDelay:



    Sostituiamo 0x1f4 (in marrone) con 0xc8:

    codice:
    .method private getLongpressTimoutDelay(I)J
        .locals 3
        .parameter "keyCode"
    
        .prologue
        .line 507
        const/16 v0, 0xc8
    
        .line 508
        .local v0, delay:I
        packed-switch p1, :pswitch_data_0
    
        .line 513
        const/16 v0, 0xc8
    
        .line 516
        :goto_0
        int-to-long v1, v0
    
        return-wide v1
    
        .line 510
        :pswitch_0
        const/16 v0, 0xc8
    
        .line 511
        goto :goto_0
    
        .line 508
        :pswitch_data_0
        .packed-switch -0x7a
            :pswitch_0
        .end packed-switch
    .end method
    Ricompiliamo e usiamo il classes.dex nella nostra apk.
    Ultima modifica di giuros77; 31-07-13 alle 20:48

  7. I seguenti 9 Utenti hanno ringraziato giuros77 per il post:

    bn1540 (31-07-13),crisgen (31-07-13),irlanda3 (11-08-13),Janobifronte (31-07-13),japoco_poz14 (31-07-13),Paolone46 (31-07-13),Picciotto (31-07-13),umberto1978 (01-08-13),unname (31-07-13)

  8. #4
    Androidiano VIP L'avatar di giuros77


    Registrato dal
    Feb 2012
    Località
    http://goo.gl/jhH3w
    Messaggi
    2,152
    Smartphone
    SGN2

    Ringraziamenti
    1,206
    Ringraziato 2,200 volte in 987 Posts
    Predefinito

    AUMENTARE LUMINOSITA' E NITIDEZZA DELLA STATUS BAR (grazie a jguana)

    Decompiliamo SystemUI.apk e apriamo values/dimens.xml

    Cambiamo questi valori:
    codice:
        <item type="dimen" name="tw_status_bar_icon_size_scale">85.0%</item>
        <item type="dimen" name="status_bar_icon_drawing_alpha">65.0%</item>
        <item type="dimen" name="tw_status_bar_icon_drawing_alpha">50.0%</item>
    In:
    codice:
    	<item type="dimen" name="tw_status_bar_icon_size_scale">79.99999%</item>
        <item type="dimen" name="status_bar_icon_drawing_alpha">100.0%</item>
        <item type="dimen" name="tw_status_bar_icon_drawing_alpha">100.0%</item>
    Ricompiliamo ed utilizziamo il file resources.arsc nella nostra apk
    Ultima modifica di giuros77; 31-07-13 alle 12:57

  9. I seguenti 8 Utenti hanno ringraziato giuros77 per il post:

    8thphloor (01-08-13),crisgen (31-07-13),irlanda3 (11-08-13),Janobifronte (31-07-13),japoco_poz14 (31-07-13),Paolone46 (31-07-13),Picciotto (31-07-13),unname (31-07-13)

  10. #5
    Androidiano VIP L'avatar di giuros77


    Registrato dal
    Feb 2012
    Località
    http://goo.gl/jhH3w
    Messaggi
    2,152
    Smartphone
    SGN2

    Ringraziamenti
    1,206
    Ringraziato 2,200 volte in 987 Posts
    Predefinito

    ELIMINARE I MARGINI AL DIALER

    Decompiliamo SecContacts.apk e andiamo in res/layout-sw359dp-xhdpi.

    Apriamo il file dialpad.xml e apportiamo queste modifiche:

    codice:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout android:orientation="vertical" android:id="@id/dialpad" android:background="@drawable/dialer_bg_p_01" android:visibility="visible" android:clickable="true" android:layout_width="359.0dip" android:layout_height="256.0dip" android:layout_marginLeft="0.0dip" android:layout_marginTop="9.0dip" android:hapticFeedbackEnabled="true"
      xmlns:android="http://schemas.android.com/apk/res/android">
        <LinearLayout android:orientation="horizontal" android:id="@id/onetwothree" android:layout_width="359.0dip" android:layout_height="61.0dip">
            <ImageButton android:id="@id/one" android:background="@drawable/call_dial_btn_bg" android:nextFocusLeft="@id/three" android:nextFocusRight="@id/two" android:layout_width="117.0dip" android:layout_height="61.0dip" android:scaleType="fitXY" android:soundEffectsEnabled="false" android:contentDescription="@string/description_image_button_one" />
            <ImageButton android:id="@id/two" android:background="@drawable/call_dial_btn_bg" android:nextFocusLeft="@id/one" android:nextFocusRight="@id/three" android:layout_width="117.0dip" android:layout_height="61.0dip" android:layout_marginLeft="4.0dip" android:src="@drawable/call_dial_btn_02" android:scaleType="fitXY" android:soundEffectsEnabled="false" android:contentDescription="@string/description_image_button_two" />
            <ImageButton android:id="@id/three" android:background="@drawable/call_dial_btn_bg" android:nextFocusLeft="@id/two" android:nextFocusRight="@id/one" android:layout_width="117.0dip" android:layout_height="61.0dip" android:layout_marginLeft="4.0dip" android:src="@drawable/call_dial_btn_03" android:scaleType="fitXY" android:soundEffectsEnabled="false" android:contentDescription="@string/description_image_button_three" />
        </LinearLayout>
        <LinearLayout android:orientation="horizontal" android:id="@id/fourfivesix" android:focusable="false" android:focusableInTouchMode="false" android:clickable="false" android:layout_width="359.0dip" android:layout_height="61.0dip" android:layout_marginTop="4.0dip">
            <ImageButton android:id="@id/four" android:background="@drawable/call_dial_btn_bg" android:nextFocusLeft="@id/six" android:nextFocusRight="@id/five" android:clickable="false" android:layout_width="117.0dip" android:layout_height="61.0dip" android:src="@drawable/call_dial_btn_04" android:scaleType="fitXY" android:soundEffectsEnabled="false" android:contentDescription="@string/description_image_button_four" />
            <ImageButton android:id="@id/five" android:background="@drawable/call_dial_btn_bg" android:nextFocusLeft="@id/four" android:nextFocusRight="@id/six" android:clickable="false" android:layout_width="117.0dip" android:layout_height="61.0dip" android:layout_marginLeft="4.0dip" android:src="@drawable/call_dial_btn_05" android:scaleType="fitXY" android:soundEffectsEnabled="false" android:contentDescription="@string/description_image_button_five" />
            <ImageButton android:id="@id/six" android:background="@drawable/call_dial_btn_bg" android:nextFocusLeft="@id/five" android:nextFocusRight="@id/four" android:clickable="false" android:layout_width="117.0dip" android:layout_height="61.0dip" android:layout_marginLeft="4.0dip" android:src="@drawable/call_dial_btn_06" android:scaleType="fitXY" android:soundEffectsEnabled="false" android:contentDescription="@string/description_image_button_six" />
        </LinearLayout>
        <LinearLayout android:orientation="horizontal" android:id="@id/seveneightnine" android:focusable="false" android:focusableInTouchMode="false" android:clickable="false" android:layout_width="359.0dip" android:layout_height="61.0dip" android:layout_marginTop="4.0dip">
            <ImageButton android:id="@id/seven" android:background="@drawable/call_dial_btn_bg" android:nextFocusLeft="@id/nine" android:nextFocusRight="@id/eight" android:clickable="false" android:layout_width="117.0dip" android:layout_height="61.0dip" android:src="@drawable/call_dial_btn_07" android:scaleType="fitXY" android:soundEffectsEnabled="false" android:contentDescription="@string/description_image_button_seven" />
            <ImageButton android:id="@id/eight" android:background="@drawable/call_dial_btn_bg" android:nextFocusLeft="@id/seven" android:nextFocusRight="@id/nine" android:clickable="false" android:layout_width="117.0dip" android:layout_height="61.0dip" android:layout_marginLeft="4.0dip" android:src="@drawable/call_dial_btn_08" android:scaleType="fitXY" android:soundEffectsEnabled="false" android:contentDescription="@string/description_image_button_eight" />
            <ImageButton android:id="@id/nine" android:background="@drawable/call_dial_btn_bg" android:nextFocusLeft="@id/eight" android:nextFocusRight="@id/seven" android:clickable="false" android:layout_width="117.0dip" android:layout_height="61.0dip" android:layout_marginLeft="4.0dip" android:src="@drawable/call_dial_btn_09" android:scaleType="fitXY" android:soundEffectsEnabled="false" android:contentDescription="@string/description_image_button_nine" />
        </LinearLayout>
        <LinearLayout android:orientation="horizontal" android:id="@id/starzeropound" android:focusable="false" android:focusableInTouchMode="false" android:clickable="false" android:layout_width="359.0dip" android:layout_height="61.0dip" android:layout_marginTop="4.0dip">
            <ImageButton android:id="@id/star" android:background="@drawable/call_dial_btn_bg" android:nextFocusLeft="@id/pound" android:nextFocusRight="@id/zero" android:clickable="false" android:layout_width="117.0dip" android:layout_height="61.0dip" android:src="@drawable/call_dial_btn_10" android:scaleType="fitXY" android:soundEffectsEnabled="false" android:contentDescription="@string/description_image_button_star" />
            <ImageButton android:id="@id/zero" android:background="@drawable/call_dial_btn_bg" android:nextFocusLeft="@id/star" android:nextFocusRight="@id/pound" android:clickable="false" android:layout_width="117.0dip" android:layout_height="61.0dip" android:layout_marginLeft="4.0dip" android:src="@drawable/call_dial_btn_12" android:scaleType="fitXY" android:soundEffectsEnabled="false" android:contentDescription="@string/description_image_button_zero" />
            <ImageButton android:id="@id/pound" android:background="@drawable/call_dial_btn_bg" android:nextFocusLeft="@id/zero" android:nextFocusRight="@id/star" android:clickable="false" android:layout_width="117.0dip" android:layout_height="61.0dip" android:layout_marginLeft="4.0dip" android:src="@drawable/call_dial_btn_11" android:scaleType="fitXY" android:soundEffectsEnabled="false" android:contentDescription="@string/description_image_button_pound" />
        </LinearLayout>
    </LinearLayout>
    Ora apriamo dialpad_additional_buttons.xml (i tasti in basso).
    Modifichiamolo le dimensioni in questo modo:

    codice:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout android:orientation="horizontal" android:id="@id/dialpadAdditionalButtons" android:background="@drawable/dialer_bg_p_02" android:layout_width="359.0dip" android:layout_height="73.0dip" android:layout_marginLeft="0.0dip" android:layout_marginTop="4.0dip"
      xmlns:android="http://schemas.android.com/apk/res/android">
        <ImageButton android:id="@id/videocallbutton" android:background="@drawable/call_dial_btn_bg" android:layout_width="117.0dip" android:layout_height="73.0dip" android:src="@drawable/call_contacts_icon" android:scaleType="fitXY" android:contentDescription="@string/title_video_call" />
        <ImageButton android:id="@id/messagebutton" android:background="@drawable/call_dial_btn_bg" android:visibility="gone" android:layout_width="117.0dip" android:layout_height="73.0dip" android:src="@drawable/call_message_icon" android:scaleType="fitXY" android:contentDescription="@string/send_message" />
        <ImageButton android:id="@id/callbutton" android:background="@drawable/call_dial_btn_bg" android:layout_width="117.0dip" android:layout_height="73.0dip" android:layout_marginLeft="4.0dip" android:src="@drawable/call_outgoingcall_icon" android:scaleType="fitXY" android:contentDescription="@string/call" />
        <ImageButton android:id="@id/deleteButton" android:background="@drawable/call_dial_btn_bg" android:layout_width="117.0dip" android:layout_height="73.0dip" android:layout_marginLeft="4.0dip" android:src="@drawable/call_clear_btn" android:scaleType="fitXY" android:contentDescription="@string/description_delete_button" />
    </LinearLayout>
    Ultima modifica di giuros77; 31-07-13 alle 20:46

  11. I seguenti 10 Utenti hanno ringraziato giuros77 per il post:

    8thphloor (01-08-13),crisgen (31-07-13),FN6 (31-07-13),irlanda3 (11-08-13),Janobifronte (31-07-13),japoco_poz14 (31-07-13),Paolone46 (31-07-13),Picciotto (31-07-13),umberto1978 (01-08-13),unname (31-07-13)

  12. #6
    Androidiano VIP L'avatar di giuros77


    Registrato dal
    Feb 2012
    Località
    http://goo.gl/jhH3w
    Messaggi
    2,152
    Smartphone
    SGN2

    Ringraziamenti
    1,206
    Ringraziato 2,200 volte in 987 Posts
    Predefinito

    AGGIUNGERE UN PNG COME SFONDO DELLE NOTIFICHE DELLA TENDINA

    Creamo la nostra png (meglio se 9.png), che per comodità chiamerò "sfondo"
    Decompiliamo il SystemUI.apk e andiamo a copiare sfondo.9.png nella cartella drawable.
    Nella solita cartella apriamo il file tw_notification_row_bg.xml:

    codice:
        <item android:state_pressed="true" android:drawable="@drawable/tw_notification_background_pressed" />
        <item android:state_focused="true" android:drawable="@*android:drawable/list_focused_holo" />
        <item android:state_pressed="false" android:drawable="@drawable/tw_notification_background_null" />
    Invece di tw_notification_background_null mettiamo la nostra immagine:

    codice:
        <item android:state_pressed="true" android:drawable="@drawable/tw_notification_background_pressed" />
        <item android:state_focused="true" android:drawable="@*android:drawable/list_focused_holo" />
        <item android:state_pressed="false" android:drawable="@drawable/sfondo" />
    A questo punto apriamo values/ids.xml e aggiungiamo:
    codice:
    	<item type="id" name="sfondo">false</item>
    Apriamo values/public.xml e aggiungiamo la voce "sfondo" anche qui, assegnandole un id preso tra quelli contrassegnate dalla stringa name="APKTOOL_DUMMY (ovviamente l'apktool_dummy con lo stesso id va cancellato):

    codice:
    <public type="drawable" name="sfondo" id="0x7f020090" />
    La solita procedura può essere ripetuta per tw_notification_background_pressed.
    Ricompiliamo e utilizziamo sfondo.9.png, tw_notification_row_bg.xml e resources.arsc nel nostro SystemUI.apk
    Ultima modifica di giuros77; 31-07-13 alle 15:32

  13. I seguenti 9 Utenti hanno ringraziato giuros77 per il post:

    8thphloor (01-08-13),crisgen (31-07-13),FN6 (31-07-13),Janobifronte (31-07-13),japoco_poz14 (31-07-13),Paolone46 (31-07-13),Picciotto (31-07-13),umberto1978 (01-08-13),unname (31-07-13)

  14. #7
    Androidiano VIP L'avatar di giuros77


    Registrato dal
    Feb 2012
    Località
    http://goo.gl/jhH3w
    Messaggi
    2,152
    Smartphone
    SGN2

    Ringraziamenti
    1,206
    Ringraziato 2,200 volte in 987 Posts
    Predefinito

    riservato 2
    Ultima modifica di giuros77; 31-07-13 alle 12:55

  15. I seguenti 7 Utenti hanno ringraziato giuros77 per il post:

    crisgen (31-07-13),FN6 (31-07-13),Janobifronte (31-07-13),japoco_poz14 (31-07-13),Paolone46 (31-07-13),umberto1978 (01-08-13),unname (31-07-13)

  16. #8
    Androidiano VIP L'avatar di giuros77


    Registrato dal
    Feb 2012
    Località
    http://goo.gl/jhH3w
    Messaggi
    2,152
    Smartphone
    SGN2

    Ringraziamenti
    1,206
    Ringraziato 2,200 volte in 987 Posts
    Predefinito

    riservato anche questo

  17. I seguenti 7 Utenti hanno ringraziato giuros77 per il post:

    crisgen (31-07-13),FN6 (31-07-13),Janobifronte (31-07-13),japoco_poz14 (31-07-13),Paolone46 (31-07-13),umberto1978 (01-08-13),unname (31-07-13)

  18. #9
    Androidiano VIP L'avatar di umberto1978


    Registrato dal
    Aug 2011
    Località
    Sicilia
    Messaggi
    1,667
    Smartphone
    Nexus 4

    Ringraziamenti
    666
    Ringraziato 1,981 volte in 737 Posts
    Predefinito

    COME CREARE E COMPILARE UN CUSTOM KERNEL

    Questa parte proveremo a dedicarla alla compilazione di un immagine kernel (ovviamente compatibile con Note II).

    PREMESSE

    Doverosa premessa: non è una guida ovviamente su come diventare esperti sviluppatori, primo perchè chi scrive non è assolutamente all'altezza di farlo e secondo perchè la strada è lunga e tortuosa. Sviluppare è in realtà un termine improprio quando si parla di kernel (e restringere il campo al solo ecosistema android è errato e limitante): chi lavora sui sorgenti deve avere delle nozioni anche basilari di programmazione principalmente sul linguaggio C e C++, non esistono in giro molti "how to" e le guide che si trovano in rete sono spesso molto generiche e non mirate ad un device specifico, soprattutto perchè Linux non è solo Android, ma molto molto di più.
    Nel corso della discussione verranno tuttavia trattati alcuni aspetti legati alla personalizzazione e alla modifica del codice sorgente (purtroppo questo passaggio è necessario, dato che i sorgenti così come forniti da Samsung sono afflitti da alcuni errori di gravità assolutamente non trascurabile: exynos exploit e Sudden death syndrome su tutti) nonchè aspetti legati alle tecniche di patching (modifica al volo del codice sorgente mediante file diff o patch) o aspetti legati alla creazione di programmi (bash shell script) per eseguire operazioni semplici o complesse sia durante le fasi di boot dell'immagine compilata che durante la compilazione stessa, fino ad arrivare alla compilazione completa e al flash del kernel.

    REQUISITI HARDWARE E SOFTWARE
    Ecco quello che uso io:

    - Una macchina con una distribuzione Linux, nel mio caso sappiate che sto operando con un laptop vecchio di 4 anni: Sistema operativo Ubuntu 12.04 LTS, sistema a 64bit, 2 gigabyte di ram e processore dualcore a 2 ghz di frequenza massima.
    Con questa configurazione che è decisamente SCADENTE riesco a compilare senza problemi lo zImage e relativi moduli in circa 20 minuti.
    Considerateli come requisiti hardware minimi.

    Dal punto di vista software va benissimo anche un'installazione Ubuntu su una partizione secondaria (tipico esempio: Wubi, cercate su google. E' il modo più semplice per avere una partizione in dual boot con Ubuntu, fra l'altro la distribuzione è completa di tutti i requisiti necessari alla compilazione tranne per quel che riguarda qualche libreria che vedremo in seguito come installare).

    Evitate come la peste le macchine virtuali, a meno che non abbiate una bestia come PC.

    NOTA: molti di voi si staranno chiedendo se è possibile compilare un kernel con windows direttamente, senza passare per virtual box o Ubuntu. La risposta è ambigua: esistono dei compilatori incrociati che sono assemblati per funzionare con windows (e ovviamente cygwin) ma sono sperimentali e molto ma molto meno efficienti del corrispettivo Linux. E dato che non sono molto diffusi tra i developers, non godono nemmeno di adeguato supporto. In altre parole è preferibile puntare su Linux piuttosto che addentrarsi in percorsi poco battuti senza poter contare sull'aiuto di nessuno, perdereste molto più tempo.


    1- UTILIZZO DEL TERMINALE


    Una delle applicazioni più utilizzate in ambiente Linux è il terminale, che torna utile se non indispensabile per effettuare i vari passaggi necessari alla compilazione di un kernel.



    Dovrete farci l'abitudine semplicemente perchè i comandi Unix e GNU non sono disponibili attraverso una GUI, ma sono richiamabili solo da terminale attraverso una semplice stringa di comando.
    Una volta presa confidenza con il terminale vi garantisco che non tornerete più indietro.

    Per avviare una sessione terminale basta usare la combinazione di tasti

    codice:
    CTRL(sx) + ALT + T
    2- COMPLETAMENTO DELLA CONFIGURAZIONE DI LINUX


    Il primo passo da fare è configurare Linux installando alcune librerie aggiuntive, come detto in precedenza.

    Avviamo una sessione terminale e digitiamo il comando:

    codice:
    sudo apt-get install libncurses5-dev
    Il comando prevede un azione super user "sudo" (su linux dovremo autenticarci ogni volta dovremo installare o rimuovere pacchetti, librerie o programmi) e vi verrà richiesta la vostra password (l'avrete creata alla prima installazione di Linux/Ubuntu) per l'installazione delle librerie.


    3- STRUTTURA DELLA CARTELLA DI LAVORO


    Per rendere il vostro lavoro semplice vi consiglio di impostare correttamente la vostra postazione di lavoro, utilizzando uno schema molto semplice.

    Potrete utilizzare qualunque percorso vi aggradi ma dovrete poi ricordarvi tutti i percorsi senza difficoltà per rendere il flusso di lavoro fluente e senza intoppi, quindi se possibile utilizzate per le cartelle solo nomi semplici e senza spazi o caratteri speciali.

    Cominciamo con l'avviare una sessione terminale.

    Noterete che sarete indirizzati al percorso di default che è
    codice:
    nome_utente@ubuntu:~$
    In altre parole...la vostra Home.

    E cominceremo da qui: creeremo una cartella direttamente nella nostra home che chiameremo ad esempio "android" tanto per semplificarci la vita.

    Digitiamo il seguente comando

    codice:
    mkdir android
    Adesso spostiamoci all'interno della nuova cartella sempre usando il terminale, con il comando:

    codice:
    cd android
    Una volta dentro creiamo delle sottocartelle con il comando utilizzato in precedenza

    codice:
    mkdir source
    Questo creerà una cartella chiamata "source" all'interno della quale metteremo i sorgenti del kernel, una volta scaricati.

    NOTA: Non perdo tempo dicendo che una volta preso confidenza con i comandi terminale potrete procedre ancora più speditamente. Un esempio? Avremmo potuto creare la cartella "source" senza per forza spostarci prima in "android".

    codice:
    mkdir /home/nome_utente/android/source
    Questo comando avrebbe creato la cartella "source" direttamente e da qualunque percorso vi sareste trovati in quell'istante e soprattutto all'esatto percorso indicato dal comando.


    4- PROCURARSI UNA TOOLCHAIN ADATTA ALLO SCOPO


    Con il termine toolchain si indica letteralmente "catena di attrezzi" o semplicemente compilatore incrociato. E' in parole povere un insieme di programmi (eseguibili) compilati a loro volta e che servono a compilare correttamente un'immagine partendo da codice sorgente e librerie codificate.
    Per compilare un immagine che si suppone debba girare su un device android dovremo utilizzare una toolchain dedicata all'architettura del terminale di destinazione, quindi dobbiamo stare attenti a quale compilatore utilizziamo.
    Io utilizzo attualmente una toolchain Linaro 4.6.3, la trovate QUI

    Scaricatela e copiate l'archivio nella cartella "android" che abbiamo creato in precedenza. Per farlo potrete utilizzare il nautilus, il file explorer di default di Ubuntu.

    Scompattate l'archivio e settate i permessi della cartella ottenuta, che dovrebbe chiamarsi "android-toolchain-eabi" come da screen shot allegato: (tasto destro destro del mouse e proprietà, tab permessi)



    Assicuratevi che ci sia la spunta nella casella "Allow executing files as programs" e applicate la proprietà a tutti i sotto percorsi.

    Il passo successivo è la configurazione della toolchain: dovrete aggiungere una variabile di sistema indicante il percorso della vostra toolchain ad un file a cui accede Linux in particolari occasioni.

    Da terminale digitate il comando:

    codice:
    gedit ~/.bashrc
    Il comando non fa altro che dire a Linux di aprire un file chiamato ".bashrc" situato al percorso "~/" che è la root di Linux, utilizzando il programma gedit, un semplice editor di testo paragonabile a Notepad++.

    Rechiamoci alla fine del file in oggetto ed aggiungiamo la stringa

    codice:
    PATH=$PATH:~/android/android-toolchain-eabi/bin
    NOTA: il percorso parla da solo. Il cuore di tutta l'operazione è situata dentro alla cartella "bin" a sua volta dentro la cartella "android-toolchain-eabi" ottenuta dalla scompattazione della toolchain scaricata in precedenza, a sua volta contenuta nella cartella da noi creata "android".
    Chiaro, no?

    Salviamo e chiudiamo Gedit.

    5a- IL CODICE SORGENTE

    A questo punto possiamo scaricare il codice sorgente. Potreste utilizzare come sorgente un codice di un custom kernel esistente come quella cagata dello SpeedWizz kernel, ma vi toglierei il piacere di fare delle modifiche "originali" ad un sorgente stock, quindi procureremo il codice direttamente da Samsung, ci divertiremo di più

    Li trovate QUI

    Assicuratevi di scaricare quelli corretti per la versione internazionale - il file corretto è "GT-N7100_JB_Opensource_Update2.zip"

    Una volta scaricato il file scompattatelo fino ad ottenere quello che vedete nello screen


    Scompattate adesso l'archivio kernel.tar.gz fino ad ottenere una cartella "kernel" come da immagine sotto


    Adesso non dovrete fare altro che copiare il contenuto della cartella "kernel" dentro cartella "source" creata in precedenza. E' consigliabile come al solito settare i permessi per rendere eseguibili i files contenuti all'interno delle sottocartelle utilizzando il metodo visto in precedenza.

    Dovreste ottenere qualcosa di simile allo screen sotto

    [CENTER]

    ....Continua al post successivo....
    Ultima modifica di umberto1978; 31-07-13 alle 18:29
    codice:
    These mist covered mountains, are a home now for me 
    But my home is the lowlands, and always will be 
    Some day you'll return to your valleys and your farms 
    And you'll no longer burn to be brothers in arm

  19. I seguenti 13 Utenti hanno ringraziato umberto1978 per il post:

    8thphloor (01-08-13),bluflight13 (30-10-13),bn1540 (31-07-13),crisgen (31-07-13),darboc (31-07-13),FN6 (31-07-13),giuros77 (31-07-13),Janobifronte (31-07-13),japoco_poz14 (31-07-13),Paolone46 (31-07-13),Picciotto (31-07-13),sodocacai (22-08-13),unname (31-07-13)

  20. #10
    Androidiano VIP L'avatar di umberto1978


    Registrato dal
    Aug 2011
    Località
    Sicilia
    Messaggi
    1,667
    Smartphone
    Nexus 4

    Ringraziamenti
    666
    Ringraziato 1,981 volte in 737 Posts
    Predefinito

    5b- IL CODICE SORGENTE


    Adesso occorre configurare alcuni parametri di alcuni files critici contenuti nei sorgenti.

    Utilizzando il Nautilus rechiamoci all'interno della cartella "source" e clicchiamo con il tasto destro del mouse nel file chiamato "Makefile" e selezionamo "apri con un editor di testo".

    Il Makefile generale (se sbirciate dentro alle cartelle del resto dei sorgenti ne troverete di altri) è quello contenuto nella directory root del codice sorgente, contiene le "regole" che il compiler seguirà pedissequamente durante la compilazione del kernel. La prima cosa da settare è il parametro di dimensione dei moduli. Il Note II come tutti i device android ha uno spazio dedicato per contenere il kernel: se le dimensioni del kernel eccedono tale spazio (partizione) il kernel non potrà esservi scritto. Per fare in modo che le dimensioni non eccedano lo spazio a disposizione va settato un parametro. Vediamo come.

    Dal Gedit in esecuzione con il nostro Makefile aperto cerchiamo la stringa

    codice:
    LDFLAGS_MODULE
    e sostituiamola con quanto segue

    codice:
    LDFLAGS_MODULE  = --strip-debug
    Faremo in modo che in fase di compilazione i moduli vengano creati con una dimensione notevolmente inferiore, evitando così che il kernel finale non ecceda in dimensioni.

    Seconda cosa da settare sempre nel Makefile sono i parametri del cross compiler. Cerchiamo la stringa

    codice:
    /opt/toolchains/arm-eabi-4.4.3/bin/arm-eabi-
    e sostituiamola con quella corretta contentente il percorso reale del nostro compilatore

    codice:
    CROSS_COMPILE= /home/nome_utente/android/android-toolchain-eabi/bin/arm-eabi-
    Ovviamente faccio riferimento a quelle cartelle che abbiamo creato in precedenza, giusto per semplificare il tutto. Se cambiate qualcosa nella struttura ricordatevi di aggiornare anche il resto.

    Per modificare il nome dell'immagine finale del kernel dobbiamo recarci al percorso /home/android/source/scripts e cercare un file chiamato "mkcompile_h".
    Apriamolo con Gedit e cerchiamo la stringa

    codice:
    echo \#define LINUX_COMPILE_BY \"`echo $LINUX_COMPILE_BY | $UTS_TRUNCATE`\"
    echo \#define LINUX_COMPILE_HOST \"`echo $LINUX_COMPILE_HOST | $UTS_TRUNCATE`\"
    Sostituiamole con quanto segue

    codice:
    #  echo \#define LINUX_COMPILE_BY \"`echo $LINUX_COMPILE_BY | $UTS_TRUNCATE`\"
    #  echo \#define LINUX_COMPILE_HOST \"`echo $LINUX_COMPILE_HOST | $UTS_TRUNCATE`\"
      echo \#define LINUX_COMPILE_BY \"umberto1978\"
      echo \#define LINUX_COMPILE_HOST \"SpeedWizz-N2-v1.0.0\"
    Ovviamente al posto di Umberto1978 dovrete inserire il vostro nome utente e alla voce Speedwizz-N2-blah-blah-blah dovrete mettere il nome del vostro kernel.
    Noterete che i cancelletti # sono caratteri speciali nel bash shell scripting. Analogamente al carattere '/' nel linguaggio C e C++ permettono infatti di trasformare una linea di codice in un commento (neutralizzando di fatto il comando stesso). Questo vi permetterà ad esempio di inserire un commento esplicativo qualora introduceste una modifica nel codice sorgente, consentendo ad un altro developer di capire perchè ad esempio avete apportato quella determinata modifica.

    Aggiungo che la versione kernel è opportuno che venga cambiata prima di ogni compilazione per ovvi motivi. (soprattutto per non fare confusione )

    Salvate le modifiche e chiudete Gedit.

    6- LA COMPILAZIONE


    Siamo pronti per eseguire la compilazione. Se avete fatto tutto come descritto e se io non ho scritto minchiate tutto dovrebbe procedere secondo programma ed a breve otterete un kernel pronto per essere iniettato nel vostro dispositivo

    Resettate il cervello ed avviate il terminale (se lo doveste aver chiuso)

    Recatevi al percorso dove avete archiviato i vostri sorgenti (che da ora in poi chiameremo work tree) con il comando

    codice:
    cd android/source
    Per prima cosa utilizzaremo due comandi GNU Make che eseguiranno pulizia e inizializzazione dei sorgenti.

    codice:
    make clean
    date invio e attendete. Successivamente date il comando

    codice:
    make mrproper
    Anche qui dovrete attendere qualche istante.

    NOTE: I comandi
    codice:
    make clean
    e
    codice:
    make mrproper
    devono essere eseguiti sempre prima di ogni ricompilazione, il motivo credo sia ovvio.


    Adesso è opportuno ed essenziale "configurare" il kernel, secondo le specifiche dettate dal modello, dall'architettura ecc.. ecc..
    Se non abbiamo apportato alcuna modifica ai driver sorgenti possiamo utilizzare quella messaci a disposizione da samsung per il Note 2.
    Diamo il comando

    codice:
    make t0_04_defconfig
    NOTE: Per configurare il kernel abbiamo utilizzato un file chiamato per l'appunto "t0_04_defconfig" che si trova al percorso /arch/arm/configs dei nostri sorgenti: non è altro che un file con tutti i parametri settati in maniera tale che il kernel esegua il boot con successo sulla macchina di destinazione. Ovviamente il file può essere modificato, disattivando dei parametri e attivandone altri, ma è ovvio che si deve sapere dove e perchè mettere le mani.

    Adesso siamo pronti per la compilazione. Date il comando

    codice:
    make
    Mettetevi comodi e fumatevi il fumabile perchè questa fase è la più lunga, scorreranno sotto i vostri occhi le varie fasi di compilazione di kernel (stage 1) e relativi moduli (stage2).
    Se tutto è andato a buon fine troverete l'immagine kernel zImage al percorso arch/arm/boot

    Ma non abbiamo ancora finito del tutto: per ulteriore sicurezza dovremo lanciare la compilazione dei soli moduli per una seconda volta, ci metterà poco più di un minuto.

    Diamo il comando

    codice:
    make modules CFLAGS_MODULE=-fno-pic
    Spiegazione: Il kernel ha una versione ben specifica. Per versione intendo una serie di numeri in codice che identificano un header, un riferimento. Per fare in modo che i moduli funzionino devono avere lo stesso codice identificativo del kernel. Questa condizione si verifica solo quando il kernel (zImage) viene compilato per primo e i moduli successivamente. Se per qualunque motivo ciò non avviene i moduli non avranno la stessa versione del kernel e non funzioneranno (niente wifi, bluetooth, ecc).
    Ecco perchè per sicurezza vi ho suggerito di compilare i moduli una seconda volta sovrascrivendo quelli generati durante la prima compilazione.

    A questo punto abbiamo quasi finito: riepilogando abbiamo compilato correttamente uno zImage (kernel) e i relativi moduli (eseguibili con estensione .ko) ma il lavoro non è ancora finito.
    Per far funzionare il kernel su un dispositivo android abbiamo bisogno di creare un'immagine di boot.

    7a- BOOT.IMG


    Un'immagine di boot (boot.img) è un archivio con estensione .img che contiene il kernel (zImage) e una ramdisk (initrd).

    In ambiente Linux si intende initrd (initial ram disk) o initramfs (initial ram file system) uno schema di istruzioni per il caricamento di un root file system temporaneo durante il processo di avvio che ha il compito di controllare gli aspetti di base del sistema , come punti di mount, gestione della memoria, dei servizi di avvio e soprattutto contiene i moduli che abbiamo compilato nei passi precedenti della presente guida e che sono ovviamente necessari al funzionamento di tutte le periferiche presenti nel device.
    In parole povere la ramdisk è una sorta di passaggio preliminare che serve a compiere ad esempio operazioni che non potrebbero essere portate a termine con successo quando il file system è definitivamente montato (ad avvio completato), tanto per fare un esempio: in molti ricordano il Siyah kernel di Gokhan Moral. Il dualboot tra due rom viene gestito interamente dall'initrd, prima che venga montato il file system. Sapevatelo.

    NOTA:La differenza tra i due termini
    codice:
    initramfs
    e
    codice:
    initrd
    consiste nel differente metodo di implementazione, ma la funzione è analoga. Gli initramfs sono embedded con lo zImage e la recovery (la maggior parte dei dispositivi Samsung fino al Galaxy S2) mentre l'initrd è compressa in un secondo momento assieme allo zImage nella boot.img (tutti i dispositivi android e in particolare samsung dal Galaxy S3 in poi).
    Dal Galaxy S3 anche samsung ha deciso di allinearsi con tutto il resto della produzione android, riservando due partizioni separate rispettivamente per il kernel e la recovery.


    Fatte le doverose premesse in questo capitolo vedremo come:

    - Estrarre una ramdisk da una boot.img stock;

    - Modificare una ramdisk (ci limiteremo al solo inserimento dei moduli appena compilati);

    - Ricomprimere una ramdisk;

    - Fondere insieme ramdisk e kernel per ottenere una boot.img finale.


    Vi serviranno alcuni "attrezzi", scaricateli da QUI

    Estraete lo zip ovunque vi aggradi, otterrete una cartella chiamata "bootimg-tools" con dentro tutto ciò che vi serve.

    Adesso vi consiglio di spostare l'intera cartella nel vostro work tree (la cartella "android" che abbiamo creato ad inizio guida) in modo da averla a portata di mano.


    IMPORTANTE! - Settate i permessi per consentire di eseguire i files come programmi

    Dovrete procurarvi una boot.img stock per il Note 2 GT-N7100, potrete tirarla fuori da una rom o da un firmware.
    Copiatela nella cartella "bootimg-tools" assieme al resto.

    Da terminale digitate spostatevi nella cartella "bootimg-tools", se non lo avete ancora fatto.

    codice:
    cd android/bootimg-tools
    E digitate il comando

    codice:
    ./extractboot boot.img
    Se avete fatto tutto per bene otterrete un out-put simile a quello nello screen di seguito.


    Recatevi nella cartella bootimg-tools e troverete una nuova cartella "out" dove sarà contenuta la ramdisk appena estratta.







    ....Segue al post successivo
    Ultima modifica di umberto1978; 02-08-13 alle 10:22
    codice:
    These mist covered mountains, are a home now for me 
    But my home is the lowlands, and always will be 
    Some day you'll return to your valleys and your farms 
    And you'll no longer burn to be brothers in arm

  21. I seguenti 11 Utenti hanno ringraziato umberto1978 per il post:

    8thphloor (01-08-13),bluflight13 (30-10-13),bn1540 (31-07-13),crisgen (31-07-13),FN6 (31-07-13),giuros77 (31-07-13),Janobifronte (31-07-13),japoco_poz14 (31-07-13),Paolone46 (31-07-13),Picciotto (31-07-13),unname (31-07-13)

Pagina 1 di 4 123 ... ultimoultimo
Ultima pagina

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire risposte
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Torna su
Privacy Policy