30-08-2015 1 条评论

需要具备的条件

  1. Windows 10 – 必须是 Windows 计算机(不是虚拟机)。
  2. Raspberry Pi 2
  3. 5V 微型 USB 电源 – 使用至少 1.0A 电流。
  4. 8GB 微型 SD 卡 – 类 10 或更高。(我们建议使用这个这个
  5. HDMI 电缆(如果需要显示)。
  6. 以太网电缆

如果要使用多个 USB 外设或高电流设备,请使用电流较高的电源 (>2.0A)。

将 Windows 10 IoT Core 映像放在 SD 卡上

我们提供了一个实用工具,用于使用 Windows 10 IoT Core 设置你的 SD 卡。以下步骤只能在运行 Windows 10(版本 10069 或更高版本)的系统上执行。

注意:你将需要在物理 Windows 计算机(而不是 VM)上遵循这些说明操作,因为你需要对 SD 卡读卡器的访问权限。

遵循以下说明配置 SD 卡:

  1. 请在 Microsoft Connect 上注册,它是我们的软件发布管理平台。
    • 你将需要拥有 Microsoft 帐户
    • 如果已在 Microsoft Connect 上注册加入了我们的计划(或不确定之前是否注册过),你将只会看到一个空白页面。
    • 如果你之前尚未在 Connect 上注册加入我们的计划,它将提示你创建社交资料并接受许可协议。按照注册 Microsoft Connect 的分步说明进行操作。
  2. 登录后,请导航到“调查”,并完成所有调查。

  3. 从 Microsoft Connect 下载程序包“适用于 Raspberry Pi 2 的 Windows 10 IoT Core 映像”。
    • 如果你看到空白页面或未列出下载,请通过查看屏幕右上方的登录信息,确保你已登录到 Microsoft Connect。如果你未登录,请通过单击登录。
  4. 从下载选择板类型,然后继续下载这些文件

  5. 一个窗口将在桌面上弹出。单击“浏览”,选择你希望放置文件夹的位置,然后单击“传输”

    当完成传输时,请关闭窗口。

  6. 创建包含在 Windows_IoT_Core_RPI2_BUILD.zip 中的 flash.ffu 的本地副本

  7. 将 SD 卡插入你的 SD 读卡器。
  8. 打开“管理员命令提示符”,并导航到包含本地 flash.ffu 的文件夹。

  9. 找到 SD 卡在你的计算机上所显示的磁盘编号。在下一步中应用映像时,将会用到此磁盘编号。为此,你可以使用 diskpart 实用工具。运行以下命令:

    diskpart

    list disk

    exit

  10. 使用管理员命令提示符,将映像应用到 SD 卡。运行以下命令:

    dism.exe /Apply-Image /ImageFile:flash.ffu /ApplyDrive:\\.\\PhysicalDriveN /SkipPlatformCheck

    • 请务必将 PhysicalDriveN 替换为你在上一步骤中找到的值;例如,如果你的 SD 卡磁盘号为 3,请使用

    /ApplyDrive:\\.\\PhysicalDrive3

  11. 单击任务栏中的“安全删除硬件”图标,然后选择你的 USB SD 读卡器以将其从系统中安全删除。如果未正确执行此操作,可能导致映像损坏。

连接开发板

  1. 插入你在上述部分中准备的微型 SD 卡(插槽在如下所示的开发板的另一侧)。
  2. 将网络电缆连接到开发板上的以太网端口。
  3. 将 HDMI 监视器连接到开发板上的 HDMI 端口。
  4. 将电源连接到开发板上的微型 USB 端口。

启动 Windows 10 IoT Core

  1. 连接电源后,Windows 10 IoT Core 将自动启动。
  2. 首次启动时,Windows IoT Core 将进行一些首次启动配置,并且同时将显示一个默认的蓝色应用程序。等待几分钟,开发板将自动重新启动。这只会发生一次,然后 DefaultApp 将出现,显示 Raspberry Pi 2 的 IP 地址。
  3. 遵循此处 Powershell 文档,使用 PowerShell 连接到正在运行的设备。
  4. 强烈建议你更新管理员帐户的默认密码(默认用户名:Administrtor,默认密码: p@ssw0rd)
  5. 当 Raspberry Pi 2 启动时,远程调试程序将自动启动。
28-08-2014 3 条评论

错误原因:API等级 API 20:Android 4.4w,这是Android官网发布的可穿戴设备的API,它是不支持EditText组件的;

解决方案:在bulid.gradle里面将API版本改成19即可

参考:https://stackoverflow.com/questions/24451490/exception-raised-during-rendering-java-lang-system-arraycopy


27-06-2013 0 条评论

最近莫名奇妙遇到“Conversion to Dalvik format failed: Unable to execute dex”错误,stackoverflow以后得到结果

把项目中classpath文件中<classpathentry kind="lib"   path ="自定义jar的地址" /> 修改成 <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>,删掉
<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>。然后就OK了

11-06-2013 0 条评论

首先请选择你的机型对应的固件,不要选错
iPhone 5(Model A1429 – 电信、联通、国行、港行、新加坡行,除美国加拿大 AT&T )
– http://pan.baidu.com/share/link?shareid=420116897&uk=4144241008
– https://mega.co.nz/#!qwIGlBQL!GryQXyLOuTdwOaz2FidWrnCO748C65FPS4pOlQgJCg8
iPhone 5(Model A1428 – 仅供美国、加拿大 AT&T 版本)
– http://pan.baidu.com/share/link?shareid=487091525&uk=4144241008
– https://mega.co.nz/#!HwRW3Bqb!U_PBaVaYun-i3v1AM5e-rWpAQkYeI2Xdnxcksm_ZmT4
iPhone 4S
– https://mega.co.nz/#!Dsw0DJqA!UUDsBw-8oJft0sOYkBZeCWM9ijofsCNm1obLlMpmV0M
iPhone 4 (GSM)
– https://mega.co.nz/#!n15VQBDK!R8jMCW7X_Ojd_NKPShPUYEtVcC9PzaVeisFeZXq1BSg
iPhone 4 (GSM Rev A)
– https://mega.co.nz/#!S4ADnJbR!HwjgdCAG32lOe7sHnWegzCbWX4EXKCTQTUMtCYpinPM
iPhone 4 (CDMA)
– https://mega.co.nz/#!GhYRwARb!YvRWUEVLB7BbeumyT0shQHnVphQwuVPjHk8EgFi08n8
iPod touch 5th Gen
– https://mega.co.nz/#!Wgwg1YAT!ZJpJCV_7pnyBbAmz54O21DK8s9xA9Vp2gHqP_N0yj3E

请你确定你的iPhone是未越狱的,越狱状态下的 iPhone 切勿直接升级 iOS 7 beta——是无法激活的。
请先升级到 6.1.4 或 6.1.3(4S)固件,将机器恢复至未越狱状态。
然后开始升级工作,mac 系统下请先双击打开 dmg,即可看到 ipsw 固件文件;使用 windows 系统的朋友请参照这个帖子打开 dmg 文件找到 ipsw:http://bbs.we iPhone .com/read-htm-tid-2946944.html。
 打开 iTunes,按住 option 键(或 windows 下的 shift 键),点击[检查更新](注意是更新而不是恢复!),选择刚才加载的 dmg 中的 ipsw 固件文件即可。下面就等待成功吧。

18-04-2013 0 条评论

Eclipse 编译 Android工程时,提示该错误 :Error generating final archive:java.io.EOFException
问题所在及解决方法:
在Eclipse菜单Window -> Preferences -> Android -> Build,找到那个Default debug keystore显示的路径,就是debug.keystore这个文件(expired)过期了,它的路径就是文章《Android环境搭建及相关命令》里面说的设置SD卡img文件的上一层目录.android。
所以不论Windows系统还是Linux系统,只要删除这个debug.keystore就行了,Eclipse会自动生成一个新的,默认有效期也是一年。

13-02-2013 0 条评论

在iOS6越狱发布前夕,大神一直提醒大家千万不要使用OTA升级自己的iOS设备,于是在各大水果论坛和网站都盛传OTA升级将无法越狱,而当越狱正是发布之后,大家发现即时OTA升级到最新iOS6.1.1版本都可以正常越狱,越狱以后系统依然稳定,和使用恢复升级没有任何差异。于是广大果粉开始质疑大神的警告,那OTA到底影响越狱吗?

在解答这个问题之前,我们先要了解一下是什么是OTA和越狱?

OTA(Over-the-Air Technology)空中下载技术。是通过移动通信(GSM或CDMA)的空中接口对SIM卡数据及应用进行远程管理的技术。苹果在iOS5中提供了OTA功能,这意味用户不再需要依靠电脑,可以直接在iOS设备上升级自己的系统。同时OTA升级采用的是增量升级的方法,例如最新6.1.1的升级补丁是23MB,如果使用传统iTunes升级则需要920MB,对于小水管的中国用户还是很有价值的。不仅如此,使用OTA升级可以完全保留系统中的应用程序和个人数据,而传统iTunes升级将需要重装所有应用程序(个人数据可以通过iCloud或者iTunes备份)。

越狱就不解释,大家都明白,就是获取系统的最高权限,类似于Android系统的Root。

如果从上面的内容看,似乎OTA和越狱并没有任何关系,越狱是针对iOS本身的,OTA只是iOS的一种升级方式,无论通过何种方式升级获得的iOS系统理论都是一样的,并没有区别,因此这就是为什么OTA升级后大家依然可以越狱的原因,那么到底是什么原因使得大神要劝告大家不要OTA升级呢?

这里,我要先解释另一个名词“SHSH”。SHSH的全称是Signature Hash blobs,中文:签名散列。 shsh就是验证iTunes恢复固件操作合法性的一个证书。当我们用iTunes进行恢复固件操作时,iTunes会向苹果验证服务器提交待恢复固件设备的ECID,并申请获取恢复该版固件的shsh验证证书(也就是说每个版本的固件,好比4.3.2版,4.3.3版和4.3.5版固件对应的shsh都是不一样,都是唯一的),苹果会通过验证服务器发送一个和ECID对应的shsh证书给iTunes,这样iTunes就可以继续进行和这个shsh相对应版本的固件恢复。打个比方shsh就好比一个钥匙,你有了4.3.3编号的钥匙才让你打开4.3.3编号的锁,你才能进4.3.3编号的家门。shsh文件存在于苹果服务器上,而且每当新固件发布时,苹果就会关闭前一版本shsh文件的提供,那我们在恢复固件尤其在为了完美越狱需要降级时又必须有相应版本所对应的shsh文件,这时就显得备份shsh的重要性了。同样打个比方,苹果提供4.3.5编号的钥匙了,就收起4.3.3编号的钥匙不给你了,所以你应该在苹果还给你4.3.3编号钥匙的时候就去备份一下钥匙。很不幸的是,当你现在看见这篇文章的时候,苹果真的已经不提供6.1之前的shsh了。

问题就在这个SHSH上,由于某些因素,iTunes恢复和OTA升级的系统获得SHSH并不相同,这就意味如果你使用OTA升级所获取的SHSH在苹果关闭对应SHSH服务并不能用于降级和平刷。或许这样说大家不容易明白,那我就举个例子。例如现在张老师有一台iPhone5,出厂是6.0.1,现在他要升级到6.1,无论使用iTunes恢复还是OTA,他都可以越狱。但是当苹果发布iOS7以后,并关闭6.1的SHSH认证以后,张老师万一尝鲜升级到iOS7或者不小心安装360需要重新刷机,如果使用OTA升级,那他备份的SHSH永远不把他的iPhone5带回6.1,而使用iTunes升级则可以随时恢复6.1(其实也不然,A5以上的设备即时有iTunes备份的SHSH暂时也无法降级,但是使用A4的iPhone4和iTouch4都是可以的)。

所以,其实OTA本身并不影响越狱,关键是OTA升级后我们无法备份正确的SHSH,这样我们就无法获取随心所欲的降级或平刷我们的系统。因此,如果你是水果玩家,我还是推荐老老实实使用iTunes升级;如果你是普通用户,或者像我这样懒得折腾,也不是非常注重是不是可以越狱的,那么OTA则是最为便捷的方式。

05-02-2013 1 条评论

参考文献:http://blog.csdn.net/fightingbull/article/details/8059651

AppSync其实这个方法早就有,但是前提是你的测试终端需要安装AppSync,但是除了大神,谁可以在iOS6上安装AppSync?好吧,这个问题现在已经解决了,因为大神把iOS6的破解放出来了,好吧现在就开始吧。

第一步,创建假证书

创建证书的过程比较简单,打开实用工具-钥匙串访问。然后在菜单栏里点击钥匙串访问-证书助理-创建证书来打开向导。第一个步骤比较重要,必须 要把名称命名为iPhone Developer,将类型设定为代码签名,将"让我覆盖这些默认值"选中。之后的步骤无需更改,一路点击“确定”和“继续”来完成这个向导就可以。

第二步,安装Xcode4.5.2

下载Xcode4.5.2,并安装。需要注意的是从Xcode4.4.1之后Xcode就变成了独立运行程序(stand-alone),其安装变成了Copy。首先将dmg里的Xcode复制到Applications目录下,然后运行,此过程中会出现简单的配置过程。

第三步,修改Xcode的配置文件

需要修改配置文件有两个SDKSettings.plist和Info.plist,在Xcode4.5以前这两个文件都是xml格式,而这之后变成了二进制格式,需要用Xcode来编辑这两个文件。
(1)SDKSettings.plist修改
1) 从Finder中进入文件所在目录
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk
2) 找到SDKSettings.plist文件,并鼠标右击Duplicate一份,在同目录下产生SDKSettings copy.plist文件。
3)双击打开SDKSettings copy.plist文件,默认用Xcode,找到DefaultProperties分支,将下面的CODE_SIGNING_REQUIRED和ENTITLEMENTS_REQUIRED两个属性改为NO
4)如果需要备份原文件,则将原文件改名为SDKSettings.plist.bak。然后将SDKSettings copy.plist,改名为SDKSettings.plist。
(2)修改Info.plist
1) 从Finder中进入文件所在目录
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform
或是从(1)中后退到该目录。
2) 找到Info.plist文件,并鼠标右击Duplicate一份,在同目录下产生Info copy.plist文件。
3)双击打开Info copy.plist文件,默认用Xcode,将全部的XCiPhoneOSCodeSignContext修改成 XCCodeSignContext,即将其中的iPhoneOS去掉,Xcode4.5.1有三处分别位于DefaultProperties分支下、RuntimeRequirements->Classes和OverrideProperties分支下。
4)如果需要备份原文件,则将原文件改名为Info.plist.bak。然后将Info copy.plist,改名为Info.plist。

