редактирование системных 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 (295.05 kb; 303 hits) Скачать файл |
SEVENI: |
09.12.12, 01:41 |
Возможность открывать ZIP, RAR архивы. 4.0.4 1 шаг: 2 шаг: сохраняем, собираем, готово. установите программу, которая умеет открывать zip или rar, к примеру, totalcommander © SEVENI Прикрепленный к сообщению файл: drawable.rar (0.94 kb; 4 hits) Скачать файл drawable-hdpi.rar (20.47 kb; 5 hits) Скачать файл 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 |