本文转载出处:http://blog.csdn.net/fanchuan0077/article/details/5627218  一分钟明白 VS manifest 原理

请尊重原作者的劳动成果,转载或引用请注明出处。

 

什么是vs 程序的manifest文件

manifest 是VS程序用来标明所依赖的side-by-side组建,如ATL, CRT等的清单。

为什么要有manifest文件

一台pc上,用一组建往往会有不止一个版本(c:/windows/winsxs或系统目录下),程序在加载的时候,不知加载哪个,于是manifest文件来指明。

manifest在哪儿,如何创建。

如果用VS开发,可以Set通过porperty->configuration properties->linker->manifest file->Generate manifest To Yes来自动创建manifest来指定系统的和CRT的assembly版本。

除了这样产生外部的manifest file,还有embedded manifest信息可以被写到所生成的二进制文件内

Set porperty->configuration properties->manifest tool->embed manifest  To Yes

对于xp及早前的windows版本,external manifest会比embed manifest有更高的优先级,但对于windows server及后的版本,相反。

为什么我的manifest明明指明

name="Microsoft.VC80.DebugCRT" version="8.0.50608.0",

但是用depends.exe工具却发现引用的是8.00.50727.42呢?

因为在C:/WINDOWS/WinSxS/Policies下,有publisher configuration file也叫policy文件,如8.0.50727.42.policy文件对依赖做了重定向:

<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC80.DebugCRT" processorArchitecture="ia64" publicKeyToken="1fc8b3b9a1e18e3b"/>
<bindingRedirect oldVersion="8.0.41204.256-8.0.50608.0" newVersion="8.0.50727.42"/>
</dependentAssembly>

指明"8.0.41204.256-8.0.50608.0"都被定向到8.0.50727.42。这是assembly提供商如MS对低级版本bug的修正而提供的解决方法。除此之外,你也可以用application config文件来对本程序做assembly的重定向。如在你bin local文件夹下 yourbin.extention.config:

<configuration>
       <windows>
           <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <dependentAssembly>
        <assemblyIdentity type="win32" name="Microsoft.VC80.ATL" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
        <bindingRedirect oldVersion="8.0.41204.256-8.0.50608.0" newVersion="8.0.50727.42"/>
          </dependentAssembly>
          <dependentAssembly>
        <assemblyIdentity type="win32" name="Microsoft.VC80.DebugCRT" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"/></assemblyIdentity>
        <bindingRedirect oldVersion="8.0.41204.256-8.0.50608.0" newVersion="8.0.50727.42"/>
          </dependentAssembly>
       </assemblyBinding>
       </windows>
</configuration>

如何决定我程序manifest信息所指定的assembly版本信息?

在assembly头文件中,assembly的版本信息被指明了。如crtassem.h中

#ifndef _CRT_ASSEMBLY_VERSION
#define _CRT_ASSEMBLY_VERSION "8.0.50608.0"
#endif

可以修改8.0.50608.0为8.0.50727.42以产生你想要的manifest信息。

若我想将我的程序发布为独立程序集(isolated application),不去依赖目标pc的系统assembly,该怎么办?

带上所有依赖的assembly和相应的manifest文件(c:/windows/winsxs),注意,manifest信息要直接可以指定到所附带的assembly DLLs,不需要依赖policy的重定向。

posted @ 2012-04-25 10:34 疯狂の小石子 阅读(18) 评论(0) 编辑

  最近想跟一帮朋友做点东西,由于几个朋友都身处异地,要想实现版本控制,只能自己搭建一个小的服务器,通过互联网环境来实现版本控制了。本来也在网上找了好多资料,但是总是缺少一些必要的信息,导致最后连接不上服务器。今天好几天的折腾,到网上去查资料,自己动手测试,最后终于搞定了,这里跟大家分享一下,希望对一些朋友会有用。如果文章中有不对的地方,还请大家轻拍砖,多多指正!

【基本原理】

  通过apache或IIS搭建一个小型的服务器,使用花生壳工具或路由器自带的动态域名解析功能,将申请的免费域名绑定动态的IP地址上,利用路由器完成端口映射,通过HTTP协议完成SVN版本控制。

【工具准备】

1、apache工具(xampp):http://www.apachefriends.org/zh_cn/xampp-windows.html#1787     该链接包含三种压缩方式的下载链接,你可以根据自己的喜好去下载相应的版本。至于具体的用法的话,可能需要你自己去研究了,毕竟在本文中不是我们讲述的重点。

