环境准备开发环境需要JavaSDK(官网下载)_
原生app的开发成本相对于网页来说是比较高的,所以越来越多的app使用网页作为界面网页打包apk,甚至将一个网站完全封装成一个app,这样可以提高开发速度,基本实现跨平台。下面是一个例子天外神坛源码网,在-14.04.4--amd64环境下实现一个简单的将网站封装到app中的过程。
环境准备
开发环境需要Java SDK(官网下载)、SDK(官网下载)。
Java SDK 安装
<p><pre> <span style="color:#0000ff;">wget</span> http:<span style="color:#008000;">//</span><span style="color:#008000;">download.oracle.com/otn-pub/java/jdk/8u91-b14/jdk-8u91-linux-x64.tar.gz<br />tar -x -f </span>jdk-8u91-linux-x64.tar.gz</pre></p>
然后配置PATH路径和
<p><pre> <span style="color:#0000ff;">vi</span> ~/.bashrc</pre></p>
在末尾添加
<p><pre> export JAVA_HOME=<span style="color:#000000;">JDK解压目录
export CLASSPATH</span>=.:$CLASSPATH:$JAVA_HOME/<span style="color:#000000;">lib
export PATH</span>=$PATH:$JAVA_HOME/bin</pre></p>
保存退出vi,刷新配置
<p><pre> source ~/.bashrc</pre></p>
SDK 安装
ps:安装时可能需要梯子,请自备。
<p><pre> <span style="color:#0000ff;">wget</span> https:<span style="color:#008000;">//</span><span style="color:#008000;">dl.google.com/android/android-sdk_r24.4.1-linux.tgz</span>
<span style="color:#0000ff;">tar</span> -x -f android-sdk_r24.<span style="color:#800080;">4.1</span>-<span style="color:#000000;">linux.tgz
cd android</span>-sdk-linux/tools</pre></p>
我们来看看可以安装哪些sdk版本
<p><pre> ./android list sdk</pre></p>
然后安装需要的sdk版本
<p><pre> ./android update sdk --no-ui --filter 用逗号分隔需要安装的序号</pre></p>
项目创建和代码编写
在任何地方创建一个新目录,保存项目,然后创建一个新的 src 目录来存储源文件。因为Java有包的概念,进入src目录后,根据包名的高低依次创建对应的目录,然后新建一个Java源程序文件,如:
<p><pre> <span style="color:#008080;"> 1</span> <span style="color:#0000ff;">package</span><span style="color:#000000;"> test.android;
</span><span style="color:#008080;"> 2</span>
<span style="color:#008080;"> 3</span> <span style="color:#0000ff;">import</span><span style="color:#000000;"> android.app.Activity;
</span><span style="color:#008080;"> 4</span> <span style="color:#0000ff;">import</span><span style="color:#000000;"> android.os.Bundle;
</span><span style="color:#008080;"> 5</span> <span style="color:#008000;">//</span><span style="color:#008000;"> import android.app.AlertDialog;</span>
<span style="color:#008080;"> 6</span> <span style="color:#0000ff;">import</span><span style="color:#000000;"> android.view.Window;
</span><span style="color:#008080;"> 7</span> <span style="color:#008000;">//</span><span style="color:#008000;"> import android.view.WindowManager;</span>
<span style="color:#008080;"> 8</span> <span style="color:#0000ff;">import</span><span style="color:#000000;"> android.view.KeyEvent;
</span><span style="color:#008080;"> 9</span> <span style="color:#0000ff;">import</span><span style="color:#000000;"> android.webkit.WebView;
</span><span style="color:#008080;">10</span> <span style="color:#0000ff;">import</span><span style="color:#000000;"> android.webkit.WebViewClient;
</span><span style="color:#008080;">11</span> <span style="color:#008000;">//</span><span style="color:#008000;">import android.webkit.WebChromeClient;
</span><span style="color:#008080;">12</span> <span style="color:#008000;">//</span><span style="color:#008000;"> import android.webkit.JsResult;
</span><span style="color:#008080;">13</span> <span style="color:#008000;">//</span><span style="color:#008000;"> import android.content.DialogInterface;
</span><span style="color:#008080;">14</span> <span style="color:#008000;">//</span><span style="color:#008000;"> import android.content.DialogInterface.OnClickListener;</span>
<span style="color:#008080;">15</span>
<span style="color:#008080;">16</span> <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">class</span> Main <span style="color:#0000ff;">extends</span><span style="color:#000000;"> Activity {
</span><span style="color:#008080;">17</span> <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">final</span> String LOAD_URL = "http://www.baidu.com/"<span style="color:#000000;">;
</span><span style="color:#008080;">18</span>
<span style="color:#008080;">19</span> <span style="color:#0000ff;">private</span> WebView webView = <span style="color:#0000ff;">null</span><span style="color:#000000;">;
</span><span style="color:#008080;">20</span>
<span style="color:#008080;">21</span> <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">void</span><span style="color:#000000;"> onCreate(Bundle savedInstanceState) {
</span><span style="color:#008080;">22</span> <span style="color:#0000ff;">super</span><span style="color:#000000;">.onCreate(savedInstanceState);
</span><span style="color:#008080;">23</span>
<span style="color:#008080;">24</span> <span style="color:#008000;">//</span><span style="color:#008000;">this.requestWindowFeature(Window.FEATURE_NO_TITLE);
</span><span style="color:#008080;">25</span> <span style="color:#008000;">//</span><span style="color:#008000;">this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);</span>
<span style="color:#008080;">26</span>
<span style="color:#008080;">27</span> webView = <span style="color:#0000ff;">new</span> WebView(<span style="color:#0000ff;">this</span><span style="color:#000000;">);
</span><span style="color:#008080;">28</span> <span style="color:#0000ff;">this</span><span style="color:#000000;">.setContentView(webView);
</span><span style="color:#008080;">29</span> webView.setWebViewClient(<span style="color:#0000ff;">new</span><span style="color:#000000;"> WebViewClient() {
</span><span style="color:#008080;">30</span> <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">void</span><span style="color:#000000;"> onPageFinished(WebView view, String url) {
</span><span style="color:#008080;">31</span> <span style="color:#008000;">//</span><span style="color:#008000;">webView.evaluateJavascript("test();", null);</span>
<span style="color:#008080;">32</span> <span style="color:#000000;"> }
</span><span style="color:#008080;">33</span> <span style="color:#000000;"> });
</span><span style="color:#008080;">34</span> <span style="color:#008000;">/*</span>
<span style="color:#008080;">35</span> <span style="color:#008000;"> webView.setWebChromeClient(new WebChromeClient() {
</span><span style="color:#008080;">36</span> <span style="color:#008000;"> public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
</span><span style="color:#008080;">37</span>
<span style="color:#008080;">38</span> <span style="color:#008000;"> new AlertDialog.Builder(_this)
</span><span style="color:#008080;">39</span> <span style="color:#008000;"> .setMessage(message)
</span><span style="color:#008080;">40</span> <span style="color:#008000;"> .setPositiveButton("OK", new DialogInterface.OnClickListener() {
</span><span style="color:#008080;">41</span> <span style="color:#008000;"> public void onClick(DialogInterface dialog, int which) {}
</span><span style="color:#008080;">42</span> <span style="color:#008000;"> }).show();
</span><span style="color:#008080;">43</span>
<span style="color:#008080;">44</span> <span style="color:#008000;"> return true;
</span><span style="color:#008080;">45</span> <span style="color:#008000;"> }
</span><span style="color:#008080;">46</span> <span style="color:#008000;"> });
</span><span style="color:#008080;">47</span> <span style="color:#008000;">*/</span>
<span style="color:#008080;">48</span> webView.getSettings().setJavaScriptEnabled(<span style="color:#0000ff;">true</span><span style="color:#000000;">);
</span><span style="color:#008080;">49</span> webView.addJavascriptInterface(<span style="color:#0000ff;">this</span>, "native"<span style="color:#000000;">);
</span><span style="color:#008080;">50</span> <span style="color:#000000;"> webView.loadUrl(LOAD_URL);
</span><span style="color:#008080;">51</span> <span style="color:#000000;">}
</span><span style="color:#008080;">52</span>
<span style="color:#008080;">53</span> <span style="color:#008000;">//</span><span style="color:#008000;"> overwrite back button</span>
<span style="color:#008080;">54</span> <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">boolean</span> onKeyDown(<span style="color:#0000ff;">int</span><span style="color:#000000;"> keyCode, KeyEvent event) {
</span><span style="color:#008080;">55</span> <span style="color:#0000ff;">if</span> (KeyEvent.KEYCODE_BACK == keyCode &&<span style="color:#000000;"> webView.canGoBack()) {
</span><span style="color:#008080;">56</span> <span style="color:#000000;"> webView.goBack();
</span><span style="color:#008080;">57</span> <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">true</span><span style="color:#000000;">;
</span><span style="color:#008080;">58</span> <span style="color:#000000;"> }
</span><span style="color:#008080;">59</span>
<span style="color:#008080;">60</span> <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">super</span><span style="color:#000000;">.onKeyDown(keyCode, event);
</span><span style="color:#008080;">61</span> <span style="color:#000000;">}
</span><span style="color:#008080;">62</span>
<span style="color:#008080;">63</span> }</pre></p>
将文件另存为 Main.java
回到项目根目录,新建一个文件,保存为.xml,内容如下:
http://tt.ccoox.cn/data/attachment/forum/20220305/1646492483106_4.jpg
<p><pre> <span style="color:#008080;"> 1</span> <span style="color:#0000ff;"><?</span><span style="color:#ff00ff;">xml version="1.0" encoding="utf-8"</span><span style="color:#0000ff;">?></span>
<span style="color:#008080;"> 2</span> <span style="color:#0000ff;"><</span><span style="color:#800000;">manifest</span><span style="color:#ff0000;">xmlns:android</span><span style="color:#0000ff;">="http://schemas.android.com/apk/res/android"</span><span style="color:#ff0000;"> package</span><span style="color:#0000ff;">="test.android"</span><span style="color:#0000ff;">></span>
<span style="color:#008080;"> 3</span> <span style="color:#0000ff;"><</span><span style="color:#800000;">application </span><span style="color:#ff0000;">android:icon</span><span style="color:#0000ff;">="@drawable/icon"</span>
<span style="color:#008080;"> 4</span> <span style="color:#ff0000;"> android:label</span><span style="color:#0000ff;">="@string/app_name"</span><span style="color:#0000ff;">></span>
<span style="color:#008080;"> 5</span> <span style="color:#0000ff;"><</span><span style="color:#800000;">activity </span><span style="color:#ff0000;">android:name</span><span style="color:#0000ff;">=".Main"</span><span style="color:#0000ff;">></span>
<span style="color:#008080;"> 6</span> <span style="color:#0000ff;"><</span><span style="color:#800000;">intent-filter</span><span style="color:#0000ff;">></span>
<span style="color:#008080;"> 7</span> <span style="color:#0000ff;"><</span><span style="color:#800000;">action </span><span style="color:#ff0000;">android:name</span><span style="color:#0000ff;">="android.intent.action.MAIN"</span> <span style="color:#0000ff;">/></span>
<span style="color:#008080;"> 8</span> <span style="color:#0000ff;"><</span><span style="color:#800000;">category </span><span style="color:#ff0000;">android:name</span><span style="color:#0000ff;">="android.intent.category.LAUNCHER"</span> <span style="color:#0000ff;">/></span>
<span style="color:#008080;"> 9</span> <span style="color:#0000ff;"></</span><span style="color:#800000;">intent-filter</span><span style="color:#0000ff;">></span>
<span style="color:#008080;">10</span> <span style="color:#0000ff;"></</span><span style="color:#800000;">activity</span><span style="color:#0000ff;">></span>
<span style="color:#008080;">11</span> <span style="color:#0000ff;"></</span><span style="color:#800000;">application</span><span style="color:#0000ff;">></span>
<span style="color:#008080;">12</span>
<span style="color:#008080;">13</span> <span style="color:#0000ff;"><</span><span style="color:#800000;">uses-permission </span><span style="color:#ff0000;">android:name</span><span style="color:#0000ff;">="android.permission.INTERNET"</span> <span style="color:#0000ff;">/></span>
<span style="color:#008080;">14</span>
<span style="color:#008080;">15</span> <span style="color:#0000ff;"></</span><span style="color:#800000;">manifest</span><span style="color:#0000ff;">></span></pre></p>
在项目根目录下创建res目录,在res中新建目录
新建一个xml file.xml,内容如下:
<p><pre> <span style="color:#0000ff;"><?</span><span style="color:#ff00ff;">xml version="1.0" encoding="utf-8"</span><span style="color:#0000ff;">?></span>
<span style="color:#0000ff;"><</span><span style="color:#800000;">resources</span><span style="color:#0000ff;">></span>
<span style="color:#0000ff;"><</span><span style="color:#800000;">string </span><span style="color:#ff0000;">name</span><span style="color:#0000ff;">="app_name"</span><span style="color:#0000ff;">>网页打包</span><span style="color:#0000ff;"></</span><span style="color:#800000;">string</span><span style="color:#0000ff;">></span>
<span style="color:#0000ff;"><</span><span style="color:#800000;">string </span><span style="color:#ff0000;">name</span><span style="color:#0000ff;">="web_url"</span><span style="color:#0000ff;">></span>http://www.baidu.com<span style="color:#0000ff;"></</span><span style="color:#800000;">string</span><span style="color:#0000ff;">></span>
<span style="color:#0000ff;"></</span><span style="color:#800000;">resources</span><span style="color:#0000ff;">></span></pre></p>
然后将需要的程序图标复制到目录中,文件名为icon.png
演示示例可以在这里下载
编译
先切换到项目目录
首先编译资源,在项目根目录下创建一个gen目录,保存生成的R.java资源号,在控制台输入如下命令:
<p><pre> /opt/android-sdk-linux/build-tools/<span style="color:#800080;">24.0</span>.<span style="color:#800080;">0</span>/aapt package -f -m -J gen -S res -I /opt/android-sdk-linux/platforms/android-<span style="color:#800080;">24</span>/android.jar -M AndroidManifest.xml</pre></p>
编译java源文件时,添加R.java源文件:
<p><pre> 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</pre></p>
将编译好的文件打包成dex格式
<p><pre> /opt/android-sdk-linux/build-tools/24.0.0/dx --dex --output=bin/classes.dex bin/classes</pre></p>
http://tt.ccoox.cn/data/attachment/forum/20220305/1646492483106_8.png
打包资源文件
<p><pre> /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_</pre></p>
将所有文件打包成apk
<p><pre> 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</pre></p>
生成签名文件
<p><pre> 1 keytool -genkey -alias my.keystore -keyalg RSA -validity 20000 -keypass 123456 -storepass 123456 -keystore my.keystore</pre></p>
生成签名文件时,如果提示输入名称或单位网页打包apk,直接回车忽略即可,最后输入y确认。
签署apk文件
<p><pre> jarsigner -verbose -keystore my.keystore -keypass 123456 -storepass 123456 -signedjar main.apk main_unsigned.apk my.keystore</pre></p>
然后就可以安装测试了
页:
[1]