第四步,修改工程设置
特别注意:本阶段之前的修改配置文件、准备脚本等,只需要做一次。但本阶段的操作,对每个需要真机调试的工程都要做一遍。
这个步骤的主要作用是支持真机调试,如果不做这个步骤,仍然可以通过步骤5来生成ipa在真机上运行,但是无法使用Xcode内置的调试器对在真机上运行的程序进行单步跟踪。如果您的程序在点击Run真机调试时秒退,请检查此步骤是否正确完成。
 (1)禁用Xcode自动的签名操作
将工程配置中所有的Code Signing选项全部设为Don’t Code Sign,如图。可能需要先点击“All”让这个选项显示出来

(2)添加自定义的生成后脚本
在Build Phases中添加一个Phase,右下角的Add Build Phase,然后单击Add Run Script,输入以下脚本

export CODESIGN_ALLOCATE=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate
if [ "${PLATFORM_NAME}" == "iphoneos" ] || [ "${PLATFORM_NAME}" == "ipados" ]; then
/Applications/Xcode.app/Contents/Developer/iphoneentitlements/gen_entitlements.py "my.company.${PROJECT_NAME}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent";
codesign -f -s "iPhone Developer" --entitlements "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/"
fi

至此配置全部完成,下面就可以插上iPhone,重新选择生成目标来测试一下在线调试了!如果是第一次使用该设备调试,请先在Organizer中将设备切换为开发模式,

