Submitted by admin on 2011, June 19, 9:21 AM
查看/修改Linux时区和时间
一、时区
1. 查看当前时区
date -R
2. 修改设置时区
方法(1)
tzselect
方法(2) 仅限于RedHat Linux 和 CentOS
timeconfig
方法(3) 适用于Debian
dpkg-reconfigure tzdata
3. 复制相应的时区文件,替换系统时区文件;或者创建链接文件
cp /usr/share/zoneinfo/$主时区/$次时区 /etc/localtime
在中国可以使用:
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
二、时间
1、查看时间和日期
date
2、设置时间和日期
将系统日期设定成1996年6月10日的命令
date -s 06/22/96
将系统时间设定成下午1点52分0秒的命令
date -s 13:52:00
3. 将当前时间和日期写入BIOS,避免重启后失效
hwclock -w
三、定时同步时间
* * * * * /usr/sbin/ntpdate 210.72.145.44 > /dev/null 2>&1
------
发现用tzselect改的似乎不生效,重起也不行
linux | 评论:0
| Trackbacks:0
| 阅读:988
Submitted by admin on 2011, June 19, 9:20 AM
安装虚拟机的时候,没太注意时区,装好后发现时区比中国上海的慢了16个小时,寻得一些方法,分享给大家:
时区的配置文件是/etc/sysconfig/clock。用tzselect命令就可以修改这个配置文件,根据命令的提示进行修改就好了。
但是在实际工作中,发现这种方式是不能够使得服务器上的时间设置马上生效的,而且使用ntpdate去同步时间服务器也不能够更改时间。即使你使用了 date命令手工设置了时间的话,如果使用ntpdate去进行时间同步的话,时间又会被改动到原来的错误时区的时间。而生产的机器往往是非常重要的,不能够进行重启等操作。
如果要修改时区并且马上生效,可以更换/etc/localtime 文件来实现。比如修改时区为中国上海,那么就可以使用如下的命令来使得时区的更改生效。
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
然后最好使用下面的命令将更改写入bios。
hwclock
--------------------------------
具体操作:
[root@localhost ~]# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
cp: overwrite `/etc/localtime'? y
[root@localhost ~]# date
Sat Feb 20 16:04:43 CST 2010
[root@localhost ~]# hwclock
Sat 20 Feb 2010 04:05:12 PM CST -0.474966 seconds
linux | 评论:0
| Trackbacks:0
| 阅读:901
Submitted by admin on 2011, June 18, 4:20 PM
SQLite 介绍
SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。此外它还是开源的,任何人都可以使用它。许多开源项目((Mozilla, PHP, Python)都使用了 SQLite.
SQLite 由以下几个组件组成:SQL 编译器、内核、后端以及附件。SQLite 通过利用虚拟机和虚拟数据库引擎(VDBE),使调试、修改和扩展 SQLite 的内核变得更加方便。
图 1. SQLite 内部结构

SQLite 基本上符合 SQL-92 标准,和其他的主要 SQL 数据库没什么区别。它的优点就是高效,Android 运行时环境包含了完整的 SQLite。
SQLite 和其他数据库最大的不同就是对数据类型的支持,创建一个表时,可以在 CREATE TABLE 语句中指定某列的数据类型,但是你可以把任何数据类型放入任何列中。当某个值插入数据库时,SQLite 将检查它的类型。如果该类型与关联的列不匹配,则 SQLite 会尝试将该值转换成该列的类型。如果不能转换,则该值将作为其本身具有的类型存储。比如可以把一个字符串(String)放入 INTEGER 列。SQLite 称这为“弱类型”(manifest typing.)。
此外,SQLite 不支持一些标准的 SQL 功能,特别是外键约束(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FULL OUTER JOIN, 还有一些 ALTER TABLE 功能。
除了上述功能外,SQLite 是一个完整的 SQL 系统,拥有完整的触发器,交易等等。
回页首
Android 集成了 SQLite 数据库
Android 在运行时(run-time)集成了 SQLite,所以每个 Android 应用程序都可以使用 SQLite 数据库。对于熟悉 SQL 的开发人员来时,在 Android 开发中使用 SQLite 相当简单。但是,由于 JDBC 会消耗太多的系统资源,所以 JDBC 对于手机这种内存受限设备来说并不合适。因此,Android 提供了一些新的 API 来使用 SQLite 数据库,Android 开发中,程序员需要学使用这些 API。
数据库存储在 data/< 项目文件夹 >/databases/ 下。
回页首
Android 开发中使用 SQLite 数据库
Activites 可以通过 Content Provider 或者 Service 访问一个数据库。下面会详细讲解如果创建数据库,添加数据和查询数据库。
创建数据库
Android 不自动提供数据库。在 Android 应用程序中使用 SQLite,必须自己创建数据库,然后创建表、索引,填充数据。Android 提供了 SQLiteOpenHelper 帮助你创建一个数据库,你只要继承 SQLiteOpenHelper 类,就可以轻松的创建数据库。SQLiteOpenHelper 类根据开发应用程序的需要,封装了创建和更新数据库使用的逻辑。SQLiteOpenHelper 的子类,至少需要实现三个方法:
- 构造函数,调用父类 SQLiteOpenHelper 的构造函数。这个方法需要四个参数:上下文环境(例如,一个 Activity),数据库名字,一个可选的游标工厂(通常是 Null),一个代表你正在使用的数据库模型版本的整数。
- onCreate()方法,它需要一个 SQLiteDatabase 对象作为参数,根据需要对这个对象填充表和初始化数据。
- onUpgrage() 方法,它需要三个参数,一个 SQLiteDatabase 对象,一个旧的版本号和一个新的版本号,这样你就可以清楚如何把一个数据库从旧的模型转变到新的模型。
下面示例代码展示了如何继承 SQLiteOpenHelper 创建数据库:
public class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context, String name, CursorFactory cursorFactory, int version)
{
super(context, name, cursorFactory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO 创建数据库后,对数据库的操作
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO 更改数据库版本的操作
}
@Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
// TODO 每次成功打开数据库后首先被执行
}
}
|
接下来讨论具体如何创建表、插入数据、删除表等等。调用 getReadableDatabase() 或 getWriteableDatabase() 方法,你可以得到 SQLiteDatabase 实例,具体调用那个方法,取决于你是否需要改变数据库的内容:
db=(new DatabaseHelper(getContext())).getWritableDatabase();
return (db == null) ? false : true;
|
上面这段代码会返回一个 SQLiteDatabase 类的实例,使用这个对象,你就可以查询或者修改数据库。
当你完成了对数据库的操作(例如你的 Activity 已经关闭),需要调用 SQLiteDatabase 的 Close() 方法来释放掉数据库连接。
创建表和索引
为了创建表和索引,需要调用 SQLiteDatabase 的 execSQL() 方法来执行 DDL 语句。如果没有异常,这个方法没有返回值。
例如,你可以执行如下代码:
db.execSQL("CREATE TABLE mytable (_id INTEGER PRIMARY KEY
AUTOINCREMENT, title TEXT, value REAL);");
|
这条语句会创建一个名为 mytable 的表,表有一个列名为 _id,并且是主键,这列的值是会自动增长的整数(例如,当你插入一行时,SQLite 会给这列自动赋值),另外还有两列:title( 字符 ) 和 value( 浮点数 )。 SQLite 会自动为主键列创建索引。
通常情况下,第一次创建数据库时创建了表和索引。如果你不需要改变表的 schema,不需要删除表和索引 . 删除表和索引,需要使用 execSQL() 方法调用 DROP INDEX 和 DROP TABLE 语句。
给表添加数据
上面的代码,已经创建了数据库和表,现在需要给表添加数据。有两种方法可以给表添加数据。
像上面创建表一样,你可以使用 execSQL() 方法执行 INSERT, UPDATE, DELETE 等语句来更新表的数据。execSQL() 方法适用于所有不返回结果的 SQL 语句。例如:
db.execSQL("INSERT INTO widgets (name, inventory)"+
"VALUES ('Sprocket', 5)");
|
另一种方法是使用 SQLiteDatabase 对象的 insert(), update(), delete() 方法。这些方法把 SQL 语句的一部分作为参数。示例如下:
ContentValues cv=new ContentValues();
cv.put(Constants.TITLE, "example title");
cv.put(Constants.VALUE, SensorManager.GRAVITY_DEATH_STAR_I);
db.insert("mytable", getNullColumnHack(), cv);
|
update()方法有四个参数,分别是表名,表示列名和值的 ContentValues 对象,可选的 WHERE 条件和可选的填充 WHERE 语句的字符串,这些字符串会替换 WHERE 条件中的“?”标记。update() 根据条件,更新指定列的值,所以用 execSQL() 方法可以达到同样的目的。
WHERE 条件和其参数和用过的其他 SQL APIs 类似。例如:
String[] parms=new String[] {"this is a string"};
db.update("widgets", replacements, "name=?", parms);
|
delete() 方法的使用和 update() 类似,使用表名,可选的 WHERE 条件和相应的填充 WHERE 条件的字符串。
查询数据库
类似 INSERT, UPDATE, DELETE,有两种方法使用 SELECT 从 SQLite 数据库检索数据。
1 .使用 rawQuery() 直接调用 SELECT 语句;
使用 query() 方法构建一个查询。
- Raw Queries
正如 API 名字,rawQuery() 是最简单的解决方法。通过这个方法你就可以调用 SQL SELECT 语句。例如:
Cursor c=db.rawQuery(
"SELECT name FROM sqlite_master WHERE type='table' AND name='mytable'", null);
|
在上面例子中,我们查询 SQLite 系统表(sqlite_master)检查 table 表是否存在。返回值是一个 cursor 对象,这个对象的方法可以迭代查询结果。
如果查询是动态的,使用这个方法就会非常复杂。例如,当你需要查询的列在程序编译的时候不能确定,这时候使用 query() 方法会方便很多。
- Regular Queries
query() 方法用 SELECT 语句段构建查询。SELECT 语句内容作为 query() 方法的参数,比如:要查询的表名,要获取的字段名,WHERE 条件,包含可选的位置参数,去替代 WHERE 条件中位置参数的值,GROUP BY 条件,HAVING 条件。
除了表名,其他参数可以是 null。所以,以前的代码段可以可写成:
String[] columns={"ID", "inventory"};
String[] parms={"snicklefritz"};
Cursor result=db.query("widgets", columns, "name=?",parms, null, null, null);
|
使用游标
不管你如何执行查询,都会返回一个 Cursor,这是 Android 的 SQLite 数据库游标,使用游标,你可以:
通过使用 getCount() 方法得到结果集中有多少记录;
通过 moveToFirst(), moveToNext(), 和 isAfterLast() 方法遍历所有记录;
通过 getColumnNames() 得到字段名;
通过 getColumnIndex() 转换成字段号;
通过 getString(),getInt() 等方法得到给定字段当前记录的值;
通过 requery() 方法重新执行查询得到游标;
通过 close() 方法释放游标资源;
例如,下面代码遍历 mytable 表
Cursor result=db.rawQuery("SELECT ID, name, inventory FROM mytable");
result.moveToFirst();
while (!result.isAfterLast()) {
int id=result.getInt(0);
String name=result.getString(1);
int inventory=result.getInt(2);
// do something useful with these
result.moveToNext();
}
result.close();
|
回页首
在 Android 中使用 SQLite 数据库管理工具
在其他数据库上作开发,一般都使用工具来检查和处理数据库的内容,而不是仅仅使用数据库的 API。使用 Android 模拟器,有两种可供选择的方法来管理数据库。
首先,模拟器绑定了 sqlite3 控制台程序,可以使用 adb shell 命令来调用他。只要你进入了模拟器的 shell,在数据库的路径执行 sqlite3 命令就可以了。数据库文件一般存放在:
/data/data/your.app.package/databases/your-db-name
如果你喜欢使用更友好的工具,你可以把数据库拷贝到你的开发机上,使用 SQLite-aware 客户端来操作它。这样的话,你在一个数据库的拷贝上操作,如果你想要你的修改能反映到设备上,你需要把数据库备份回去。
把数据库从设备上考出来,你可以使用 adb pull 命令(或者在 IDE 上做相应操作)。存储一个修改过的数据库到设备上,使用 adb push 命令。
一个最方便的 SQLite 客户端是 FireFox SQLite Manager 扩展,它可以跨所有平台使用。
图 2. SQLite Manager

回页首
结束语
如果你想要开发 Android 应用程序,一定需要在 Android 上存储数据,使用 SQLite 数据库是一种非常好的选择。本文介绍了如何在 Android 应用程序中使用 SQLite 数据库 ,主要介绍了在 Android 应用程序中使用 SQLite 创建数据库和表、添加数据、更新和检索数据,还介绍了比较常用的 SQLite 管理工具,通过阅读本文,你可以在 Android 中轻松操作 SQLite 数据库。
原文 http://www.ibm.com/developerworks/cn/opensource/os-cn-sqlite/index.html
android | 评论:0
| Trackbacks:0
| 阅读:922
Submitted by admin on 2011, June 18, 3:26 PM
本文将对android刷机包的刷机步骤进行简单的解释,本人用的设备是7寸山寨的flytouch,CPU为威盛8505,本次用的固件包为VIA8505的1.7.2,之所以用这个是因为这个固件包的scriptcmd比较完善,在2.0.88中scriptcmd被封装到prepare.bin中了,其实效果应该是一样的。
在此想先提一下Android的启动方式:1.u-boot启动2.加载linux内核3.linux内核进行系统初始化4.在内核的start_kernel()函数的kernel_init()中设定ramdisk_execute_command = "/init";最终在init_post()函数中调用init程序,而这个init程序就是Android编译好的在根目录下的init程序。明白了这个过程,对于理解刷机的原理就方便多了。
下面用红框圈起来的是本刷机包中主要用到的几个文件:

各文件用途:
Android_fs.tgz 整个Android的文件系统,里面文件虽然多,但主要的就是根目录下的文件和System文件夹里的文件,System文件夹里的文件又和Android编译出来的System.img里面的文件类似,所以这里推测,如果修改自己的刷机包,把自己修改好的System文件夹进行一下替换即可,当然要注意驱动的问题。
Ramdisk.gz 应该是linux的根文件系统镜像
Data.tgz 用户数据的部分,里面主要是各种用户程序和安装包,对应编译好的Data.img
uzImage.bin linux内核镜像
u-boot.bin u-boot启动文件
wload.bin 不知道
pre_****_disk文件夹 是可用这里面的文件来替代android_fs.tgz 和data.tgz里面的文件的,因为在后面判断若存在这几个文件夹,会进行相同目录的合并工作,这时肯定要发生替换了。
常用命令格式:
fatload <interface> <dev[:part]> <addr(目的地址)> <filename> [bytes] 仅限内存中
cp source target count
nand write addr off size Nand Flash烧写命令,将SDRAM的 addr地址处的size 字节的数据烧写到Nand的 off 偏移地址。
Scriptcmd中的文件拷贝地址:
nandrw erase all
1.fatload mmc 0 0 script/wload.bin(u-boot)
erase ffff0000 +10000
cp.b 0 ffff0000 10000
cp source target count
即将wload.bin拷贝到内存ffff0000的位置,count=10000
2.fatload mmc 0 0 script/u-boot.bin
erase fff80000 +50000
cp.b 0 fff80000 50000
3.fatload mmc 0 0 script/ramdisk.gz
nand write 0 C00000 $(filesize)
4.fatload mmc 0 0 script/uzImage.bin(这个是linux内核的镜像,u代表是u-boot模式)
nand write 0 0 $(filesize)
5. 设置环境变量:setenv bootargs mem=237M root=/dev/ram rw initrd=0x01000000,32M console=ttyS0,115200n8 init=/linuxrc lcdid=1
fatload mmc 0 1000000 script/mvl5_v5t_ramdisk_WM8505.090922.loop.gz(这个类似linux启动时的initrd文件,mmc代表接口(类似usb)),就是从设备0拷贝,拷到内存地址0x01000000处,不是和以前一样拷到内存地址0处。
6.bootm 0 (bootm [addr [arg ...]] addr是地址,arg是传递给内核的参数)bootm命令可以引导启动存储在内存中的程序映像。这些内存包括RAM和可以永久保存的Flash。作用是从内存地址0处启动,在上面第四点中把uzImage.bin拷贝在内存地址0处,所以这里bootm 0就是执行uzImage.bin,在bootargs中还设置了initrd,所以刷机时第一次加载时是需要initrd来执行的,这里initrd就是mvl5_v5t_ramdisk_WM8505.090922.loop.gz这个文件,先用gzip解压再挂载,就可以看出它其实就是个临时的linux文件系统。
可以看出scriptcmd只负责文件拷贝,文件拷贝完打印"Please wait...",之后就bootm,所以这里出错的可能性很小,有一点是这个刷机包只是支持nand flash的,还有一种是udisk的,所以进行nand write时可能会不行。
之后就要执行update.sh文件了
Update.sh解释:
常用命令格式:
if [ -f /mnt/mmcblk0p1/script/android_fs.tgz ] ; then
(-f 表示判断该文件名是否存在且为文件,-d表示directory,文件夹)
string="Update filesystem Start ......"
echo $string
gui-echo $pointX $pointY "$string" 这里显示字符串要用两个echo
else
exit 0 退出
fi : 结束if条件 将if反过来写
if [ $? -ne 0 ] ; then ……else……: $?是上一个操作的返回值,-ne是not equal 的意思,因为linux中返回0代表出错,所以上面的操作就是若不出错,就执行else中的内容。
猜测:
/dev/mtdblock9为nand flash闪存,因为根文件系统在此处
1. if [ -f /mnt/mmcblk0p1/script/android_fs.tgz ] ; 先判断这个压缩文件是否存在,因为这个文件时超重要的,没有肯定要退出了~~ 这里不知何故sd卡已经自动挂载 到/mnt/mmcblk0p1/了,又是看不见的操作…………,我的猜想是这样的,在scriptcmd中,已经把ramdisk加载到sd卡了,这是个可以运行的linux根文件目录,这里肯定 有/mnt/这个目录的
2. flash_eraseall /dev/mtd9 不解释
3. mount -t yaffs2 /dev/mtdblock9 /mnt/mtd -t只是表示我这次挂载要制定文件类型,文件类型自然为yaffs2了,把/dev/mtdblock9挂载到/mnt/mtd上
4. tar zxvf /mnt/mmcblk0p1/script/android_fs.tgz -C /mnt/mtd 解压到/mnt/mtd上,实际上是解压到/dev/mtdblock9上了,算是耗时最长的一步了。
5. if [ -d /mnt/mmcblk0p1/script/driver ] ; cp -a /mnt/mmcblk0p1/script/driver/* /mnt/mtd 实际还是把驱动拷到设备里
6. tar zxvf /mnt/mmcblk0p1/script/busybox_1.16.tgz -C /mnt/mtd,
if [ -x /mnt/mtd/busybox/bin/ash ] ; then mv /mnt/mtd/system/bin/sh /mnt/mtd/system/bin/sh-org
ln -s /busybox/bin/busybox /mnt/mtd/system/bin/sh 用busybox(不是busybox的sh)把system原来的sh替换掉,不知何故
if [ -d /mnt/mmcblk0p1/script/pre_root_disk ] ; then
7. cp -a /mnt/mmcblk0p1/script/pre_root_disk/* /mnt/mtd /pre_root_disk下的文件和andorid根目录的文件合并(其实没几个文件的,但可以自己添加定制了)
8. cp /mnt/mmcblk0p1/script/data.tgz /mnt/mtd/restore cp /mnt/mmcblk0p1/script/cache.tgz /mnt/mtd/restore 本来还有后面这句的,但自己的刷机包里没 有cache.tgz,也无伤大雅了
9. chmod 777 -R /mnt/mtd chown root:0 /mnt/mtd/system/bin/preboot umount /mnt/mtd 改变根文件系统的权限,改变preboot的拥有者和权限, 最后卸载/mnt/mtd,终于完成使命了?
10. flash_eraseall /dev/mtd10 从哪又冒出来个mtd10? 可能都是临时的吧。
11. mount -t yaffs2 /dev/mtdblock10 /mnt/mtd 这是Data部分的挂载点。
12. tar zxvf /mnt/mmcblk0p1/script/data.tgz -C /mnt/mtd cp -a /mnt/mmcblk0p1/script/etc/* /mnt/mtd/wmtpref cp -a /mnt/mmcblk0p1/script/pre_data_disk/* /mnt/mtd chmod 777 -R /mnt/mtd sync umount /mnt/mtd 修改权限,再卸载掉
13. flash_eraseall /dev/mtd12 mount -t yaffs2 /dev/mtdblock12 /mnt/mtd
14. create_loopfile mtd12 /mnt/mtd/vfat.bin bs=524288
15. mkdosfs /mnt/mtd/vfat.bin 格式化这个loop文件
16. losetup /dev/loop/0 /mnt/mtd/vfat.bin
mount -o iocharset=gb2312 -t vfat /dev/loop/0 /LocalDisk
cp -a /mnt/mmcblk0p1/script/pre_local_disk/* /LocalDisk
losetup -d /dev/loop/0
chmod 777 -R /mnt/mtd sync umount /mnt/mtd
17. flash_eraseall /dev/mtd12
18. mount -t yaffs2 /dev/mtdblock12 /mnt/mtd
19. cp -a /mnt/mmcblk0p1/script/pre_local_disk/* /mnt/mtd
20. echo 0 > /proc/boot-splash
21. if [ -x /mnt/mmcblk0p1/script/update.sh ] ; then 通过判断update.sh文件还在不在来判断是否移除了SD卡
22. reboot
代码部分写的有点乱,但基本原理还是清晰的, update.sh所作的工作无非还是解压,复制,合并这类的工作,和scriptcmd的工作本质上一样的,不过这也像是启动过程的两层引导,stage1和stage2,stage1先把内核加载进来,之后stage2在linux内核下工作就容易多了。
看到这里,相信读者会明白刷机时怎么样会刷坏?而怎么样又不会刷坏?
在刷机的过程中只是文件的解压和复制,所以除非flash不支持或是其他硬件原因,刷机的过程一般是不会出问题的,关键是刷完之后的启动过程。
如果刷的u-boot的版本不对,连u-boot都启动不起来的话,那以后再刷也不行了;如果u-boot和linux内核的版本都正确,只是Android相关的文件运行不正确,虽然机器不能正常启动,但还是可以再刷的;如果u-boot正确,linux内核镜像有问题,那可能刷机过程只执行完scriptcmd就结束了,update.sh无法正确执行,但只要u-boot正确,还是可以再刷的,直到刷回好用的版本。
android | 评论:0
| Trackbacks:0
| 阅读:1018
Submitted by admin on 2011, June 18, 2:32 PM
这段时间在学Android应用开发,在想既然是用Java开发的应该很好反编译从而得到源代码吧,google了一下,确实很简单,以下是我的实践过程。在此郑重声明,贴出来的目的不是为了去破解人家的软件,完全是一种学习的态度,不过好像通过这种方式也可以去汉化一些外国软件。
一.反编译Apk得到Java源代码
首先要下载两个工具:dex2jar和JD-GUI,前者是将apk中的classes.dex转化成Jar文件,而JD-GUI是一个反编译工具,可以直接查看Jar包的源代码。以下是下载地址:dex2jar:http://laichao.googlecode.com/files/dex2jar-0.0.7-SNAPSHOT.zip JD-GUI:http://laichao.googlecode.com/files/jdgui.zip
具体步骤:
- 首先将apk文件,将后缀改为zip,解压,得到其中的classes.dex,它就是java文件编译再通过dx工具打包而成的;
- 解压下载的dex2jar,将classes.dex复制到dex2jar.bat所在目录。在命令行下定位到dex2jar.bat所在目录,运行
生成classes.dex.dex2jar.jar
- 运行JD-GUI,打开上面生成的jar包,即可看到源代码了。
二.反编译apk生成程序的源代码和图片、XML配置、语言资源等文件
如果是只是汉化软件,这将特别有用。首先还是下载工具,这次用到的是apktool,下载地址:
http://code.google.com/p/android-apktool/,apktool-1.0.0.tar.bz2和apktool-install-windows-2.1_r01-1.zip两个包都要下。
具体步骤:
- 将下载的两个包解压到同一个文件夹下,应该会有三个文件:aapt.exe,apktool.bat,apktool.jar;
- 在命令行下定位到apktool.bat文件夹,输入以下命令:
apktool d C:\***.apk C:\***文件夹
命令行解释:apktool d [要反编译的apk文件 ] [输出文件夹],特别注意:你要反编译的文件一定要放在C盘的根目录里;
- 将反编译完的文件重新打包成apk,很简单,输入apktool b c:\***文件夹(你编译出来文件夹)即可。
转
android | 评论:0
| Trackbacks:0
| 阅读:869
Submitted by admin on 2011, June 18, 2:28 PM
一.反编译Apk得到Java源代码
转载自:http://hi.baidu.com/%CB%BF%D4%B5 ... fc541e495403ec.html
工具下载:需用到dex2jar和JD-GUI这2个工具
dex2jar下载地址:http://laichao.googlecode.com/files/dex2jar-0.0.7-SNAPSHOT.zip
JD-GUI下载地址:
windows版JD-GUI:http://laichao.googlecode.com/files/jdgui.zip
Linux版JD-GUI:http://laichao.googlecode.com/fi ... 2.linux.i686.tar.gz
步骤:
1.首先找到Android软件安装包中的classes.dex
把.apk文件改名为.zip,然后解压缩,得到其中的classes.dex文件,它就是java文件编译再通过dx工具打包成的,所以现在我们就用上述提到的2个工具来逆方向导出java源文件
2.把classes.dex拷贝到dex2jar.bat所在目录。
在命令行模式下定位到dex2jar.bat所在目录,运行 dex2jar.bat classes.dex ,生成classes.dex.dex2jar.jar
3.运行JD-GUI工具(它是绿色无须安装的)
打开上面的jar文件,即可看到源代码
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------
二.反编译apk生成程序的源代码和图片、XML配置、语言资源等文件。
转载自:http://blog.sina.com.cn/s/blog_5752764e0100kv34.html
工具下载:
在http://code.google.com/p/android-apktool/下 载获得,apktool-1.0.0.tar.bz2和apktool-install-windows-2.1_r01-1.zip两个包都要下。
步骤:
1.解压缩下载的两个文件包,apktool-install-windows-2.1_r01-1.zip解压缩后得到的包里有aapt.exe 和apktool.bat.(注意要把apktool-1.0.0.tar.bz2解压后的一个.jar 文件copy进来)
2.打开命令窗口 (开始 > 运行,输入cmd,回车。)进入到apktool.bat的文件夹里。
输入:
apktool d C:\***.apk C:\***文件夹
(命令行解释:apktool d 要反编译的文件 输出文件夹)
特别注意:你要反编译的文件一定要放在C盘的根目录里,
3.打开 C:\***文件夹 就可以得到我们学院的各种资源了。
三.将反编译完的文件重新打包成apk
很简单,只要输入:
apktood b c:***文件夹(你编译出来文件夹)
android | 评论:0
| Trackbacks:0
| 阅读:919
Submitted by admin on 2011, June 17, 8:28 PM
refresh_pattern -i \.jpg$ 1440 50% 10080
refresh_pattern -i \.png$ 1440 50% 10080
refresh_pattern -i \.jpeg$ 1440 50% 10080
refresh_pattern -i \.bmp$ 1440 50% 10080
refresh_pattern -i \.psd$ 1440 50% 10080
refresh_pattern -i \.zip$ 1440 50% 10080
refresh_pattern -i \.rar$ 1440 50% 10080
refresh_pattern -i \.jar$ 1440 50% 10080
refresh_pattern -i \.gz$ 1440 50% 10080
refresh_pattern -i \.avi$ 1440 50% 10080
refresh_pattern -i \.mp3$ 1440 50% 10080
refresh_pattern -i \.mp4$ 1440 50% 10080
refresh_pattern -i \.3gp$ 1440 50% 10080
refresh_pattern -i \.pak$ 1440 50% 10080
refresh_pattern -i \.sis$ 1440 50% 10080
refresh_pattern -i \.wml$ 1440 50% 10080
refresh_pattern -i \.umd$ 1440 50% 10080
refresh_pattern -i \.txt$ 1440 50% 10080
refresh_pattern -i \.css$ 1440 50% 4320
refresh_pattern -i \.js$ 1440 50% 4320
refresh_pattern -i \.xml$ 1440 50% 4320
refresh_pattern -i \.htm$ 60 20% 4320
refresh_pattern -i \.html$ 60 20% 4320
squid/缓存 | 评论:0
| Trackbacks:0
| 阅读:956
Submitted by admin on 2011, June 16, 2:48 PM
版本:DEDE所有版本,DEDE_v5,V5.3,V5.5
原因:要创建的目录或者文件没有写入权限
解决办法:
第一步,定位出错的文件,即查找生成什么文件时出的问题。
方法:修改 include/dedetag.class.php文件,搜索"DedeTag Engine Create File False",会找到以下代码
$fp = @fopen($filename,"w") or die("DedeTag Engine Create File False");
修改成
$fp = @fopen($filename,"w") or die("DedeTag Engine Create File False:$filename");
重新生成栏目或者文档时,即可提示当前文件信息。
第二步,找到提示错误的目录或者文件,检查是否有写入权限,windows服务器请给予写入权限,linux服务器请给予777权限。如果目录或者文件不存在,请手工建立。
常见的错误情况有,data目录没有写入权限,html静态文件目录没有写入权限,index.html首页静态文件没有写入权限。
警告:此修改操作可能会暴露程序目录结构信息,建议解决问题以后,还原程序文件
dede | 评论:0
| Trackbacks:0
| 阅读:876