星期五, 七月 19, 2013

如何修改Android Studio 字体

Android Studio 字体默认读取JVM的默认字体。
在Window Xp下非常难看。

通过Android Stuido 菜单File/Setting..../搜索 font,建立自己的Scheme,确定保存即可

星期三, 七月 17, 2013

Gradle gui

gradle --gui 弹出GUI窗口。

星期五, 七月 05, 2013

Android Studio gradle plugin 帮助手册

Android Tools Project Site


这里比较全的包含了gradle task.

如何在build.gradle在最后打包的apk里加入JNI的库

如何生成jni库,不赘述,需要修改build.gradle加入如下语句即可:
 不过注意此脚本适合:'com.android.tools.build:gradle:0.4版本,其后的版本可能默认加入JNI打包的步骤:

tasks.withType(Compile) { compileTask -> compileTask.dependsOn copyNativeLibs }
tasks.withType(com.android.build.gradle.tasks.PackageApplication) { pkgTask ->pkgTask.jniDir new File(buildDir, 'native-libs')

task copyNativeLibs(type: Copy) {
    println 'call copyNativeLibs'
    from fileTree(dir: 'libs', include: '**/*.so' )
    into 'build/native-libs'
}

build.gradle加入自己的签名文件。

如何生成签名文件不赘述。
build.gradle 加入如下语句即可:
android {
    compileSdkVersion 10
    buildToolsVersion "17.0.0"

    signingConfigs  {
        debug{
        storeFile = file("D:\\eclipse workspace\\dbball-cn\\dbball-cn\\release.keystore")
        keyAlias = "sunose"
        storePassword = "sunose"
        keyPassword = "sunose"
        }
        release{
            storeFile = file("D:\\eclipse workspace\\dbball-cn\\dbball-cn\\release.keystore")
            keyAlias = "sunose"
            storePassword = "sunose"
            keyPassword = "sunose"
        }
    }

注意如何发布运行测试的时候出现:INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES
错误,是由于以前的版本已经安装使用了不同签名,只要删除掉该app
从新发布即可。

Java Double Brace Initialization

常用语Java Collect类的初始化,因为Java没有提供简易的初始化Collect的方法。
Set<String> flavors = new HashSet<String>() {{      add("vanilla");      add("strawberry");      add("chocolate");      add("butter pecan");  }};

The first brace creates a new AnonymousInnerClass,
the second declares an instance initializer block that is run when the anonymous inner class is instantiated.

 add(new JPanel() {{  	setLayout(...);  	setBorder(...);  	add(new JLabel(...));  	add(new JSpinner(...));   }});

星期四, 七月 04, 2013

Android Studio操作说明:INSTALL_PARSE_FAILED_NO_CERTIFICATES

有两个生成最终app的模式:一个是testing/debuggging debug模式,
另外一个是release 模式,rease模式必须要自己签名。debug模式则声称
一个debug.store的签名用于调试。

生成自己的签名app在菜单build/generate signed APK....就可以了。

星期三, 七月 03, 2013

如何得到当前使用的Grovvy的版本。

2.0之后可以用如下方法:
println groovy.lang.GroovySystem.getVersion()

星期六, 六月 29, 2013

如何更新Android studio to 0.1.8

Help 菜单 Check for update...
在中国大陆 dl-sdk.appspot.com 这个地址被封闭了。
所以要不修改hosts或者使用VPN来更新

星期六, 六月 15, 2013

Android ListView如何避免全部选中情况下的背景变色问题?

选中一个Item然后向上或向下拖拉,则出现全部变白色背景问题,如图

纠正也很简单,只要在xml中的ListView中加入:
        android:cacheColorHint="@android:color/transparent"
即可。

星期四, 六月 13, 2013

如何用windump或者tcpdump得到http request url?

tcpdump或者 windump -i 1 -A -s 1492 dst port 80



星期三, 六月 12, 2013

如何从Eclipse ADT 转换到Google Android Studio

前提:
Google 推荐使用gradle代替maven 来管理项目。
1.所以,首先必须在Eclipse 里使用export然后在项目里选择
生成 gradle script 文件
 注意:必须用android sdk 更新SDK 到最新的22及以后才可以使用这个功能,
同样Eclipse ADT plugin 也必须在SDK 升级后,升级到最新的版本。

2.android studio 默认使用自己携带的Android SDK,所以,可能出现错误:


这个时候就要先修改Android Stuio默认使用的Android SDK.
从android快速启动UI里:
选择 Configure->Project Defaults-> Project Structure.在左面的面板里选择设置Android SDKs

星期三, 六月 05, 2013

ADT emulator-5554 disconnected! 错误纠正

在命令行使用adb kill-server,adb start-server即可
然后再Eclipse里打开 devices view,刷新即可看到emulator,
然后就可以run Android application 了。

而不是又重新开启一个新的emuluator.

星期五, 五月 17, 2013

星期三, 五月 08, 2013

如何使用adb shell 执行多个命令或者执行需要root权限的命令。

adb shell "dumpsys meminfo |grep tencent"

秘诀,必须用双引号将命令扩起来“
不同的命令用分号;隔开。
比如:
adb shell "ls  ;ps "

则顺序执行ls和ps -ef命令了。

星期一, 四月 29, 2013

download antrl 3.2

Open JPA

2.openjpa编译及enhance需要antlr,具体的版本可以example里例子里目录下查看build.properties里的antlr.version=3.2
3.下载antlr ,http://www.antlr.org/download.html,如果不是最新的版本,可以从 https://github.com/antlr/ 目录里寻找具体的版本下载,
你需要:antlr-runtime-3.2.jar和antlr-3.2.jar两个.jar文件。
4.修改build.properties,修改对应的openjpa和antlr lib目录。
5.修改build.xml 对应的ant 脚本 property指向具体的jpa lib和antlr lib
6.运行ant build.xml开始编译例子程序。




星期三, 四月 10, 2013

git for window 如何保存提交到code.google.com的用户名及密码

首先在window %HOME%变量制定的目录下建立_netrc文件,
注意是_netrc不是.netrc或者netrc.
可以在window cmd下使用echo %HOME%看到具体的目录。
_netrc文件里放入一下字符串即可:
machine code.google.com login yourRealEmail@gmail.com password  xxxxx

然后使用:
git add *
git commit -m "commit source code by....."
git push


星期二, 四月 09, 2013

如何在 window 下手动建立GIT project在code.google.com上

git init

 git add *

 git commit -m "initial project version"

 git remote add master https://code.google.com/p/myproject/

 git push master  --all

星期二, 四月 02, 2013

编写自己的Wrapper Class

   编写自己的Wrapper Class
A URL Connection to a Java ARchive (JAR) file or an entry in a JAR file.
The syntax of a JAR URL is:
jar:<url>!/{entry}

参考: java.net.JarURLConnection
http://java.sun.com/j2se/1.4.2/docs/api/java/net/JarURLConnection.html

目的:要解决在可执行Jar文件中使用包含在其他地方的Jar文件中的class.

初级方法:使用Java extension机制,通过编写启动脚本来解决问题:
  把第三方的Jar Library复制到{java home}\jre\lib\ext 目录下
或使用java ?Xbootclasspath 命令行参数:

    -Xbootclasspath:<directories and zip/jar files separated by ;>
                      set search path for bootstrap classes and resources
    -Xbootclasspath/a:<directories and zip/jar files separated by ;>
                      append to end of bootstrap class path
-Xbootclasspath/p:<directories and zip/jar files separated by ;>

大多数的Java 应用服务器都使用了制作启动脚本的方法.
例子: 脚本run.bat 可以参看Jboss Application的run.bat或run.sh脚本

中级方法: 利用Jar 扩展机制规范,通过制作安装包来解决问题.
   利用Jar包扩展(extension)机制通过Manifest Specification 来编写
参考: http://java.sun.com/j2se/1.4.2/docs/guide/jar/jar.html
利用META-INF/MANIFEST.MF文件中的Class-Path:来指定需要引用的第三包,
将需要的第三方包放到在Class-Path:指定的目录下,然后把主程序jar包和第三包
制作安装包,在安装的时候按照目录结构安装。然后SystemClassLoader(sun.misc.Launcher)
自动加载

高级方法,编写自己的Container类或bootStrap Wrapper类.
思路:实现一个Custom ClassLoader-系统类java.开头的类让SysemClassLoader来载入,
  其他的类用CustomClassLoader读取给出的Jar Library 包来实现.
最终实现 Class.forName(String name)自动使用Custom ClassLoader来寻找和加载class.

这里需要介绍一些Java ClassLoader的一些限制的知识,ClassLoader的详细原理,可以参看
其他相关介绍.
Hack Java:
强行设置系统默认的ClassLoader,有作用吗?No
Field tclass = ClassLoader.class.getDeclaredField("scl");
tclass.setAccessible(true);
tclass.set(null,Mydefault);

JVM的 SystemClassLoader是 sun.misc.Luncher的实例,这里面包含native的本地方法,
其中工作算法不得而之,JVM唯一给我们留下的扩展机制就是改变ContextClassLoader来实现
JVM的ClassLoader委托模式(delegation mode).

  详细介绍:
Custom ClassLoader代码
/**
* Don't Reinvent wheel
* 使用 URLClassLoader 来载入Jar Library
*
*/

import java.io.InputStream;
import java.io.File;
import java.net.URLClassLoader;
import java.util.*;
import java.net.URL;

public class myClassLoaderByURL extends java.lang.ClassLoader
{
static java.net.URL _url=null;
static String libpath=null;
public static  myClassLoaderByURL defaultld=null;

public myClassLoaderByURL(String liburl,ClassLoader parent) throws Exception
{
     super(parent);
  if(!checkJar(liburl))
   {
  throw new java.lang.RuntimeException("Jar File "+liburl+" not exist");        
        }
     try
     {
     _url = new  URL("jar:file:/"+liburl+"!/");
}catch(Exception e)
{
     e.printStackTrace();
     }
}
protected  Class findClass(String name) throws ClassNotFoundException
{
Class speClass=null;
try
{
     speClass = getParent().loadClass(name );
     System.out.println("myClassLoaderByURL Msg: parent CLD find Class............"+name);
} catch( ClassNotFoundException cnfe )
   {
  try
  {
String rname = name;
rname = rname.replace ('.', '/') + ".class";//重要,必须还原为目录格式
  System.out.println("myClassLoaderByURL Msg: Option jar Lib:"+_url.toExternalForm());
  System.out.println("myClassLoaderByURL Msg: find class name:"+rname);
  URLClassLoader ucld = new URLClassLoader(new URL[]{_url},myClassLoaderByURL.class.getClassLoader());
  InputStream is = ucld.getResourceAsStream(rname);
if(is==null)
{
  throw new ClassNotFoundException(" Can't Find Specified Class:"+name);
}
int size=is.available();

byte[] b = new byte[size];
is.read(b,0,size);
is.close();
     speClass = defineClass(name,b,0,b.length);

}catch(Exception ioe)
{
     ioe.printStackTrace();
     throw new ClassNotFoundException();
}
}catch(Exception ce)
{
     ce.printStackTrace();
     throw new ClassNotFoundException();
}
System.out.println("myClassLoaderByURL Msg: ok,load success");

return speClass;
}

public Class loadClass( String pClassName, boolean pResolve ) throws ClassNotFoundException {
       System.out.println("myClassLoaderByURL Msg:loadClass(), resolve: " + pResolve );
       Class lClass = findLoadedClass( pClassName );
       lClass  = findClass( pClassName );


       //ResolveClass.
       try {
           if( pResolve ) {
               System.out.println("myClassLoaderByURL Msg:resolve class: " + lClass );
               resolveClass( lClass );
           }
       } catch (Error e) {
           e.printStackTrace();
           throw e;
       }
       return lClass;
   }
public Class loadClass( String pClassName) throws ClassNotFoundException
{
     Class t =loadClass(pClassName,true);
     return t;
}

private boolean checkJar(String jarfile)
{
     System.out.println("myClassLoaderByURL Msg: checkJar:"+jarfile);
     File jarf = new File(jarfile);
     try
     {
     System.out.println(jarf.getCanonicalFile());
}catch(Exception ee)
{
     }
     return jarf.exists();
}
}

编写自己的Boot Wrapper类:

import java.io.*;
import java.util.zip.*;
import java.util.jar.*;
import java.net.URLClassLoader;
import java.net.URL;
import java.lang.reflect.Method;

public class testClassLoaderByURL extends java.lang.Thread
{
static myClassLoaderByURL Mydefault;
static String JarLibraryPath="";
static String executedClass = "";
public static void main(String[] args) throws Exception
{
if(args.length <2)
{
     System.out.println("Syntax testClassLoaderByURL /path/xx.jar Executable class name(include main method");
     System.out.println("Example: java testClassLoaderByURL c:\\temp\\test.jar org.sun.go");
     System.exit(0);
}
JarLibraryPath=args[0];
executedClass = args[1];
//here can verified parameter

System.out.println("Jar is:"+JarLibraryPath+", Class is:"+executedClass);
System.out.println("Begin Load");
Mydefault = new myClassLoaderByURL(JarLibraryPath,testClassLoader.class.getClassLoader());
myClassLoaderByURL.defaultld = Mydefault;

      Thread.currentThread().setContextClassLoader(Mydefault);
     
         Class cls = Mydefault.loadClass(executedClass);//重要.
         Method main = cls.getMethod("main", new Class[]{String[].class});
         main.invoke(cls, new Object[]{args});


}
}