12-01-2013 2 条评论
public class busRoute extends MapActivity {

	private Button mBtnTransit = null; // 公交搜索
	private ListView busList;// 公交列表


	private MapView mMapView = null; // 地图View
	private MKSearch mSearch = null; // 搜索模块,也可去掉地图模块独立使用
	private MapController mapController;

	protected void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);
		setContentView(R.layout.busroute);

		BMapApiDemoApp app = (BMapApiDemoApp) this.getApplication();
		if (app.mBMapMan == null) {
			app.mBMapMan = new BMapManager(getApplication());
			app.mBMapMan.init(app.mStrKey,
					new BMapApiDemoApp.MyGeneralListener());
		}
		app.mBMapMan.start();
		// 如果使用地图SDK,请初始化地图Activity
		super.initMapActivity(app.mBMapMan);

		mMapView = (MapView) findViewById(R.id.bmapView);
		mMapView.setBuiltInZoomControls(true);
		// 设置在缩放动画过程中也显示overlay,默认为不绘制
		mMapView.setDrawOverlayWhenZooming(true);

		GeoPoint geoPoint = new GeoPoint((int) (32.05000 * 1E6),
				(int) ( 118.78333* 1E6));

		// 取得地图控制器对象,用于控制MapView
		mapController = mMapView.getController();
		// 设置地图的中心
		mapController.setCenter(geoPoint);
		// 设置地图默认的缩放级别
		mapController.setZoom(12);

		// 初始化搜索模块,注册事件监听
		mSearch = new MKSearch();
		mSearch.init(app.mBMapMan, new MKSearchListener() {

			@Override
			public void onGetPoiDetailSearchResult(int type, int error) {
			}

			public void onGetDrivingRouteResult(MKDrivingRouteResult res,
					int error) {
				
			}

			public void onGetTransitRouteResult(MKTransitRouteResult res,
					int error) {
				if (error != 0 || res == null) {
					Toast.makeText(busRoute.this, "抱歉,未找到结果",
							Toast.LENGTH_SHORT).show();
					mMapView.setVisibility(View.VISIBLE);
					busList.setVisibility(View.GONE);
					return;
				}
				MyAdapter myAdapter = new MyAdapter(busRoute.this, res);
				busList.setAdapter(myAdapter);
			}

			public void onGetWalkingRouteResult(MKWalkingRouteResult res,
					int error) {
				
			}

			public void onGetAddrResult(MKAddrInfo res, int error) {
			}

			public void onGetPoiResult(MKPoiResult res, int arg1, int arg2) {

			}

			public void onGetBusDetailResult(MKBusLineResult result, int iError) {
			}

			@Override
			public void onGetSuggestionResult(MKSuggestionResult res, int arg1) {
				// TODO Auto-generated method stub

			}

			@Override
			public void onGetRGCShareUrlResult(String arg0, int arg1) {
				// TODO Auto-generated method stub

			}
		});

		// 设定搜索按钮的响应
		busList = (ListView) findViewById(R.id.bus_list);
		busList.setCacheColorHint(0);
		mBtnTransit = (Button) findViewById(R.id.transit);

		OnClickListener clickListener = new OnClickListener() {
			public void onClick(View v) {
				mMapView.setVisibility(View.GONE);
				busList.setVisibility(View.VISIBLE);
				SearchButtonProcess(v);
			}
		};
		mBtnTransit.setOnClickListener(clickListener);
	}

	void SearchButtonProcess(View v) {
		// 处理搜索按钮响应
		EditText editSt = (EditText) findViewById(R.id.start);
		EditText editEn = (EditText) findViewById(R.id.end);

		// 对起点终点的name进行赋值,也可以直接对坐标赋值,赋值坐标则将根据坐标进行搜索
		MKPlanNode stNode = new MKPlanNode();
		stNode.name = editSt.getText().toString();
		MKPlanNode enNode = new MKPlanNode();
		enNode.name = editEn.getText().toString();

		// 实际使用中请对起点终点城市进行正确的设定
		if (mBtnTransit.equals(v)) {
			mSearch.transitSearch("南京", stNode, enNode);
		} 
	}

	@Override
	protected void onPause() {
		BMapApiDemoApp app = (BMapApiDemoApp) this.getApplication();
		app.mBMapMan.stop();
		super.onPause();
	}

	@Override
	protected void onResume() {
		BMapApiDemoApp app = (BMapApiDemoApp) this.getApplication();
		app.mBMapMan.start();
		super.onResume();
	}

	@Override
	protected boolean isRouteDisplayed() {
		// TODO Auto-generated method stub
		return false;
	}

	// 填充公交列表
	class MyAdapter extends BaseAdapter {
		private MKTransitRouteResult res;
		private LayoutInflater mInflater;

		public MyAdapter(Context context, MKTransitRouteResult res) {
			this.res = res;
			this.mInflater = LayoutInflater.from(context);
		}

		@Override
		public int getCount() {
			return res.getNumPlan();
		}

		@Override
		public Object getItem(int position) {
			return position;
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			HolderView holder = null;
			if (convertView == null) {
				holder = new HolderView();
				convertView = mInflater.inflate(R.layout.list_item, null);
				holder.txt = (TextView) convertView
						.findViewById(R.id.list_item_txt);
				convertView.setTag(holder);
			} else {
				holder = (HolderView) convertView.getTag();
			}
			String lineInfo = "";
			// 得到解决方案
			MKTransitRoutePlan routePlan = res.getPlan(position);
			// 公交线路
			MKLine mkLine = routePlan.getLine(0);
			lineInfo += "乘坐:" + mkLine.getTitle();
			MKPoiInfo mkOnPoiInfo = mkLine.getGetOnStop();
			MKPoiInfo mkOffPoiInfo = mkLine.getGetOffStop();
			lineInfo += "ntttt从" + mkOnPoiInfo.name + "上车,在"
					+ mkOffPoiInfo.name + "下车";
			if (routePlan.getNumLines() > 0) {
				// 循环当前方案公交路线
				for (int i = 1; i < routePlan.getNumLines(); i++) {
					// 公交线路
					mkLine = routePlan.getLine(i);
					lineInfo += "n换成:" + mkLine.getTitle();
					mkOnPoiInfo = mkLine.getGetOnStop();
					mkOffPoiInfo = mkLine.getGetOffStop();
					lineInfo += "ntttt从" + mkOnPoiInfo.name + "上车,在"
							+ mkOffPoiInfo.name + "下车";
				}
			}
			holder.txt.setText(lineInfo);
			convertView
					.setOnClickListener(new MyListViewOnClick(position, res));
			return convertView;
		}
	}

	class HolderView {
		public TextView txt;
	}

	class MyListViewOnClick implements OnClickListener {
		private int index;
		private MKTransitRouteResult res;

		public MyListViewOnClick(int index, MKTransitRouteResult res) {
			this.index = index;
			this.res = res;
		}

		@Override
		public void onClick(View arg0) {
			TransitOverlay routeOverlay = new TransitOverlay(busRoute.this,
					mMapView);
			routeOverlay.setData(res.getPlan(index));
			mMapView.getOverlays().clear();
			mMapView.getOverlays().add(routeOverlay);
			mMapView.invalidate();
			mMapView.getController().animateTo(res.getStart().pt);
			busList.setVisibility(View.GONE);
			mMapView.setVisibility(View.VISIBLE);
		}
	}
}

