Android权限之sharedUserId和签名

最近在做个东西,巧合碰到了sharedUserId的问题,所以收集了一些资料,存存档备份。

安装在设备中的每一个apk文件,Android给每个APK进程分配一个单独的用户空间,其manifest中的userid就是对应一个Linux用户都会被分配到一个属于自己的统一的Linux用户ID,并且为它创建一个沙箱,以防止影响其他应用程序(或者其他应用程序影响它)。用户ID 在应用程序安装到设备中时被分配,并且在这个设备中保持它的永久性。

通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中.所以默认就是可以互相访问任意数据. 也可以配置成运行成不同的进程, 同时可以访问其他APK的数据目录下的数据库和文件.就像访问本程序的数据一样.

对于一个APK来说,如果要使用某个共享UID的话,必须做三步:

1、在Manifest节点中增加android:sharedUserId属性。

2、在Android.mk中增加LOCAL_CERTIFICATE的定义。

如果增加了上面的属性但没有定义与之对应的LOCAL_CERTIFICATE的话,APK是安装不上去的。提示错误是:Package com.test.MyTest has no signatures that match those in shared user .uid.system; ignoring!也就是说,仅有相同签名和相同sharedUserID标签的两个应用程序签名都会被分配相同的用户ID。例如所有和media/download相关的APK都使用android.media作为sharedUserId的话,那么它们必须有相同的签名media。

3、把APK的源码放到packages/apps/目录下,用mm进行编译。

举例说明一下。

系统中所有使用android.uid.system作为共享UID的APK,都会首先在manifest节点中增加android:sharedUserId=”android.uid.system”,然后在Android.mk中增加LOCAL_CERTIFICATE := platform。可以参见Settings等

系统中所有使用android.uid.shared作为共享UID的APK,都会在manifest节点中增加android:sharedUserId=”android.uid.shared”,然后在Android.mk中增加LOCAL_CERTIFICATE := shared。可以参见Launcher等

系统中所有使用android.media作为共享UID的APK,都会在manifest节点中增加android:sharedUserId=”android.media”,然后在Android.mk中增加LOCAL_CERTIFICATE := media。可以参见Gallery等。

另外,应用创建的任何文件都会被赋予应用的用户标识,并且正常情况下不能被其他包访问。当通过getSharedPreferences(String,int)、openFileOutput(String、int)或者openOrCreate Database(String、int、SQLiteDatabase.CursorFactory)创建一个新文件时,开发者可以同时或分别使用MODE_WORLD_READABLE和MODE_WORLD_RITEABLE标志允许其他包读/写此文件。当设置了这些标志后,这个文件仍然属于自己的应用程序,但是它的全局读/写和读/写权限已经设置,所以其他任何应用程序可以看到它。

关于签名:

build/target/product/security目录中有四组默认签名供Android.mk在编译APK使用:

1、testkey:普通APK,默认情况下使用。

2、platform:该APK完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试,这种方式编译出来的APK所在进程的UID为system。

3、shared:该APK需要和home/contacts进程共享数据。

4、media:该APK是media/download系统中的一环。

应用程序的Android.mk中有一个LOCAL_CERTIFICATE字段,由它指定用哪个key签名,未指定的默认用testkey.

 

对于使用eclipse编译的apk,可以使用signapk.jar来手动进行签名,其源码在build/tools/signapk下,编译后在out/host/linux-x86/framework/signapk.jar,也可以从网上下载。使用方法,以platform为例:java -jar ./signapk platform.x509.pem platform.pk8 input.apk output.apk  (platform.x509.pem platform.pk8在build/target/product/security获取)

标签Tags:, , , , , , , , , , , ,

CSS兼容性(IE和Firefox)技巧大全

CSS对浏览器的兼容性有时让人很头疼,或许当你了解当中的技巧跟原理,就会觉得也不是难事,从网上收集了IE7,6与Fireofx的兼容性处理技巧并整理了一下。对于web2.0的过度,请尽量用xhtml格式写代码,而且DOCTYPE 影响 处理,作为W3C的标准,一定要加 DOCTYPE声明。
CSS技巧
1.div的垂直居中问题
vertical-align:middle; 将行距增加到和整个DIV一样高 line-height:200px; 然后**文字,就垂直居中了。缺点是要控制内容不要换行
2. margin加倍的问题
设置为float的div在ie下设置的margin会加倍。这是一个ie6都存在的bug。解决方案是在这个div里面加上display:inline;
例如:

