安卓重新編譯
❶ 如何反編譯android應用並重新打包
可以用apktool對apk進行反編譯並重新打包,方法如下:
1、首先我們新建一個android項目,裡面只有一個MainActivity,而且主界面只會顯示一個字元串:你好。
2、下面,切換到這個項目生成的apk文件所在的目錄,可以看到有一個hellodemo.apk。
3、在命令行輸入:apktool d -r hellodemo.apk。可以看到在當前目錄下生成了一個hellodemo文件夾。
4、進入到hellodemo\smali\com\example\hello,打開MainActivity.smali。找到:
const-string v1, "\u4f60\u597d",
修改為:
const-string v1, "hello",
5、然後在命令行輸入:apktool b hellodemo hellodemo1.apk。這回重新打包成hellodemo1.apk。
6、然後給新生成的apk進行簽名。把這個apk拷貝到autosign的目錄下面,然後切換過去,在命令行輸入:java -jar signapk.jar testkey.x509.pem testkey.pk8 hellodemo1.apk hellodemo.apk。
7、把生成的hellodemo.apk安裝到手機,可以看到主界面上已經顯示的是hello,而不再是你好。說明反編譯重新打包成功!
❷ android building make出錯,怎樣還原重新編譯
make遇到缺什麼就安裝什麼
/usr/bin/ld: cannot find -lz
host Executable: aapt (out/host/linux-x86/obj/EXECUTABLES/aapt_intermediates/aapt)
/usr/bin/ld: cannot find -lz
collect2: ld returned 1 exit status
make: *** [out/host/linux-x86/obj/EXECUTABLES/aapt_intermediates/aapt] Error 1
解決方法: sudo apt-get install zlib1g-dev sudo apt-get install lib64z1-dev
/bin/bash: bison: command not found
Yacc: aidl <= frameworks/base/tools/aidl/aidl_language_y.y
bison -d -o out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_y.cpp frameworks/base/tools/aidl/aidl_language_y.y
/bin/bash: bison: command not found
make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_y.cpp] Error 127
解決方法:sudo apt-get install bison
/bin/bash: flex: command not found
out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_y.cpp: In function 『int yyparse()』:
out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_y.cpp:1827: warning: deprecated conversion from string constant to 『char*』
out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_y.cpp:1970: warning: deprecated conversion from string constant to 『char*』
Lex: aidl <= frameworks/base/tools/aidl/aidl_language_l.l
/bin/bash: flex: command not found
make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_l.cpp] Error 127
解決方法: sudo apt-get install flex
/usr/bin/ld: cannot find -lncurses
host Executable: adb (out/host/linux-x86/obj/EXECUTABLES/adb_intermediates/adb)
/usr/bin/ld: cannot find -lncurses
collect2: ld returned 1 exit status
make: *** [out/host/linux-x86/obj/EXECUTABLES/adb_intermediates/adb] Error 1
解決方法:sudo apt-get install libncurses5-dev
fatal error: GL/glx.h: No such file or directory
development/tools/emulator/opengl/host/libs/Translator/GLcommon/GLDispatch.cpp:22: fatal error: GL/glx.h: No such file or directory
compilation terminated.
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libGLcommon_intermediates/GLDispatch.o] Error 1
解決方法:sudo apt-get install libgl1-mesa-dev
sh: gperf: not found
target Generated: libwebcore <= external/webkit/Source/JavaScriptCore/create_regex_tables
Generating CSSPropertyNames.h <= CSSPropertyNames.in
sh: gperf: not found
calling gperf failed: 32512 at ./makeprop.pl line 140.
make: *** [out/target/proct/generic/obj/STATIC_LIBRARIES/libwebcore_intermediates/Source/WebCore/css/CSSPropertyNames.h] Error 25
make: *** Deleting file `out/target/proct/generic/obj/STATIC_LIBRARIES/libwebcore_intermediates/Source/WebCore/css/CSSPropertyNames.h'
解決方法:sudo apt-get install gperf
上述安裝,可以用一條命令完成:
sudo apt-get install git-core gnupg flex bison gperf build-essential \
zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \
libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \
libgl1-mesa-dev g++-multilib mingw32 openjdk-6-jdk tofrodos \
python-markdown libxml2-utils xsltproc zlib1g-dev:i386
sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
❸ 如何反編譯android應用並重新打包
一.看android的源代碼 1)將Apkd.apk 用zip解壓後,出現了一個classes.dex文件 2014/02/19 19:42 . 2014/02/19 19:42 .. 2014/02/19 15:35 1,656 AndroidManifest.xml 2014/02/19 15:35 687,024 classes.dex 2014/02/19 15:49 META-INF 2014/02/19 15:49 res 2014/02/19 15:35 2,200 resources.arsc 2)進入到dex2jar目錄中,運行情況如下: D:\developer\tools\test_apk\dex2jar-0.0.9.15>dex2jar.bat "..\Apkd(d2j)\classes.d ex" this cmd is deprecated, use the d2j-dex2jar if possible dex2jar version: translator-0.0.9.15 dex2jar ..\Apkd(d2j)\classes.dex -> ..\Apkd(d2j)\classes_dex2jar.jar Done. 在apk所在的目錄會出現 classes_dex2jar.jar 文件。 3) 用JD-GUI對jar包進行查看,可以查看源文件 二.反編譯apk 1.在下載APKTOOL中的三個文件(aapt.exe、apktool.bat、apktool.jar)解壓縮到你的Windows安裝目錄下,以方便使用Dos命令. 2012/12/06 11:44 854,016 aapt.exe 2014/02/19 17:15 277,372 Apkd.apk//示例用apk文件 2012/12/23 23:39 92 apktool.bat 2013/02/03 02:37 2,655,843 apktool.jar 2.進入到apktool.bat所在的目錄,運行: apktool d Apkd.apk decode_dir 反編譯後,decode_dir目錄下的內容如下: 2014/02/19 17:16 716 AndroidManifest.xml 2014/02/19 17:16 237 apktool.yml 2014/02/19 17:18 build 2014/02/19 17:16 res 2014/02/19 17:16 smali 此時我可以查看原文件AndroidManifest.xml了,也是查看smali源文件(是用smali語言寫的,可以對照java看)。 三.APKTOOL的使用 1).decode 該命令用於進行反編譯apk文件,一般用法為 apktool d 代表了要反編譯的apk文件的路徑,最好寫絕對路徑,比如C:\MusicPlayer.apk 代表了反編譯後的文件的存儲位置,比如C:\MusicPlayer 如果你給定的已經存在,那麼輸入完該命令後會提示你,並且無法執行,需要你重新修改命令加入-f指令 apktool d –f 這樣就會強行覆蓋已經存在的文件 2).build 該命令用於編譯修改好的文件,一般用法為 apktool b 這里的 就是剛才你反編譯時輸入的 (如C:\MusicPlayer),輸入這行命令後,如果一切正常,你會發現C:\MusicPlayer內多了2個文件夾build和dist,其中分別存儲著編譯過程中逐個編譯的文件以及最終打包的apk文件。 3).install-framework 該命令用於為APKTool安裝特定的framework-res.apk文件,以方便進行反編譯一些與ROM相互依賴的APK文件。具體情況請看常見問題 四.smali與java源碼對照,並做出相應的修改 java源代碼: import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.widget.*; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView a = (TextView)this.findViewById(R.id.test) ; a.setText("raoliang"); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } } 對應的smali源代碼: .class public Lali/text/apkd/MainActivity; .super Landroid/app/Activity; .source "MainActivity.java" # direct methods .method public constructor ()V .locals 0 .prologue .line 8 invoke-direct {p0}, Landroid/app/Activity;->()V return-void .end method # virtual methods .method protected onCreate(Landroid/os/Bundle;)V .locals 2 .parameter "savedInstanceState" .prologue .line 12 invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V .line 13 const/high16 v1, 0x7f03 invoke-virtual {p0, v1}, Lali/text/apkd/MainActivity;->setContentView(I)V .line 14 const/high16 v1, 0x7f08 invoke-virtual {p0, v1}, Lali/text/apkd/MainActivity;->findViewById(I)Landroid/view/View; move-result-object v0 check-cast v0, Landroid/widget/TextView; .line 15 .local v0, a:Landroid/widget/TextView; const-string v1, "raoliang" invoke-virtual {v0, v1}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V .line 16 return-void .end method .method public onCreateOptionsMenu(Landroid/view/Menu;)Z .locals 2 .parameter "menu" .prologue .line 21 invoke-virtual {p0}, Lali/text/apkd/MainActivity;->getMenuInflater()Landroid/view/MenuInflater; move-result-object v0 const/high16 v1, 0x7f07 invoke-virtual {v0, v1, p1}, Landroid/view/MenuInflater;->inflate(ILandroid/view/Menu;)V .line 22 const/4 v0, 0x1 return v0 .end method 通過對比可以看到,常量是沒有必變的,可以根據的smali的語法,進行相應的修改 五.3、打包、簽名和安裝修改後的apk 修改完了,就可以打包回apk了。執行以下命令: apktool b decode_dir 在mygame目錄下的dist在會看到打包好的apk。 當然,現在一般是無法安裝的,因為apk還沒有簽名。下面就來簽名。簽名需要keystore文件,我已經有專用的keystore了,如果還沒有,請參閱這里進行生成。 執行以下命令為重新編譯的my_game.apk簽名: jarsigner -verbose -keystore demo.keystore Apkd.apk demo.keystore 最後,在安裝到手機前,需要把手機中的已有版本先卸載,因為如果簽名不同,是不能覆蓋安裝的,會提示「應用程序未安裝」錯誤。 完整的運行情況如下: D:\developer\tools\test_apk\new\decode\dist>keytool -genkey -alias demo.keystore -keyalg RSA -validity 40000 -keystore demo.keystore 輸入keystore密碼: 再次輸入新密碼: 您的名字與姓氏是什麼? [Unknown]: rao 您的組織單位名稱是什麼? [Unknown]: rao 您的組織名稱是什麼? [Unknown]: 您所在的城市或區域名稱是什麼? [Unknown]: 您所在的州或省份名稱是什麼? [Unknown]: 該單位的兩字母國家代碼是什麼 [Unknown]: CN=rao, OU=rao, O=Unknown, L=Unknown, ST=Unknown, C=Unknown 正確嗎? [否]: y 輸入的主密碼 (如果和 keystore 密碼相同,按回車): D:\developer\tools\test_apk\new\decode\dist>jarsigner -verbose -keystore demo.keystore Apkd.apk demo.keystore 輸入密鑰庫的口令短語: 正在添加: META-INF/MANIFEST.MF 正在添加: META-INF/DEMO_KEY.SF 正在添加: META-INF/DEMO_KEY.RSA 正在簽名: res/drawable-hdpi/ic_launcher.png 正在簽名: res/drawable-mdpi/ic_launcher.png 正在簽名: res/drawable-xhdpi/ic_launcher.png 正在簽名: res/drawable-xxhdpi/ic_launcher.png 正在簽名: res/layout/activity_main.xml 正在簽名: res/menu/main.xml 正在簽名: AndroidManifest.xml 正在簽名: classes.dex 正在簽名: resources.arsc D:\developer\tools\test_apk\new\decode\dist> 到此為止,修改後的apk可以正常的安裝了,不過,在安裝之前,必須要先卸載以前的apk,不能直接替換(因為簽名不一樣)
❹ lichee改動 android還要重新編譯嗎
lichee改動只要重新編譯好lichee部分就好了,生成新的BOOT.IMG文件,然後再與Android部分一起pack生成新的鏡像文件,或者直接燒錄boot.img文件進機器也行,用adb燒
❺ 如何修改Android應用程序的圖標和名字
利用反編譯工具「安卓修改大師」可以修改Android應用程序的圖標和名字。具體操作請參照以下步驟。
1、在應用下載網站下載「安卓修改大師」軟體,下載完成後,安裝到電腦系統中。
2、在電腦上打開「安卓修改大師」應用,在反編譯選項界面導入需要修改圖標和名字的安卓應用。在這里導入的是安卓應用「單機鬥地主」,安卓應用原安裝包需要事先下載在電腦中。
3、安卓應用導入之後,會出現一個提示,點擊「否」直接進入常規信息的編輯界面。在編輯界面會出現安卓應用的各項信息。
4、在編輯界面,點擊「替換圖標」選項將應用的圖標替換成需要的圖標,在「應用名稱」欄對應用名字進行修改,這里修改為了「誰是地主」。圖標和名字可以根據個人需求修改。
5、在「打包/簽名」選項點擊「開始打包」對修改後的安卓應用進行重新編譯。
6、打包完成後,Android應用程序的圖標和名字就已經被修改了。此時只要將新的安裝包導入到手機上安裝就可以了。導出方式有「安裝至手機」和「導出安裝包」兩種。
❻ 如何給安卓應用編譯
把常用的應用程序編譯到img文件中,就成了系統的一部分,用戶不必自己安裝,當然也卸載不了;
同時也可以刪減系統自帶的應用程序,精簡系統;
1.\build\target\proct 目錄下generic.mk文件:
Java代碼 收藏代碼
PRODUCT_PACKAGES := \
AccountAndSyncSettings \
DeskClock \
AlarmProvider \
Bluetooth \
Calculator \
Calendar \
Camera \
testMid \
CertInstaller \
DrmProvider \
Email \
Gallery3D \
LatinIME \
Launcher2 \
Mms \
Music \
我們添加一個testMid \ 應用名稱。
2.把testMid包放入
\packages\apps 目錄下,修改android.mk文件。
Java代碼 收藏代碼
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := testMid
LOCAL_CERTIFICATE := platform
include $(BUILD_PACKAGE)
註:LOCAL_PACKAGE_NAME := testMid (包名必須和generic.mk中添加的相同)
編譯源碼,可以看到在
\out\target\proct\smdkv210\system\app
目錄下生存了testMid.apk了。這時system.img也包含了此應用。
-------------------------------------------------------------------
特殊情況:有時,應用需要包含jar包,這時的app導入源碼時會出現問題:
MODULE.TARGET.JAVA_LIBRARIES.libarity already defined by ... stop
由於 LOCAL_STATIC_JAVA_LIBRARIES := libarity 會引發錯誤信息。
目前解決方法是:
\build\core 目錄下修改base_rules.mk
注釋掉錯誤信息:
ifdef $(mole_id)
#$(error $(LOCAL_PATH): $(mole_id) already defined by $($(mole_id)))
endif
$(mole_id) := $(LOCAL_PATH)
--重新編譯,這時可以通過了。
(2)、刪除原廠(Telchips)帶源碼的應用程序,如DTV_DVBT
在/device/telechips/m801/device.mk
注釋掉相應語句:
# PRODUCT_PACKAGES += \
# SampleDVBTPlayer \
同時,在/out/target/proct/m801/system/app 找到相應的.APK包,並刪除
❼ 怎麼重新編譯android 下面的動態庫
使用動態庫來編譯動態庫
A項目的android.mk文件如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := testa
LOCAL_SRC_FILES := testa.c
include $(BUILD_SHARED_LIBRARY)
生成的libtesta.so加入到E:\workspace\android-ndk-r8e\platforms\android-8\arch-arm\usr\lib\下面
項目B的文件目錄結構如下:
jni
jni/jni/
jni/prebuilt/
jni目錄下的mk文件如下:
include $(all-subdir-makefiles)
jni/prebuilt目錄下的mk文件如下:
LOCAL_PATH := $(call my-dir)
#include $(CLEAR_VARS)
LOCAL_MODULE := libtesta
LOCAL_SRC_FILES := libtesta.so
include $(PREBUILT_SHARED_LIBRARY)
同時把libtesta.so也放入該目錄下.
jni/jni目錄下的mk文件內容:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_LDLIBS := -ltesta
LOCAL_MODULE := testb
LOCAL_SRC_FILES := testb.c
include $(BUILD_SHARED_LIBRARY)
這樣生成libtestb.so文件, 同時eclipse在打包時會把libtesta.so, libtestb.so都加入到apk文件中,如果沒有prebuilt那一步,那麼在打包時會漏掉libtesta.so, 但編譯會通過,因為編譯讀取的是編譯系統的庫文件目錄(LOCAL_LDLIBS := -ltesta), 這點需要注意
java代碼:
System.loadLibrary("testa");
System.loadLibrary("testb");
注意先後關系
❽ 安卓反編譯出來的都是.smali文件,怎麼反編譯位原工程啊修改後還能重新編譯回去
反編譯步驟:
下載apktool 並設置環境變數
命令行進入apk目錄執行:apktool d xx.apk (如果遇到一些錯誤說明apk做了防破解處理)
執行成功後會生成xx文件夾,進入xx文件夾修改需要修改的內容,如果需要修改代碼,進入xx\smali\裡面,需要懂一些smali語法
修改完後回到命令行,執行:apktool b xx ,會在xx文件夾裡面生成一個dist文件夾,裡面的apk就是回編譯的,這個apk是沒有簽名的
下載網上的簽名工具對apk簽名,完了就可以安裝了(如果你下載了源碼或者sdk,裡面自帶一個signapk也可以簽名)
❾ 安卓反編譯出來的代碼如何修改重新生成APK
反編譯步驟:
1.
下載apktool
並設置環境變數
2.
命令行進入apk目錄執行:apktool
d
xx.apk
(如果遇到一些錯誤說明apk做了防破解處理)
3.
執行成功後會生成xx文件夾,進入xx文件夾修改需要修改的內容,如果需要修改代碼,進入xx\smali\裡面,需要懂一些smali語法
4.
修改完後回到命令行,執行:apktool
b
xx
,會在xx文件夾裡面生成一個dist文件夾,裡面的apk就是回編譯的,這個apk是沒有簽名的
5.
下載網上的簽名工具對apk簽名,完了就可以安裝了(如果你下載了源碼或者sdk,裡面自帶一個signapk也可以簽名)