下面是鄙人的代码,感谢发现错误和提出意见:

基于百度地图API的公交换乘导航

DEMO APK下载:

busMapDeno.apk 

31-10-2012 0 条评论

Windows Phone 软件开发包 (SDK) 8.0 可为您提供开发 Windows Phone 8 和 Windows Phone 7.5 应用和游戏所需的工具。

概述

Windows Phone SDK 8.0 是一个功能齐全的开发环境,可用于构建 Windows Phone 8.0 和 Windows Phone 7.5 的应用和游戏。 Windows Phone SDK 将提供一个适用于 Windows Phone 的独立 Visual Studio Express 2012 版本或作为 Visual Studio 2012 Professional、Premium 或 Ultimate 版本的外接程序进行工作。 借助 SDK,您可以使用现有的编程技巧和代码来构建托管或本机代码应用。
此外,SDK 还包括在实际条件下用于分析和测试 Windows Phone 应用的多个模拟器和其他工具。

系统要求

支持的操作系统: Windows Phone

    • Windows 8 64 位 (x64) 客户端版本
  • 硬件:
    • 4 GB 的可用硬盘空间
    • 4 GB RAM
    • 64 位 (x64) CPU
  • Windows Phone 8 模拟器:
    • Windows 8 Pro 版本或更高版本
    • 要求支持二级地址转换 (SLAT) 的处理器

    如果您的计算机符合硬件和操作系统要求,但却不符合 Windows Phone 8 模拟器的要求,将安装和运行 Windows Phone SDK 8.0。 然而,Windows Phone 8 模拟器将不起任何作用,而且您无法在 Windows Phone 8 模拟器上部署或测试应用。