2、SVN 服务器(Subversion):http://sourceforge.net/projects/win32svn/  (点击那个Download绿色按钮就会自动下载了)

3、SVN 客户端(TortoiseSVN)http://tortoisesvn.net/downloads.html   (选择相应的处理器版本进行下载)

4、SVN 中文语言包:http://tortoisesvn.net/downloads.html    (在Language Package部分,选择自己对应的语言版本和处理器信息的语言包进行下载,我们就是简体中文)

5、花生壳:http://www.oray.com/peanuthull/download.php   (在此页面,选择你的操作系统版本,进行下载。本文标题是Win7下,自然就乖乖选择Windows吧)

【配置过程】

1、利用花生壳网站申请一个免费的个人域名,利用申请到的护照登录花生壳客户端,在该域名上右键选择“域名诊断”,如果显示了以下图片,就表明动态域名解析已经OK了。大家可以试着ping一下自己申请的域名,应该是可以ping通的。

  

2、安装SVN服务器程序、SVN客户端程序、SVN客户端中文语言包。

  安装好这三个程序之后,在SVN客户端程序的设置里面,配置成中文语言,这样大家使用SVN就更加方便一点了。PS: 当然,如果你习惯玩英文的话,不用装中文语言包也是OK的。

3、安装xampp。(建议安装或解压到不存在空格和中文字符的文件夹目录下)

  如果你下载的是安装版的,直接安装就好了;如果你下载的是非安装版,解压后,执行setup-xampp.bat文件,也能够一样完成安装操作。

 

4、配置端口映射

  登录到路由器,找到“转发规则”--->“虚拟服务器”,然后添加新的条目,如下图所示:

  

5、配置Apache服务

  在目录xampp/apache/conf中找到httpd.conf,分别找到Listen部分和ServerName部分,修改数据如下:

  #Listen 80

  Listen 你的端口号(例如"Listen 8080")

  #ServerName localhost:80

  ServerName 你的花生壳域名:你的端口号(例如“ServerName xxx.gicp.net:8080”)

  保存后重启Apache服务,在浏览器地址栏输入“xxx.gicp.net:8080”,看看能不能看到xampp的首页。如果可以看到,说明你的服务器搭建好了,我们就可以配置SVN服务了。

但是!!!!!!!!!

我的电脑在最开始的时候就是这个地方不行。为什么?

  后来经过各位网友的提示,可能是防火墙的问题,于是将Windows自带的防火墙关闭了,但是还是不行啊!坑爹啊,你装了安全软件,有木有?你妹啊,你装了杀毒软件,有木有!

  如果经过上面的步骤,你们跟我一样不能连接到服务器,还是乖乖的检查一下你的安全类软件的配置吧,看看是不是把入站和出站的规则防护的太严了?不管你们是不是防护的太严,反正我是防护太严了。找到了问题,各位试着关闭安全类软件的防火墙,或者设置一下过滤规则吧,然后再试试打开网址,应该是可以的。当然,不能关着防火墙裸奔吧,嗯,还是把系统自带的防火墙,安全软件的防火墙都设置一个过滤规则吧,允许Apache的服务通过防火墙!

6、配置SVN服务

  在适合的地方新建一个文件夹,用于存放你的第一个SVN版本仓库。进入新建的文件夹,在空白地方右键选择“TortoiseSVN”--->“在此创建版本库”,则在该文件夹下会自动生成几个文件夹和若干个文件,我们不需要对这个文件夹再做其他操作了,如果各位感兴趣可以去查一下每个文件夹的用途。

  将SVN服务器配置成一个开机自动启动的服务,方便每次开机时可以自动开启此服务。打开CMD,进入到SVN服务器Subversion的bin目录下,执行如下命令:

  sc create subversion_service binpath= "c:\subversion\bin\svnserve.exe --service -r 你的版本仓库的目录" displayname= "Subversion Repository" depend= Tcpip

  (注意:以上命令在每个“=”符号之后都有一个空格,请各位博友看清楚哈)

  然后启动该服务,我们的SVN服务器就运行起来了。

  但是,还没有结束。复制svn服务器bin中的四个文件mod_dav_svn.so,mod_authz_svn.so,intl3_svn.dll,libdb44.dll到apache的modules文件夹中, 并修改httpd.conf文件中的配置信息。

  去掉LoadModule dav_module modules/mod_dav.so签名的“#”注释符号,并在其下一行添加如下信息 

  LoadModule dav_svn_module modules/mod_dav_svn.so 

  LoadModule authz_svn_module modules/mod_authz_svn.so 

  在文件最后添加 :
  <Location /svn> 
  DAV svn 
  SVNPath "d:\svn_repository\test" 
  AuthType Basic 
  AuthName "Subversion repositories" 
  AuthUserFile "d:\passwordfile" 
  Require valid-user 
  </Location> 

  保存该文件后,需要重启apache服务。