<# id=”imfloat”>
相应的css为
#imfloat{
float:left;
margin:5px;/*IE下理解为10px*/
display:inline;/*IE下再理解为5px*/}

3.浮动ie产生的双倍距离

#box{ float:left; width:100px; margin:0 0 0 100px; //这种情况之下IE会产生200px的距离 display:inline; //使浮动忽略}

这里细说一下block与inline两个元素:block元素的特点是,总是在新行上开始,高度,宽度,行高,边距都可以控制(块元素);Inline元素的特点是,和其他元素在同一行上,不可控制(内嵌元素);

#box{ display:block; //可以为内嵌元素模拟为块元素 display:inline; //实现同一行排列的效果 diplay:table;

4 IE与宽度和高度的问题
IE不认得min-这个定义,但实际上它把正常的width和height当作有min的情况来使。这样问题就大了,如果只用宽度和高度,正常的浏览器里这两个值就不会变,如果只用min-width和min-height的话,IE下面根本等于没有设置宽度和高度。
比如要设置背景图片,这个宽度是比较重要的。要解决这个问题,可以这样:

(更多…)

标签Tags:, , , , , ,

很牛的翻译,看的人都哭了

I heard, that your settled down.
已闻君,诸事安康。
That you, found a girl and your married now.
遇佳人,不久婚嫁。
I heard that your dreams came true.
已闻君,得偿所想。
Guess she gave you things, I didn’t give to you.
料得是,卿识君望。

Old friend, why are you so shy?
旧日知己,何故张皇?
It ain’t like you to hold back or hide from the lie.
遮遮掩掩,欲盖弥彰。

I hate to turn up out of the blue uninvited.
客有不速,实非我所想。
ButI couldn’t stay away, I couldn’t fight it.
避之不得,遑论与相抗。
I’d hoped you’d see my face& that you’d be reminded,
异日偶遇,识得依稀颜。
That for me, it isn’t over.
再无所求,涕零而泪下。

Never mind, I’ll find someone like you.
毋须烦恼,终有弱水替沧海。
I wish nothing but the best, for you too.
抛却纠缠,再把相思寄巫山。
Don’t forget me, I beg, I remember you said:
勿忘昨日,亦存君言于肺腑。
“Sometimes it lasts in love but sometimes it hurts instead”
“情堪隽永,也善心潮掀狂澜。”
Sometimes it lasts in love but sometimes it hurts instead, yeah.
情堪隽永,也善心潮掀狂澜,然。

You’d know, how the time flies.
光阴常无踪,词穷不敢道荏苒。
Only yesterday, was the time of our lives.
欢笑仍如昨,今却孤影忆花繁。
We were born and raised in a summery haze.
彼时初执手,夏雾郁郁湿衣衫。
Bound by the surprise of our glory days.
自缚旧念中,诧喜荣光永不黯。

I hate to turn up out of the blue uninvited.
客有不速,实非我所想。
ButI couldn’t stay away, I couldn’t fight it.
避之不得,遑论与相抗。
I’d hoped you’d see my face& that you’d be reminded,
异日偶遇,识得依稀颜。
That for me, it isn’t over.
再无所求,涕零而泪下。

Never mind, I’ll find someone like you.
毋须烦恼,终有弱水替沧海。
I wish nothing but the best, for you too.
抛却纠缠,再把相思寄巫山。
Don’t forget me, I beg, I remember you said:
勿忘昨日,亦存君言于肺腑。
“Sometimes it lasts in love but sometimes it hurts instead”
“情堪隽永,也善心潮掀狂澜。”
Sometimes it lasts in love but sometimes it hurts instead, yeah.
情堪隽永,也善心潮掀狂澜,然。

Nothing compares, no worries or cares.
无可与之相提,切莫忧心同挂念。
Regret’s and mistakes they’re memories made.
糊涂遗恨难免,白璧微瑕方可恋。
Who would have known how bittersweet this would taste?
此中酸甜苦咸,世上谁人堪相言?

Never mind, I’ll find someone like you.
毋须烦恼,终有弱水替沧海。
I wish nothing but the best, for you too.
抛却纠缠,再把相思寄巫山。
Don’t forget me, I beg, I remember you said:
勿忘昨日,亦存君言于肺腑。
“Sometimes it lasts in love but sometimes it hurts instead”
“情堪隽永,也善心潮掀狂澜。”
Sometimes it lasts in love but sometimes it hurts instead, yeah.
情堪隽永,也善心潮掀狂澜,然。