说明

  • 选择您想要安装的语言版本并单击 WPexpress_full.exe 文件的“下载”按钮。 按照说明安装 SDK。 请注意,Windows Phone SDK 8.0 的每个本地化版本皆被设计为与相应的本地化操作系统和 Visual Studio 2012 的本地化版本结合使用。
    请注意 – Windows Phone SDK 8.0 将与 Windows Phone SDK 的早期版本并行安装。 在开始安装之前,无需卸载早期版本。
  • 下载独立文件中的发行说明。 有关 Windows Phone SDK 8.0 的文档和示例,请参见 Windows Phone 开发人员中心
  • 要启动 VS Express for Windows Phone,请单击应用列表中的应用程序。 如果您已在计算机上安装了 Visual Studio Professional、Premium 或 Ultimate,将不会出现 VS Express for Windows Phone 快捷方式。 而是照常启动 Visual Studio 示例,然后使用已安装的 Windows Phone 模板创建 Windows Phone
    SDK 8.0 项目。
  • 如果您在 Hyper-V 未启用时尝试运行 Windows Phone 模拟器中的项目,系统会提示您打开 Hyper-V。打开 Hyper-V 将要求您重新启动计算机。

请注意:此版本也以 .iso 格式提供。
选择下列选项之一来处理下载的 ISO 映像:

  • (推荐)将映像文件写入空白 DVD。
  • (备选)以 DVD 设备的形式虚拟安装映像文件。