说明:

/svn是用来访问仓库的 
d:\svn_repository这个是你设置的版本仓库的路径
d:\passwordfile这个是密码文件,现在就来创建该密码文件: 
打开命令窗口cmd 
cd到apache的bin目录,然后输入 
htpasswd -c d:\passwordfile  你的账户名称 
输入两次密码 (是你为账户名称设置的登录密码)
就搞定了 。

 
7、测试
  打开游览器,输入http://xxx.gicp.net:端口号/svn/,输入用户密码(就刚才设置的),如果见到下图,那就万事大吉了。

  

   接下来,你可以用SVN客户端来控制你的版本了。

 

祝各位的实验能够成功了,如果有问题,欢迎各位评论一起研究探讨,多多交流。

posted @ 2011-07-30 13:18 疯狂の小石子 阅读(2847) 评论(16) 编辑

本文转自: http://blog.csdn.net/liaoshengjiong/article/details/3957749

通过参考网上的相关资料,我编译Android源码的步骤如下:

  • 1 我的系统是Ubuntu 8.04
  • 2 系统上必须安装以下工具(摘自网上的资料):
     
     sudo apt-get install build-essential
     sudo apt-get install make 
     sudo apt-get install gcc 
     sudo apt-get install g++ 
     sudo apt-get install libc6-dev
     
     sudo apt-get install flex 
     sudo apt-get install bison 
     sudo apt-get install patch 
     sudo apt-get install texinfo 
     sudo apt-get install libncurses-dev
     
     sudo apt-get install git-core gnupg  //(gnupg系统可能已自带)
     sudo apt-get install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl
     sudo apt-get install ncurses-dev 
     sudo apt-get install zlib1g-dev
     sudo apt-get install valgrind(可选,有21M大,我觉得一般人是用不到的)
     sudo apt-get install python2.5 (实际上不用装,Ubuntu 8.04 已经自带)
     sudo apt-get install sun-java5-jdk
     
     注意: 
     a. 不要用 sun-java6-jdk, 不然在make sdk, 具体来说是make doc这一步中, 遇到这个错误:
       Docs droiddoc: out/target/common/docs/dx
       javadoc: error - In doclet class DroidDoc, method start has thrown an
       exception java.lang.reflect.InvocationTargetException
       com.sun.tools.javac.code.Symbol$CompletionFailure: class file for
       sun.util.resources.OpenListResourceBundle not found
     b. 网上资料说需要设置环境变量, 但我并没有设置:
      export ANDROID_JAVA_HOME=$JAVA_HOME
      
     c. 网上并没有提及要安装ncurses-dev, 但安装之前我编译过程中会出现编译错误.
     
  • 3 建立android源码的存放目录
     $ mkdir ~/open_src
     $ mkdir ~/open_src/android
     $ cd ~/open_src/android
     $ mkdir bi
  • 4 下载repo脚本,放到~/open_src/android/bin目录下,加上可执行权

          $ curl http://android.git.kernel.org/repo > repo
          $ sudo mv repo ~/open_src/android/bin
          $ sudo chmod a+x ~/open_src/android/bin/repo 

  • 5 在源码存放目录android中执行
     $ ~/open_src/android/bin/repo init -u git://android.git.kernel.org/platform/manifest.git
     //中间会提示输入电子邮件什么的,如果你打算要提交patch的话,用google accounts注册过的邮箱
     
  • 6 在android目录中执行repo sync就可以开始下载源码了. 
     我们也可以从其他地方把源码复制到android目录, 而我正是这么做的.
  • 7 编译源码, 并得到~/open_src/android/out 目录
     在命令行执行make命令:
     $make
     这是一个很漫长的过程, 等吧......
  • 8 测试运行
     8.1 先设置环境变量:
      打开~/.bashrc文件, 并在最后添加下面两行:
      export PATH=$PATH:~/open_src/android/out/host/linux-x86/bin
      export ANDROID_PRODUCT_OUT=~/open_src/android/out/target/product/generic
     
     8.2 运行模拟器:
      emulator --debug-init -skin QVGA-L  //可能会提示unknown option: --debug-init, 去掉--debug-init即可
      或者直接执行emulator, 这样使用的是默认的皮肤
     
     如果最后能进入到系统并看到一个大时钟, 说明就大功告成了.
     
     
  • 9 后续编译:

           先在android目录下执行
           $ . build/envsetup.sh
           然后你就会多出几个可用的命令。在改了Contacts联系人项目后,可以简单的执行一下命令来单独编译这个部分:
           $mmm packages/apps/Contacts/
          为了可以直接测试改动,需要生成新的system.img,在android目录下执行:
           $ make snod
          当然,如果你改动的是emulator或者其它外围相关的,而非系统内部的东西,就不只是要重新生成system.img了

  • 以下是编译成功后的最后一些输出:
    Install: out/target/product/generic/system/xbin/scp
    Notice file: system/extras/showmap/NOTICE -- out/target/product/generic/obj/NOTICE_FILES/src//system/xbin/showmap.txt
    Install: out/target/product/generic/system/xbin/showmap
    Notice file: system/extras/showslab/NOTICE -- out/target/product/generic/obj/NOTICE_FILES/src//system/xbin/showslab.txt
    Install: out/target/product/generic/system/xbin/showslab
    Notice file: external/sqlite/dist/NOTICE -- out/target/product/generic/obj/NOTICE_FILES/src//system/xbin/sqlite3.txt
    Install: out/target/product/generic/system/xbin/sqlite3
    Notice file: external/dropbear/NOTICE -- out/target/product/generic/obj/NOTICE_FILES/src//system/xbin/ssh.txt
    Install: out/target/product/generic/system/xbin/ssh
    Install: out/target/product/generic/system/xbin/strace
    Notice file: system/extras/su/NOTICE -- out/target/product/generic/obj/NOTICE_FILES/src//system/xbin/su.txt
    Install: out/target/product/generic/system/xbin/su
    Install: out/target/product/generic/system/xbin/timeinfo
    Copy: out/target/product/generic/system/etc/apns-conf.xml
    Copying: out/target/product/generic/obj/NOTICE_FILES/src/kernel.txt
    Finding NOTICE files: out/target/product/generic/obj/NOTICE_FILES/hash-timestamp
    Combining NOTICE files: out/target/product/generic/obj/NOTICE.html
    gzip -c out/target/product/generic/obj/NOTICE.html > out/target/product/generic/obj/NOTICE.html.gz
    zip -qj out/target/product/generic/system/etc/security/otacerts.zip build/target/product/security/testkey.x509.pem
    Generated: (out/target/product/generic/android-info.txt)
    Target system fs image: out/target/product/generic/obj/PACKAGING/systemimage_unopt_intermediates/system.img
    Install system fs image: out/target/product/generic/system.img
    Target ram disk: out/target/product/generic/ramdisk.img
    Target userdata fs image: out/target/product/generic/userdata.img
