
1, 首先你这种想法是错误的,当你的文件编译过后就已经产生一个配置文件了,想把你编译好
的 安装程序装到其他linux系统上那简直太难了,你那个配置文件就必须的在此生成,所以你
这种打包的方法是不可取的。
2 想要在另外一台在安装,你就把原来没有安装的包拷贝过去,然后再编译,然后会产生配置文
件。
3 打包小知识:
tar -czvf filetargz 要压缩的文件
代表所有
一看android的源代码
1)将Apkdapk 用zip解压后,出现了一个classesdex文件
2014/02/19 19:42
2014/02/19 19:42
2014/02/19 15:35 1,656 AndroidManifestxml
2014/02/19 15:35 687,024 classesdex
2014/02/19 15:49
META-INF
2014/02/19 15:49
res
2014/02/19 15:35 2,200 resourcesarsc
2)进入到dex2jar目录中,运行情况如下:
D:\developer\tools\test_apk\dex2jar-00915>dex2jarbat "\Apkd(d2j)\classesd
ex"
this cmd is deprecated, use the d2j-dex2jar if possible
dex2jar version: translator-00915
dex2jar \Apkd(d2j)\classesdex -> \Apkd(d2j)\classes_dex2jarjar
Done
在apk所在的目录会出现 classes_dex2jarjar 文件。
3) 用JD-GUI对jar包进行查看,可以查看源文件
二反编译apk
1在 下载 APKTOOL中的三个文件(aaptexe、apktoolbat、apktooljar)解压缩到你的Windows安装目录下,以方便使用Dos命令
2012/12/06 11:44 854,016 aaptexe
2014/02/19 17:15 277,372 Apkdapk //示例用 apk文件
2012/12/23 23:39 92 apktoolbat
2013/02/03 02:37 2,655,843 apktooljar
2进入到apktoolbat所在的目录,运行:
apktool d Apkdapk decode_dir
反编译后,decode_dir目录下的内容如下:
2014/02/19 17:16 716 AndroidManifestxml
2014/02/19 17:16 237 apktoolyml
2014/02/19 17:18
build
2014/02/19 17:16
res
2014/02/19 17:16
smali
此时我可以查看原文件AndroidManifestxml了,也是查看smali源文件(是用smali语言写的,可以对照java看)。
三APKTOOL的使用
1)decode
该命令用于进行反编译apk文件,一般用法为
apktool d
代表了要反编译的apk文件的路径,最好写绝对路径,比如C:\MusicPlayerapk
代表了反编译后的文件的存储位置,比如C:\MusicPlayer
如果你给定的已经存在,那么输入完该命令后会提示你,并且无法执行,需要你重新修改命令加入-f指令
apktool d –f
这样就会强行覆盖已经存在的文件
2)build
该命令用于编译修改好的文件,一般用法为
apktool b
这里的
就是刚才你反编译时输入的
(如C:\MusicPlayer),输入这行命令后,如果一切正常,你会发现C:\MusicPlayer内多了2个文件夹build和dist,其中分别存储着编译过程中逐个编译的文件以及最终打包的apk文件。
3)install-framework
该命令用于为APKTool安装特定的framework-resapk文件,以方便进行反编译一些与ROM相互依赖的APK文件。具体情况请看常见问题
四smali与java源码对照,并做出相应的修改
java源代码:
import androidosBundle;
import androidappActivity;
import androidviewMenu;
import androidwidget;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
superonCreate(savedInstanceState);
setContentView(Rlayoutactivity_main);
TextView a = (TextView)thisfindViewById(Ridtest) ;
asetText("raoliang");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present
getMenuInflater()inflate(Rmenumain, menu);
return true;
}
}
对应的smali源代码:
class public Lali/text/apkd/MainActivity;
super Landroid/app/Activity;
source "MainActivityjava"
# 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_gameapk签名:
jarsigner -verbose -keystore demokeystore Apkdapk demokeystore
最后,在安装到手机前,需要把手机中的已有版本先卸载,因为如果签名不同,是不能覆盖安装的,会提示“应用程序未安装”错误。
完整的运行情况如下:
D:\developer\tools\test_apk\new\decode\dist>keytool -genkey -alias demokeystore -keyalg RSA -validity 40000 -keystore demokeystore
输入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 demokeystore Apkdapk demokeystore
输入密钥库的口令短语:
正在添加: META-INF/MANIFESTMF
正在添加: META-INF/DEMO_KEYSF
正在添加: META-INF/DEMO_KEYRSA
正在签名: res/drawable-hdpi/ic_launcherpng
正在签名: res/drawable-mdpi/ic_launcherpng
正在签名: res/drawable-xhdpi/ic_launcherpng
正在签名: res/drawable-xxhdpi/ic_launcherpng
正在签名: res/layout/activity_mainxml
正在签名: res/menu/mainxml
正在签名: AndroidManifestxml
正在签名: classesdex
正在签名: resourcesarsc
D:\developer\tools\test_apk\new\decode\dist>
到此为止,修改后的apk可以正常的安装了,不过,在安装之前,必须要先卸载以前的apk,不能直接替换(因为签名不一样)
总体思路是先打成jar再把jar打成exe。主要看13和23里的内容就可以了。
1.将项目打成jar:
11要将项目打包成jar文件,方法很多,可以用Eclipse自带的打包工具Ant打包,也可以用Eclipse的Export生成jar。经过尝试后,我不推荐用Ant打包,因为要自己编写xml脚本语言,还要增加一些外部的jar,所以我打了好几次都没打成。
12在这里介绍两种方法生成jar,第一种是用Eclpise的Export功能。在要打包的项目上击右键,选择Export,在窗口中选择Java里的JARfile。Next后的窗口中已经自动选好了要打包的项目,用户可以点击加号查看项目里被打包的内容。在下面的JARfile里设置你打包生成jar文件的输出目录,下一步在出现的窗口中选择Useexistingmanifestfromworkspace,在下面的Mainclass后面直接点Browse,它会自动列出你项目中有主函数main的类。选择主类后点Finish即可生成jar文件。在此说明一下,这种打包方法不能把项目中的外部的jar包打进来,因该是也要编写一些脚本语言,没往深研究。所以生成后的jar有些是不能执行的。
13第二种方法是利用Eclipse的一个第三方插件fatjar生成jar文件,也是本人觉得最简单最方便的一种生成方式。先从网上下载些插件,解压后是一个plugins的文件夹,里面只有一个文件夹,我的“netsffjepfatjar_0024”将它copy到Eclipserplugins文件夹下,此插件就安装成功了,重启Eclipse在项目上右击就会看到多出一个“BuildFatJar”在前面有个绿色的“”号,这时你就可以用此插件打包你的项目了。进去后第一个界面Jar-Name里增入要生成的jar文件名,我的是“CAMP_fatjar”。在Main-Class后点Browse像Export一样它也会列出你项目中的主类,选择后其它默认即可,Next后会列出你要打包的所有内容,这个插件的优势就是可以将你项目中的外部jar也打进来,有三个先项,其中ExportANT是生成buildxml脚本文件,方便用户以后修改脚本,其它两个按钮没用。在这里什么都不点,直接点Finish就可以生成jar文件。
2将jar打成exe文件:
21虽然此时的jar文件已经可以执行了。生成exe的文件我也是用两种方法实现的,用到的打包工具是j2ewiz和exe4j,它们的不同会在我下面的介绍中体现出来。
22首先是j2ewiz,这个软件是绿色的,不用安装,解压后可以直接运行,但这个软件生成的exe文件不是跨平台的。运行此程序首先就是输入要打包的jar文件,我们浏览JAR选择我们之前用fatjar生成的“CAMP_fatjar”项目文件(详见13),下面那个选项是提示用户最低要求的JRE版本,一般选13。下一步,因为我们的寝室管理系统是图形界面,所以在这里选“Windows窗口程序”下一步它也是自动生成要执行的主类,你只要选择就可以。下面的选框可以选择你启动程序显示的。下一步后这个窗可按个人喜好选择。下一步,如果你的程序还有什么依赖的外部jar文件,可以从这里加上,但因为之前的fatjar以经将我们项目所用的那三个连数据库的外部类打进CAMP_fatjar包里了,所以这里不用再添加。如果你之前是用Export打的jar包,那么这里就需要再把那个三个数据库的包加进来了(详见12)。下一步是添入要生成的exe文件名,再选一个程序图标就可以了,下一步后生成exe文件,点完成。双击生成的exe文件就能看到运行效果了,这种exe文件还没有脱离JDK环境,还不能跨平台使用,只能用于小组成员测试使用。
23=下面进入最关键的,如何打包跨平台的exe文件。用到的软件是exe4j,我用的是V40版的,此软件需要破解。安装后运行左窗窗口标有十步,其实打包过程也非常简单。第一步完全略过,直接点Next第二步我们选择“JAR
inEXEmode”就是选择我们已经有制作好的jar文件。第3步上面是项目名称,可随便填写,下面一个写出你想要将打包后的exe文件输出的目录我的是“桌面project”。第4步,由于我的演示程序是图形的,所以选第一个,如果你的程序是控制台的,则选择第二个,Executablename写你将要生成的exe文件的名字,IconFile可以选择生成文件的图标。第5步,先别管上面的,先在下面单击绿色的“”号,在d出的窗口中点Archive,然后找到起初已经做好的CAMP_fatjar(详见13)文件,"OK"后返回,在下面的ClassPath里就出现jar文件路径后,再在上面MainClass栏内点击找到main所在的类。第6步,你系统的JRE版本,一般是填个13,下面填16在这里单击advancedoptions,选择searchsequence。选这个就是因为我们要把JDK环境也打包进来,好让程序能跨平台使用。首先要从你系统的JDK下的JRE目录copy到你exe文件的输出目录下“桌面projectJRE”,然后回到exe4j中在d出窗口删除列表中的所有项。我的是三项,一个注册表的,一个JAVA环境变量的,一个JDK环境变量的,都不要。然后单击绿“”,选择directory并选择JRE的根目录,我的是“桌面projectJRE”就是copy后的目录,选完后exe4jd出窗口中的Directory里会显示“JRE”。点OK关闭该窗口,返回exe4j的主窗口,你就可以看到刚加的路径。再从主窗口左侧窗口中单击advancedoptions,并选择preferredVM,在d出的窗口中选择clienthostspotVM,单击next按钮继续。7、8步是一些个性设置默认即可。第9步编译完后第10步你点那个“ClickHeretoStarttheApplication”按钮就可以看到程序运行效果了,然后再点”Seaveas”保存一个exe4j生成的一个文件,随便存哪里都行,和我们的exe程序无关。全部制作过程就完工了。
以上就是关于如何把linux下编译好的程序整体打包全部的内容,包括:如何把linux下编译好的程序整体打包、如何反编译android应用并重新打包、java应用程序怎样打包成可jar执行程序(java打包成可执行文件)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)