Never mind, I’ll find someone like you.
毋须烦恼,终有弱水替沧海。
I wish nothing but the best, for you too.
抛却纠缠,再把相思寄巫山。
Don’t forget me, I beg, I remember you said:
勿忘昨日,亦存君言于肺腑。
“Sometimes it lasts in love but sometimes it hurts instead”
“情堪隽永,也善心潮掀狂澜。”
Sometimes it lasts in love but sometimes it hurts instead, yeah.
情堪隽永,也善心潮掀狂澜,然。

标签Tags:

Apache 中 KeepAlive 配置的合理使用

在 Apache 服务器中,KeepAlive 是一个布尔值,On 代表打开,Off 代表关闭,这个指令在其他众多的 HTTPD 服务器中都是存在的。

KeepAlive 配置指令决定当处理完用户发起的 HTTP 请求后是否立即关闭 TCP 连接,如果 KeepAlive 设置为 On,那么用户完成一次访问后,不会立即断开连接,如果还有请求,那么会继续在这一次 TCP 连接中完成,而不用重复建立新的 TCP 连接和关闭 TCP 连接,可以提高用户访问速度。

那么我们考虑3种情况:
1。用户浏览一个网页时,除了网页本身外,还引用了多个 javascript. 文件,多个 文件,多个图片文件,并且这些文件都在同一个 HTTP 服务器上。
2。用户浏览一个网页时,除了网页本身外,还引用一个 javascript. 文件,一个图片文件。
3。 用户浏览的是一个动态网页,由程序即时生成内容,并且不引用其他内容。

对于上面3中情况,我认为:1 最适合打开 KeepAlive ,2 随意,3 最适合关闭 KeepAlive

下面我来分析一下原因。

在 Apache 中,打开和关闭 KeepAlive 功能,服务器端会有什么异同呢?

先看看理论分析。
(更多…)

标签Tags:,

404错误的处理方式及对SEO的影响

404错误的处理方式及对SEO的影响

HTTP 404 错误意味着链接指向的网页不存在,即原始网页的URL失效,这种情况经常会发生,很难避免,比如说:网页URL生成规则改变、网页文件更名或移动位置、导入链接拼写

错误等,导致原来的URL地址无法访问;当Web 服务器接到类似请求时,会返回一个404 状态

码,告诉浏览器要请求的资源并不存在。但是,Web服务器默认的404错误页面,无论Apache

还是IIS,均十分简陋、呆板且对用户不友好,无法给用户提供必要的信息以获取更多线索,

无疑这会造成用户的流失。

因此,很多网站均使用自定义404错误的方式以提供用户体验避免用户流失。一般而言,

自定义404页面通用的做法是在页面中放置网站快速导航链接、搜索框以及网站提供的特色服

务,这样可以有效的帮助用户访问站点并获取需要的信息。
HTTP404对SEO的影响

自定义404错误页面是提供用户体验的很好的做法,但在应用过程中往往并未注意到对搜

索引擎的影响,譬如:错误的服务器端配置导致返回“200”状态码或自定义404错误页面使

用Meta Refresh导致返回“302”状态码。正确设置的自定义404错误页面,不仅应当能够正

确地显示,同时,应该返回“404”错误代码,而不是 “200”或“302”。虽然对访问的用

户而言,HTTP状态码究竟是“404”还是“200”来说并没有什么区别,但对搜索引擎而言,

这则是相当重要的。

(一)自定义404错误页返回“200”状态码

当搜索引擎蜘蛛在请求某个URL时得到“404”状态回应时,即知道该URL已经失效,便不

再索引该网页,并向数据中心反馈将该URL表示的网页从索引数据库中删除,当然,删除过程

有可能需要很长时间;而当搜索引擎得到“200”状态回应时,则会认为该url是有效的,便

会去索引,并会将其收录到索引数据库,这样的结果便是这两个不同的url具有完全相同的内

容:自定义404错误页面的内容,这会导致出现复制网页问题。对搜索引擎而言,特别是

Google,不但很难获得信任指数TrustRank,也会大大降低 Google对网站质量的评定。(为

什么会出现返回“200”状态码的情况??请参看下面内容“自定义404错误页面的基本原则

”)
(二)自定义404错误页使用Meta Refresh返回“302”状态码

常常看到许多网站的自定义404错误页面采取类似这样的形式:首先显示一段错误信息,

