Android使用WebView打包网页成app

原生app的开发成本和网页相比相对较高,所以越来越多的app使用网页来作为界面,甚至完全将一个网站封装成app,可以提高开发速度,还能基本实现跨平台。

下面以Android为例,在ubuntu-14.04.4-desktop-amd64环境实现一个简单的WebView封装网站成app的过程。

 

环境准备

开发环境需要Java SDK(官网下载),Android SDK(官网下载)。

Java SDK安装

wget http://download.oracle.com/otn-pub/java/jdk/8u91-b14/jdk-8u91-linux-x64.tar.gz
tar -x -f
jdk-8u91-linux-x64.tar.gz

然后配置PATH路径及JAVA_HOME

vi ~/.bashrc

在最后添加

export JAVA_HOME=JDK解压目录export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/libexport PATH=$PATH:$JAVA_HOME/bin

 保存退出vi,刷新配置

source ~/.bashrc

Android SDK安装

ps:安装过程中可能需要梯子,请自备。

wget https://dl.google.com/android/android-sdk_r24.4.1-linux.tgztar -x -f android-sdk_r24.4.1-linux.tgzcd android-sdk-linux/tools

先看一下有哪些sdk版本可以安装

./android list sdk

然后安装需要的sdk版本

./android update sdk --no-ui --filter 用逗号分隔需要安装的序号

 

项目建立及代码编写

在任意地方新建一个目录,保存这个项目,然后新建一个src目录,用于存放源文件。因为Java有包的概念,所以进入src目录后,根据包名的层次,依次建立相应目录,然后新建Java源程序文件,比如:

复制代码
 1 package test.android; 2  3 import android.app.Activity; 4 import android.os.Bundle; 5 // import android.app.AlertDialog; 6 import android.view.Window; 7 // import android.view.WindowManager; 8 import android.view.KeyEvent; 9 import android.webkit.WebView;10 import android.webkit.WebViewClient;11 //import android.webkit.WebChromeClient;12 // import android.webkit.JsResult;13 // import android.content.DialogInterface;14 // import android.content.DialogInterface.OnClickListener;15 16 public class Main extends Activity {17 public static final String LOAD_URL = "http://www.baidu.com/";18 19 private WebView webView = null;20 21 public void onCreate(Bundle savedInstanceState) {22 super.onCreate(savedInstanceState);23 24 //this.requestWindowFeature(Window.FEATURE_NO_TITLE);25 //this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);26 27 webView = new WebView(this);28 this.setContentView(webView);29 webView.setWebViewClient(new WebViewClient() {30 public void onPageFinished(WebView view, String url) {31 //webView.evaluateJavascript("test();", null);32  }33  });34 /*35  webView.setWebChromeClient(new WebChromeClient() {36  public boolean onJsAlert(WebView view, String url, String message, JsResult result) {37 38  new AlertDialog.Builder(_this)39  .setMessage(message)40  .setPositiveButton("OK", new DialogInterface.OnClickListener() {41  public void onClick(DialogInterface dialog, int which) {}42  }).show();43 44  return true;45  }46  });47 */48 webView.getSettings().setJavaScriptEnabled(true);49 webView.addJavascriptInterface(this, "native");50  webView.loadUrl(LOAD_URL);51  }52 53 // overwrite back button54 public boolean onKeyDown(int keyCode, KeyEvent event) {55 if (KeyEvent.KEYCODE_BACK == keyCode && webView.canGoBack()) {56  webView.goBack();57 return true;58  }59 60 return super.onKeyDown(keyCode, event);61  }62 63 }
复制代码

 

将文件保存为Main.java

 

回到项目根目录,新建另一个文件,保存为AndroidManifest.xml,内容如下:

复制代码
 1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="test.android"> 3 <application android:icon="@drawable/icon" 4  android:label="@string/app_name"> 5 <activity android:name=".Main"> 6 <intent-filter> 7 <action android:name="android.intent.action.MAIN" /> 8 <category android:name="android.intent.category.LAUNCHER" /> 9 </intent-filter>10 </activity>11 </application>12 13 <uses-permission android:name="android.permission.INTERNET" />14 15 </manifest>
复制代码

 

在项目根目录新建res目录,在res内新建drawable和values目录。

在values内新建xml文件strings.xml,内容如下:

<?xml version="1.0" encoding="utf-8"?><resources> <string name="app_name">网页打包</string> <string name="web_url">http://www.baidu.com</string></resources>

然后将需要的程序图标拷入drawable目录,文件名为icon.png

 

演示示例可以从这里下载

 

编译

先切换到项目目录。

首先要编译资源,在项目根目录创建gen目录,保存生成的R.java资源编号,在控制台输入以下命令:

/opt/android-sdk-linux/build-tools/24.0.0/aapt package -f -m -J gen -S res -I /opt/android-sdk-linux/platforms/android-24/android.jar -M AndroidManifest.xml

编译java源文件时,加入R.java源文件:

javac -encoding utf-8 -source 1.6 -target 1.6 -bootclasspath /opt/android-sdk-linux/platforms/android-24/android.jar -d bin/classes src/test/android/Main.java gen/test/android/R.java

 将编译好的文件打包成dex格式

/opt/android-sdk-linux/build-tools/24.0.0/dx --dex --output=bin/classes.dex bin/classes

将资源文件打包

/opt/android-sdk-linux/build-tools/24.0.0/aapt package -f -M AndroidManifest.xml -S res -I /opt/android-sdk-linux/platforms/android-24/android.jar -F bin/main.ap_

将所有文件打包成apk

java -classpath /opt/android-sdk-linux/tools/lib/sdklib.jar com.android.sdklib.build.ApkBuilderMain main_unsigned.apk -v -u -z bin/main.ap_ -f bin/classes.dex -rf src

生成签名文件

1 keytool -genkey -alias my.keystore -keyalg RSA -validity 20000 -keypass 123456 -storepass 123456 -keystore my.keystore

生成签名文件时,提示输入姓名单位之类都可以直接回车忽略,最后输入y确认即可

对apk文件签名

jarsigner -verbose -keystore my.keystore -keypass 123456 -storepass 123456 -signedjar main.apk main_unsigned.apk my.keystore

接下来就可以安装测试了

mamicode_m_adload('8004');

评论(
0

mamicode_m_adload('8005');

mamicode_m_adload('9001');

© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!

var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?a85373af457b8da397da22f6a19bb587";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();

mamicode_m_adload('9002');

相关文章