posted @ 2011-07-26 15:56 疯狂の小石子 阅读(211) 评论(0)  编辑
摘要: 转自:http://blog.csdn.net/yao_guet/article/details/6626001Android中的联系人都保存在一个SQLite数据库中,有兴趣的可以使用adb直接push出来看一下里面的表和视图的结构,它的路径为:/data/data/com.android.providers.contacts/databases/contacts2.db在联系人数据库中,保存的都是一些小的数据表,即与把所有数据保存成一个表不同,它会对联系人的资料模块化,然后分成多个表保存。表与表之间使用id相关联起来,这样做的目的是尽量减小数据表的规模,提高数据检索的速度,因为我们检索的时阅读全文
posted @ 2011-07-22 17:20 疯狂の小石子 阅读(499) 评论(0)  编辑

  好长时间没有更新博客了,因为这段时间开始学习Java编程思想这本书,希望可以对Java有一个更深入的了解,以便在处理android程序的时候,可以得心应手一些。

  今天在看到Java中的容器时,发现了一些比较有用的东西,就是Java中各种容器的对比,以及使用各种容器的条件,在这里跟大家分享一下。这篇博客,不打算添加描述性的文字了,主要就是几幅图表,当然需要各位有一定的Java基础了。从这些图表中,你们一定了解到在什么条件下使用哪种容器可以提高我们的程序效率。如果各位还木有看过Java编程思想这本书,建议下载下来看看,还是不错的一本书,我在博客的最后会附上该书的电子版本供大家下载,一起学习进步。