然后,通过Meta Refresh将页面跳转到网站首页、网页地图或其他类似页。根据具体实现方

式不同,这类404页面可能返回“200”状态码,也可能返回“302”,但不论哪种,从SEO技

术角度看,均不是一种合适的选择。

对“200”状态的情况我们上面已经谈过,那么,当404页面返回“302” 时,搜索引擎

会怎么对待呢?从理论上说,对“302”,搜索引擎认为该网页是存在的,只不过临时改

变了地址,仍然会索引收录该页,这样,同样会出现类似于“200”状态码时的重复文本问题

;其次,以google为代表的主流搜索引擎对302重定向的适用范围要求越来越严格,这类不当

使用302重定向的情况存在很大的风险。
确保自定义404错误页面能够返回“404”状态码

在自定义404错误页面设置完毕后,一定要检查一下其是不是能够正确地返回“404”状

态码。可以使用Server Header检查工具,输入一个不存在网页的url,查看一下HTTP Header

的返回情况,确信其返回的是“404 Not found”。
404错误的处理方式
(一)定制404错误页面的基本原则

首先应明确的是,404错误应工作在服务器级而不是网页级。对定制使用动态页面如PHP

脚本类型的404页时,必须确保在PHP执行前服务器已经顺利地送出“404”状态码,不然,一

旦执行到了ISAPI级别,返回的状态码便只能是“200”或其他如“302”之类的重定向状态码

了。

其次,在自定义网站的404错误页面时,对设置的错误页面URL链接应使用相对路径而不

是绝对路径,而且自定义404页面应该放在网站根目录下。尽管无效链接可能是多种形式的

URL,但当发生404访问错误时,WEB服务器会自动将其转到自定义的当404错误页中,这跟URL

的形似没有关系。

标签Tags:

监控mysql的工具MysqlReport的windows下安装

监控mysql的工具MysqlReport的安装

下载mysqlreport的pl脚本文件,这个pl脚本地址 http://hackmysql.com/mysqlreport
下载过了的文件是没有后缀的,你要自己加一个.pl后缀
文本编辑器打开,修改如下内容:
安装配置:

修改mysqlreport的 第73 74 75 76 77 行

$mycnf{‘host’}   = “127.0.0.1″;
$mycnf{‘port’}   = “3306″; #mysql的端口
$mycnf{‘socket’} = $op{‘socket’} if have_op ‘socket’;
$mycnf{‘user’}   = “root”;#mysql的用户名
$mycnf{‘pass’}   = “admin”;#mysql的用户名密码

 

在Web页面上嵌入,使用更方便。
接下来就尝试一下:
1、 搭建Apache + Perl 环境;windows下要预先安装安装activeperl5.5.8
2、 配置一下Apache;要启用cgi模块
3、 将MysqlReport脚本放入指定目录(cgi-bin);
4、 访问http://xxx.com.cn/cgi-bin/mysqlreport.pl即可查看运行结果。

注意的是,ActivexPerl连接mysql需要有对应的mysql驱动,安装方法如下:
下下载DBD-mysql.ppd ,下载路径:http://theoryx5.uwinnipeg.ca/ppms/DBD-mysql.ppd

将DBD-mysql.ppd 拷贝到perl/bin目录下
然后再 运行 c:\perl\bin\ppm install DBD-mysql.pps
或者直接运行C:\Documents and Settings\Administrator>ppm install http://theoryx5.uwinnipeg.ca/ppms/DBD-mysql.ppd
即可自动下载。
这样安装完成,
TroubleShooting
1   Apache的错误日志中可能会报

系统找不到指定的路径。  : couldn’t spawn child process:
因为pl文件第一行没有标出perl解释器的位置,改正之后就正常了。修改MysqlReport这个文件
第一行如下 #!c:/Perl/bin/perl.exe -w  (就是perl.exe的路径)

2  通过浏览器访问该mysqlreport.pl时发现是显示该脚本的源代码

这是因为没有启用apache的cgi模块

标签Tags:, ,

CMD命令行重启网卡:Win2003不重启计算机情况下重新启动网卡的方法

方法一:使用netsh

RestartLan.bat

代码

rem 适用于Win2003
rem 把Win2003的ifmon.dll拷贝到WinXP以后WinXP也可以用

rem 禁用网卡
netsh interface set interface name=”本地连接” admin=DISABLED

rem 启用网卡
netsh interface set interface name=”本地连接” admin=ENABLED

方法二:使用devcon.exe