有关上述选项的更多信息,请参阅 FAQ 页上的“What
are ISO image files and how do I use them?”(什么是 ISO 映像文件,我如何使用它们?)。


10-09-2012 0 条评论

作为Android应用开发者,不得不面对一个尴尬的局面,就是自己辛辛苦苦开发的应用可以被别人很轻易的就反编译出来。

Google似乎也发现了这个问题,从SDK2.3开始我们可以看到在android-sdk-windowstools下面多了一个proguard文件夹

proguard是一个java代码混淆的工具,通过proguard,别人即使反编译你的apk包,也只会看到一些让人很难看懂的代码,从而达到保护代码的作用。

下面具体说一说怎么样让SDK2.3下的proguard.cfg文件起作用,先来看看android-sdk-windowstoolslibproguard.cfg的内容:

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService

-keepclasseswithmembernames class * {
    native <methods>;
}

-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

从脚本中可以看到,混淆中保留了继承自Activity、Service、Application、BroadcastReceiver、ContentProvider等基本组件以及com.android.vending.licensing.ILicensingService,

并保留了所有的Native变量名及类名,所有类中部分以设定了固定参数格式的构造函数,枚举等等。(详细信息请参考<proguard_path>/examples中的例子及注释。)

让proguard.cfg起作用的做法很简单,就是在eclipse自动生成的default.properties文件中加上一句“proguard.config=proguard.cfg”就可以了

完整的default.properties文件应该如下:

# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system use,
# "build.properties", and override values to adapt the script to your
# project structure.

# Project target.
target=android-9
proguard.config=proguard.cfg

大功告成,正常的编译签名后就可以防止代码被反编译了。反编译经过代码混淆的apk得到的代码应该类似于下面的效果,是很难看懂的:


如果您使用的是2.3之前的SDK版本也没关系,把上面的proguard.cfg文件复制一份放到项目中,然后进行相同的操作即可

  • About Totoro

  • 近期文章

  • 2017年七月
    « 10月    
     1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031  
  • 分类目录

  • 近期评论

  • 标签

  • 功能

  • 友情链接