一、Java中容器的分类

二、List 类的说明

三、Set类的说明

四、Map类的说明

附:Java编程思想3下载地址 如果下载链接到期,请回帖申请下载。

posted @ 2011-05-12 16:05 疯狂の小石子 阅读(492) 评论(2) 编辑
摘要: 一.基础知识 我们在使用Android手机时,可能会经常用到其中的设置界面,如下所示:图1Android系统中的设置界面 而且对于我们自己开发的一个完整的程序来说,我们也会需要给用户提供一个设置界面使用户可以对程序的一些参数进行设置。因此,我们就来学习下如何实现符合我们需要的一个设置界面,及其背后的数据持久化功能。二.实例开发2.1SharedPreferences 在具体介绍Android的设置界面的实现之前,我们先来介绍一下预备知识,就是Android数据持久化方法中最简单的一种,即使用Preferences的键值对存储方式。这种方式主要用来存储比较简单的一些数据,而且是标准的Boolea阅读全文
posted @ 2011-05-06 10:09 疯狂の小石子 阅读(1835) 评论(0) 编辑
摘要: 简介 在使用Andriod SDK进行应用程序开发的时候,我们需要对源代码进行调试,有可能需要进入到某个Android API函数内部进行跟踪调试。但是,如果目标版本的SDK没有关联对应版本的源代码的话,就会提示你找不到源代码。图:找不到Android源码的提示 我们都知道Android系统是一个开源工程,在网上可以下载到源代码。一般在网上搜索一下,就会找到各种下载源代码的方法,比如使用Git和Repo,android源代码下载的网址是http://android.git.kernel.org/。关于利用Git下载android源代码的方法,我就不再赘述了,因为网上的方法很多,这里给出一个参考阅读全文
posted @ 2011-04-29 22:14 疯狂の小石子 阅读(3495) 评论(6) 编辑
摘要: 前几天,为了解决一个问题,逆了一个小工具软件。在这个过程发现了一些很有用的东西,在此跟大家分享一下。首先声明几点:1、逆出来的代码,需要大量的人工分析,我现在只看了一点点;2、代码不会公开,请不要向我要代码,我怕麻烦~~~唉,做了这件坏事,内心忐~~~忑~~~啊!一、通过编程实现对GPS的开关 在Android手机和模拟器上有一个管理GPS开关的设置界面,如下: 通过这个管理界面,我们可以对GPS进行管理,以实现我们的手机定位功能。曾经在网上搜集资料,希望找到通过代码对GPS进行管理的源码,也确实找到了一份代码(稍后附上代码),但是这份代码在SDK 2.3及以上的版本中,始终不能运行。于是,.阅读全文
posted @ 2011-04-28 17:37 疯狂の小石子 阅读(2692) 评论(7) 编辑
摘要: 转载自doyee最终编辑doyee为了开发android应用,在开发时发现sdk没有源代码,这样在开发时太麻烦了,下面说说如何下载源代码,以及如何配置。 下载源代码需要git,先下载一个git。下面的操作都是在windows下完成的。 在安装好git后,通过git clone git://android.git.kernel.org/platform/frameworks/base.git framework然后运行cd framework 然后运行git tag,显示分支,因为android有很多版本,如得到 >git tag android-1.0 android-1.5 andro阅读全文
posted @ 2011-04-28 17:25 疯狂の小石子 阅读(1660) 评论(0) 编辑
摘要: 因为刚刚接触android和java平台,对JNI到底是什么,还不是很了解,所以从CSDN转载了一篇文章,以便自己对JNI有一个认识,也跟大家分享一下。 JNI是Java Native Interface的缩写。从Java 1.1开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。 使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的,比.阅读全文
posted @ 2011-04-27 23:22 疯狂の小石子 阅读(742) 评论(1) 编辑