代码

@echo off

rem 需要devcon.exe的支持

echo 请输入你的选择:(禁用网卡为N,启用为Y)

set/p SELECT=

if /i %SELECT%==Y set SELECT=ENABLE&GOTO :D O

if /i %SELECT%==N set SELECT=DISABLE

:D O

for /f “tokens=2 delims=&” %%i in (‘devcon find pci\* ^| findstr “Fast Ethernet”‘) do devcon %SELECT% *%%i*>NUL

(更多…)

标签Tags:

Nginx监控脚本

本shell脚本用于监控Nginx的连接数,Nginx所占用内存的总数,以及进程数。

#/bin/bash

host=`hostname`
ip=`ifconfig eth0 | grep ‘inet addr’|sed ‘s/.*addr://g’|sed ‘s/B.*//g’`
#监控nginx的连接数
http_req=`netstat -nat|grep -i “80″|wc -l `
time_stamp=`date “+%Y/%m/%d %T”`
if [ ${http_req} -ge 300 ];
then
echo “alert ==> ${host}@${ip}: http connection ${http_req} >= 300 @${time_stamp} ”
else
echo “${host}@${ip}: http connection ${http_req} @ ${time_stamp}”
fi
##监控nginx的进程
nginx_proc=`ps -C nginx –no-header | wc -l `
time_stamp=`date “+%Y/%m/%d %T”`
if [ ${nginx_proc} -ge 100 ]
then
echo “alert ==> ${host}@${ip}: nginx process ${nginx_proc} >= 100 @${time_stamp} ”
else
echo “${host}@${ip}: nginx process ${nginx_proc} @ ${time_stamp}”
fi

#监控nginx所占用的内存总数
nginx_mem=`top -b -n1 | grep nginx |gawk ‘{sum += $6}; END {print int(sum/1024)}’ `
time_stamp=`date “+%Y/%m/%d %T”`
if [ ${nginx_mem} -ge 500 ]
then
echo “alert ==> ${host}@${ip}: nginx memory usage ${nginx_mem} MB >= 500 @${time_stamp} ”
else
echo “${host}@${ip}: nginx memory ${nginx_mem}MB @ ${time_stamp}”
fi

标签Tags:

利用Tomcat建立多个Web Server的方法:tomcat 配置多个

通过配置多个<Service>元素(多端口 多应用)
在<Server>下配置多个<Service>元素
修改server.xml文件,在</server>之前插入,其中请注意修改 docBase=”c:/apache-tomcat-6.0.18/app2″为你的。
还有端口号。
<Service name=”Catalina2″>
<Connector acceptCount=”100″ connectionTimeout=”20000″ disableUploadTimeout=”true” port=”8090″ redirectPort=”8453″ maxSpareThreads=”75″ maxThreads=”150″ minSpareThreads=”25″/>

<Connector port=”8019″ protocol=”AJP/1.3″ protocolHandlerClassName=”org.apache.jk.server.JkCoyoteHandler” redirectPort=”8453″/>

<Engine defaultHost=”localhost” name=”Catalina”>

<Host appBase=”app2″ name=”localhost”>

<Context path=”" docBase=”c:/apache-tomcat-6.0.18/app2″ debug=”0″ reloadable=”true”></Context>

</Host>

<Realm className=”org.apache.catalina.realm.UserDatabaseRealm”/>

</Engine>

</Service>

这个时候可以通过访问 http://localhost:8090/ 来进行访问

标签Tags:

APT命令的用法

Apt命令 作用

apt-cache search package 搜索包

apt-cache show package 获取包的相关信息,如说明、大小、版本等 sudo apt-get install package 安装包

sudo apt-get install package – – reinstall 重新安装包

sudo apt-get -f install 强制安装

sudo apt-get remove package 删除包

sudo apt-get remove package – – purge 删除包,包括删除配置文件等 sudo apt-get autoremove 自动删除不需要的包

sudo apt-get update 更新源

sudo apt-get upgrade 更新已安装的包

sudo apt-get dist-upgrade 升级系统

sudo apt-get dselect-upgrade 使用 dselect 升级

apt-cache depends package 了解使用依赖

apt-cache rdepends package 了解某个具体的依赖

sudo apt-get build-dep package 安装相关的编译环境

apt-get source package 下载该包的源代码

sudo apt-get clean && sudo apt-get autoclean 清理下载文件的存档 sudo apt-get check 检查是否有损坏的依赖

标签Tags: