редактирование системных apk при помощи ApkTools : Смартфоны Android : Форум


 SEVENI:
09.11.12, 21:01
 редактирование системных apk при помощи ApkTools (c) Brut.all

между делом решил написать инструкцию по сборке/разборке apk-файлов.
для это нам понадобится:
JDK
Apktools


для примера я разберу/соберу SystemUI.apk
1 шаг)
устанавливаем JDK
создаем каталог "apktools" в корне диска. (для своего удобства я создал путь C:\android\ApkTools) и распаковываем туда содержимое архива apktools
скриншот: 

теперь нам нужно установить framework для своей прошивки(эта операция делается один раз для каждой новой прошивки)
перетаскиваем framework-res.apk от своей прошивки на apktool-if.cmd
дожидаемся завершения операции.
скриншот: 

для устройств HTC и прошивки с SENSE тоже самое нужно проделать с файлом com.htc.resources.apk,
SAMSUNG - twframework-res.apk,
Motorola - blur-res.apk и moto-res.apk,
LG - lge-res.apk, Sony Ericsson - SemcGenericUxpRes.apk
Проще говоря - нужно установить таким способом все apk-файлы в каталоге system/framework/

теперь мы можем разбирать системные приложения.

2 шаг)
[разборка:]
берем SystemUI.apk и перетаскиваем на apktool-d.cmd
дожидаемся окончания операции.
скриншот: 

получаем каталог с распакованным содержимым SystemUI.apk
изменяем, что хотим.

3 шаг)
[запаковка:]
перетаскиваем каталог SystemUI на apktool-b.cmd
дожидаемся завершения операции.
скриншот: 

теперь открываем WINRAR'ом (или любым другим архиватором)
исходный SystemUI.apk и каталог SystemUI\build\apk\
скриншот: 

и перемещаясь по каталогу, закидываем измененные файлы в исходный SystemUI.apk,
по аналогичным путям, заменяя файлы.
степень сжатия: без сжатия.

Если редактировали *.xml в папках values, добавляли/удаляли изображения
- resources.arsc менять обязательно!
(в нём находятся все папки values и файл public.xml, в котором присваивается ID всем ресурсам, кстати папка smali, находится в файле classes.dex)


(R) sk0t

прилагаю архивы с apktools.
1.3.2 - для Android 1.6 - 2.3.7
1.4.3 - для Android 4.0.x
1.5.0 - экспериментальная версия от iBotPeaches

 GaS:
10.11.12, 00:32
 ну разобрали, отредачили, собрали, а дальше ставить как обычный апк или тупо заменить его? разрешения или прочую хрень менять нужно?

 SEVENI:
10.11.12, 06:18
 Gas, если с телефона заменять то
нужен файл менеджер с
поддержкой root и возможностью
назначать права(root explorer, ES)
Копируем apk в телефон на карту.
Копируем apk с карты в папку /system
Выставляем для apk права 0644
Перемещаем apk в папку /system/app или
/system/framework
Перемещать из /system нужно потому, что
apk может использоваться в данный
момент и система не даст заменить его
при копировании.


иначе такой способ:
http://supertrubka.org/newbb_plus/viewtopic.php?topic_id=5664

 zapret:
10.11.12, 21:50
 SEVENI, немного не в тему, но. что нужно поменять в апк, чтоб можно было установить два одинаковых или скажем две разные версии?
нужно поставить второй менеджер смс. первый стоит с кастомной прошивки, хочу со стока поставить менеджер. тупо установить или заменить старндартный не прокатывает. ничего не работает в итоге.

 SEVENI:
11.11.12, 09:16
 zapret, по идее достаточно заменить имя пака, который установится в Data/app
для примера:
Autostarts_v1.7.5\AndroidManifest.xml
<manifest android:versionCode="22" android:versionName="1.7.5" android:installLocation="auto" package="com.elsdoerfer.android.autostarts"


но некоторые приложения могут ругаться при сборке, ссылаясь в начальную,
в логе можно будет посмотреть какие файлы в какой строке и заменить их самостоятельно.


+ если хочешь заменить имя в меню, то
Autostarts_v1.7.5\res\values\strings.xml
<string name="app_name">Autostarts</string>

ну и соответственно
Autostarts_v1.7.5\res\values-ru\strings.xml
Если таковой имеется.

не забудь перед тем, как в телефон закинуть - подписать приложение.
тут архив signed - http://supertrubka.org/newbb_plus/viewtopic.php?topic_id=5664

Прикрепленный к сообщению файл:

Screenshot_2012-11-11-09-07-54.png Screenshot_2012-11-11-09-07-54.png (295.05 kb; 302 hits) Скачать файл

 SEVENI:
09.12.12, 01:41
 Возможность открывать ZIP, RAR архивы. 4.0.4

1 шаг: 


2 шаг: 

сохраняем, собираем, готово.
установите программу, которая умеет открывать zip или rar, к примеру, totalcommander
© SEVENI

Прикрепленный к сообщению файл:

drawable.rar drawable.rar (0.94 kb; 4 hits) Скачать файл
drawable-hdpi.rar drawable-hdpi.rar (20.47 kb; 5 hits) Скачать файл
Screenshot_2012-12-09-01-49-17.png Screenshot_2012-12-09-01-49-17.png (116.55 kb; 259 hits) Скачать файл

 SEVENI:
15.12.12, 11:21
 расширенное power menu для android 4.0.4

работа с framework-res: 


android.policy: 

 Therion:
27.12.12, 01:01
 SEVENI, а как быть, если после сборки отредактированных ресурсов файлы *.xml не шифруются, как это сделано в оригинале? Получается что файл в апк попадает в своем читабельном виде

 awg:
20.03.13, 08:16
 SEVENI, кстати, на стоковом ядре на смартах Sony/SonyEricsson Xperia перезагрузка в рекавери возможна, только при наличии файла boot по пути cache/recovery, который после перезагрузки пропадает! И то, один фиг в рекавери не попадает, пытается в него войти, но не получается, тупо зависает! Легко проверить - создать этот файл и в терминале набрать:
su
reboot

нужно ядро ковырять!

[ Редактировано awg в 20.3.13 07:17 ]

 Zormax:
04.04.13, 11:46
 Вибра при поднятии трубки на том конце.

Есть сложный способ, я по нему не пошел, свой воткнул.

Итак, андроид 4.0.3, разбираем Phone.apk

Нас интересует файл CallNotifier.smali

Декларируем новую переменную, в которую будем заносить ноль после вибры, чтобы потом не вибрило самопроизвольно.

В начале ищем, где прописаны переменые:
Код:
# instance fields
.....
.....
.field private mVoicePrivacyState:Z

.field private ok2Ring:Z


Добавляем нашу новую после ok2Ring:
Код:
.field private mLastVibratedCall:Z


Чуть ниже начинается код:
Код:
.method private constructor <init>(Lcom/android/phone/PhoneApp;бла-бла-бла


В нем еще чуть ниже есть:
Код:
iput-boolean v6, v9, Lcom/android/phone/CallNotifier;->ok2Ring:Z


После неё вставляем:
Код:
iput-boolean v6, v9, Lcom/android/phone/CallNotifier;->mLastVibratedCall:Z


Здесь отступление:
Номера регистров (v6 и v9) брать свои, т.е. те, что в коде прописаны, в той же "ok2Ring".

Далее ищем метод:
Код:
.method private onDisconnect(Landroid/os/AsyncResult;I)V


В нём ищем перво встречающеяся "ok2Ring":
Код:
move-object/from16 v0, v43

iput-boolean v4, v0, Lcom/android/phone/CallNotifier;->ok2Ring:Z


После вставляем:
Код:
iput-boolean v4, v0, Lcom/android/phone/CallNotifier;->mLastVibratedCall:Z


Здесь отступление:
Номера регистров (v4 и v0) брать свои, т.е. те, что в коде прописаны, в той же "ok2Ring".

Далее ищем метод:
Код:
.method private onNewRingingConnection(Landroid/os/AsyncResult;I)V


В нём ищем перво встречающеяся "ok2Ring":
Код:
.line 632
.local v1, phone:Lcom/android/internal/telephony/Phone;
iput-boolean v6, v8, Lcom/android/phone/CallNotifier;->ok2Ring:Z


После вставляем:
Код:
iput-boolean v6, v8, Lcom/android/phone/CallNotifier;->mLastVibratedCall:Z


Здесь отступление:
Номера регистров (v6 и v8) брать свои, т.е. те, что в коде прописаны, в той же "ok2Ring".

Далее ищем метод:
Код:
.method private onPhoneStateChanged(Landroid/os/AsyncResult;)V


В нем ниже ищем вывод в лог:
Код: 
    .line 1121
    .local v2, callState:Lcom/android/internal/telephony/Call$State;
    sget-object v7, Lcom/android/internal/telephony/Call$State;->DIALING:Lcom/android/internal/telephony/Call$State;

    if-eq v2, v7, :cond_c7

    sget-object v7, Lcom/android/internal/telephony/Call$State;->DISCONNECTING:Lcom/android/internal/telephony/Call$State;

    if-eq v2, v7, :cond_c7

    sget-object v7, Lcom/android/internal/telephony/Call$State;->DISCONNECTED:Lcom/android/internal/telephony/Call$State;

    if-eq v2, v7, :cond_c7

    sget-object v7, Lcom/android/internal/telephony/Call$State;->ALERTING:Lcom/android/internal/telephony/Call$State;

    if-eq v2, v7, :cond_c7

    .line 1126
    const-string v7, "onPhoneStateChanged: foregroundCall not Dialing, set Audio mode"

    invoke-direct {v10, v7}, Lcom/android/phone/CallNotifier;->log(Ljava/lang/String;)V

    .line 1127
    iget-object v7, v10, Lcom/android/phone/CallNotifier;->mAudioManager:Landroid/media/AudioManager;

    invoke-virtual {v7}, Landroid/media/AudioManager;->getMode()I

    move-result v7

    const/4 v8, 0x2

    if-eq v7, v8, :cond_195


Вставлять вибру будем после:
Код:
    .line 1126
    const-string v7, "onPhoneStateChanged: foregroundCall not Dialing, set Audio mode"

    invoke-direct {v10, v7}, Lcom/android/phone/CallNotifier;->log(Ljava/lang/String;)V


Вставляем:

Код: 
    # Дальше наш код.

    iget-boolean v7, v10, Lcom/android/phone/CallNotifier;->mLastVibratedCall:Z # Получаем значение переменной

    if-eqz v7, :cond_zz # Если она 0, то не вибрим

    new-instance v7, Landroid/os/Vibrator; # Создаем

    invoke-direct {v7}, Landroid/os/Vibrator;-><init>()V # объект Vibrator.

    if-eqz v7, :cond_zz # Проверяем успешность предыдущей операции. На всяк случай.

    const-wide/16 v8, 0x96 # Задаем время вибрации в мс. 0x96 - это 150 миллисекунд.

    const-wide/16 v0, 0x0 # нада... )))

    invoke-virtual {v7, v8, v0}, Landroid/os/Vibrator;->vibrate(J)V # Вызываем метод, запускающий вибру.

    const/4 v8, 0x0

    move-object/from16 v0, v10 # Объект временно перемещаем

    iput-boolean v8, v0, Lcom/android/phone/CallNotifier;->mLastVibratedCall:Z # записываем в него новое значение 0

    :cond_zz


На что стоит обратить внимание, для работоспособности:
имена регистров у вас наверняка другие будут (v7, v8, v0)
Как определить нужные регистры?
смотрим выше и ниже код, ищем подобие:
const/4 v7, 0x2
ага, видим что v7 периодически по коду использется для внесения в неё разных констант, запоминаем номер регистра.
еще шарим по коду не выходя за рамки метода "onPhoneStateChanged":
const/4 v8, 0x2
ага, и v8 тоже периодически используется как свободный регистр.
Ну а третий регистр, придется подбирать (у меня v0).
v0 еще и потому, что ниже она юзается тоже как почти свободная:
Код: 
.line 1168
    const/16 v0, 0x3e8

    .line 1169
    .local v0, IN_CALL_NOTIFICATION_UPDATE_DELAY:I
    const/16 v7, 0x1c

    const-wide/16 v8, 0x3e8

    invoke-virtual {v10, v7, v8, v9}, Lcom/android/phone/CallNotifier;->sendEmptyMessageDelayed(IJ)Z

    .line 1174
    .end local v0           #IN_CALL_NOTIFICATION_UPDATE_DELAY:I
    .end local v2           #callState:Lcom/android/internal/telephony/Call$State;
    .end local v4           #pm:Landroid/os/PowerManager;


Отдельно по поводу регистра v10 - номер регистра тоже свой поставить, прямо после кода где вставляем, видно:
Код:
    .line 1126
    const-string v7, "onPhoneStateChanged: foregroundCall not Dialing, set Audio mode"

    invoke-direct {v10, v7}, Lcom/android/phone/CallNotifier;->log(Ljava/lang/String;)V

invoke-direct {v10, v7} - вот он наш нужный, у меня v10

Как ставить:
Т.к. Phone всегда загружен, то перезагружаем тело перед операциями:
1. подменяем файл в /system/app/
2. права на файл выставляем
3. хвост удаляем: /system/app/Phone.odex
4. перезагружаемся
ну либо подменяем через ADB

Учтите, что если выставили неверные регистры, то Phone будет постоянно выдавать ошибку и будет очень проблематично что-либо сделать на телефоне, т.к. окно ошибки будет всегда выскакивать, нужно заранее подготовить отходной путь, например чтобы стояла программа для соединения по WiFi через ADB, чтобы можно было вернуть исходный.

[ Редактировано Zormax в 5.4.13 19:03 ]

URL этой темы:
https://mobilefree.justdanpo.ru/newbb_plus/viewtopic.php?topic_id=5662

© 2005-2018 supertrubka.org